1use reifydb_value::{
5 reifydb_assertions,
6 value::{
7 Value,
8 date::Date,
9 datetime::DateTime,
10 duration::Duration,
11 identity::IdentityId,
12 ordered_f32::OrderedF32,
13 ordered_f64::OrderedF64,
14 time::Time,
15 uuid::{Uuid4, Uuid7},
16 value_type::ValueType,
17 },
18};
19
20use super::RowShape;
21use crate::row::bytes::RowBuilder;
22
23impl RowShape {
24 pub fn set_values(&self, row: &mut impl RowBuilder, values: &[Value]) {
25 reifydb_assertions! {
26 assert!(values.len() == self.fields().len());
27 }
28 for (idx, value) in values.iter().enumerate() {
29 self.set_value(row, idx, value)
30 }
31 }
32
33 pub fn set_value(&self, row: &mut impl RowBuilder, index: usize, val: &Value) {
34 let field = &self.fields()[index];
35 reifydb_assertions! {
36 assert!(
37 row.len() >= self.total_static_size(),
38 "row/shape size mismatch: row.len()={} < total_static_size()={}",
39 row.len(),
40 self.total_static_size()
41 );
42 }
43
44 let field_type = match field.constraint.get_type() {
45 ValueType::Option(inner) => *inner,
46 other => other,
47 };
48
49 match (field_type, val) {
50 (ValueType::Boolean, Value::Boolean(v)) => self.set::<bool>(row, index, *v),
51 (
52 ValueType::Boolean,
53 Value::None {
54 ..
55 },
56 ) => self.set_none(row, index),
57
58 (ValueType::Float4, Value::Float4(v)) => self.set::<f32>(row, index, v.value()),
59 (
60 ValueType::Float4,
61 Value::None {
62 ..
63 },
64 ) => self.set_none(row, index),
65
66 (ValueType::Float8, Value::Float8(v)) => self.set::<f64>(row, index, v.value()),
67 (
68 ValueType::Float8,
69 Value::None {
70 ..
71 },
72 ) => self.set_none(row, index),
73
74 (ValueType::Int1, Value::Int1(v)) => self.set::<i8>(row, index, *v),
75 (
76 ValueType::Int1,
77 Value::None {
78 ..
79 },
80 ) => self.set_none(row, index),
81
82 (ValueType::Int2, Value::Int2(v)) => self.set::<i16>(row, index, *v),
83 (
84 ValueType::Int2,
85 Value::None {
86 ..
87 },
88 ) => self.set_none(row, index),
89
90 (ValueType::Int4, Value::Int4(v)) => self.set::<i32>(row, index, *v),
91 (
92 ValueType::Int4,
93 Value::None {
94 ..
95 },
96 ) => self.set_none(row, index),
97
98 (ValueType::Int8, Value::Int8(v)) => self.set::<i64>(row, index, *v),
99 (
100 ValueType::Int8,
101 Value::None {
102 ..
103 },
104 ) => self.set_none(row, index),
105
106 (ValueType::Int16, Value::Int16(v)) => self.set::<i128>(row, index, *v),
107 (
108 ValueType::Int16,
109 Value::None {
110 ..
111 },
112 ) => self.set_none(row, index),
113
114 (ValueType::Utf8, Value::Utf8(v)) => self.set_utf8(row, index, v),
115 (
116 ValueType::Utf8,
117 Value::None {
118 ..
119 },
120 ) => self.set_none(row, index),
121
122 (ValueType::Uint1, Value::Uint1(v)) => self.set::<u8>(row, index, *v),
123 (
124 ValueType::Uint1,
125 Value::None {
126 ..
127 },
128 ) => self.set_none(row, index),
129
130 (ValueType::Uint2, Value::Uint2(v)) => self.set::<u16>(row, index, *v),
131 (
132 ValueType::Uint2,
133 Value::None {
134 ..
135 },
136 ) => self.set_none(row, index),
137
138 (ValueType::Uint4, Value::Uint4(v)) => self.set::<u32>(row, index, *v),
139 (
140 ValueType::Uint4,
141 Value::None {
142 ..
143 },
144 ) => self.set_none(row, index),
145
146 (ValueType::Uint8, Value::Uint8(v)) => self.set::<u64>(row, index, *v),
147 (
148 ValueType::Uint8,
149 Value::None {
150 ..
151 },
152 ) => self.set_none(row, index),
153
154 (ValueType::Uint16, Value::Uint16(v)) => self.set::<u128>(row, index, *v),
155 (
156 ValueType::Uint16,
157 Value::None {
158 ..
159 },
160 ) => self.set_none(row, index),
161
162 (ValueType::Date, Value::Date(v)) => self.set::<Date>(row, index, *v),
163 (
164 ValueType::Date,
165 Value::None {
166 ..
167 },
168 ) => self.set_none(row, index),
169
170 (ValueType::DateTime, Value::DateTime(v)) => self.set::<DateTime>(row, index, *v),
171 (
172 ValueType::DateTime,
173 Value::None {
174 ..
175 },
176 ) => self.set_none(row, index),
177
178 (ValueType::Time, Value::Time(v)) => self.set::<Time>(row, index, *v),
179 (
180 ValueType::Time,
181 Value::None {
182 ..
183 },
184 ) => self.set_none(row, index),
185
186 (ValueType::Duration, Value::Duration(v)) => self.set::<Duration>(row, index, *v),
187 (
188 ValueType::Duration,
189 Value::None {
190 ..
191 },
192 ) => self.set_none(row, index),
193
194 (ValueType::Uuid4, Value::Uuid4(v)) => self.set::<Uuid4>(row, index, *v),
195 (
196 ValueType::Uuid4,
197 Value::None {
198 ..
199 },
200 ) => self.set_none(row, index),
201
202 (ValueType::Uuid7, Value::Uuid7(v)) => self.set::<Uuid7>(row, index, *v),
203 (
204 ValueType::Uuid7,
205 Value::None {
206 ..
207 },
208 ) => self.set_none(row, index),
209
210 (ValueType::Blob, Value::Blob(v)) => self.set_blob(row, index, v),
211 (
212 ValueType::Blob,
213 Value::None {
214 ..
215 },
216 ) => self.set_none(row, index),
217
218 (ValueType::Int, Value::Int(v)) => self.set_int(row, index, v),
219 (ValueType::Uint, Value::Uint(v)) => self.set_uint(row, index, v),
220 (
221 ValueType::Int,
222 Value::None {
223 ..
224 },
225 ) => self.set_none(row, index),
226 (
227 ValueType::Uint,
228 Value::None {
229 ..
230 },
231 ) => self.set_none(row, index),
232
233 (ValueType::Decimal, Value::Decimal(v)) => self.set_decimal(row, index, v),
234 (
235 ValueType::Decimal,
236 Value::None {
237 ..
238 },
239 ) => self.set_none(row, index),
240 (ValueType::DictionaryId, Value::DictionaryId(id)) => self.set_dictionary_id(row, index, id),
241
242 (
243 ValueType::DictionaryId,
244 Value::None {
245 ..
246 },
247 ) => self.set_none(row, index),
248
249 (ValueType::IdentityId, Value::IdentityId(id)) => self.set::<IdentityId>(row, index, *id),
250 (
251 ValueType::IdentityId,
252 Value::None {
253 ..
254 },
255 ) => self.set_none(row, index),
256
257 (
258 ValueType::Any,
259 Value::None {
260 ..
261 },
262 ) => self.set_none(row, index),
263 (ValueType::Any, Value::Any(inner)) => self.set_any(row, index, inner),
264 (ty, val) => unreachable!(
265 "set_value type mismatch at index {index}: column name={:?} declared_type={ty:?}, value={val:?}",
266 field.name,
267 ),
268 }
269 }
270
271 pub fn get_value(&self, row: &[u8], index: usize) -> Value {
272 let field = &self.fields()[index];
273 if !self.is_defined(row, index) {
274 return Value::none();
275 }
276 let field_type = match field.constraint.get_type() {
277 ValueType::Option(inner) => *inner,
278 other => other,
279 };
280
281 match field_type {
282 ValueType::Boolean => Value::Boolean(self.get::<bool>(row, index)),
283 ValueType::Float4 => OrderedF32::try_from(self.get::<f32>(row, index))
284 .map(Value::Float4)
285 .unwrap_or(Value::none()),
286 ValueType::Float8 => OrderedF64::try_from(self.get::<f64>(row, index))
287 .map(Value::Float8)
288 .unwrap_or(Value::none()),
289 ValueType::Int1 => Value::Int1(self.get::<i8>(row, index)),
290 ValueType::Int2 => Value::Int2(self.get::<i16>(row, index)),
291 ValueType::Int4 => Value::Int4(self.get::<i32>(row, index)),
292 ValueType::Int8 => Value::Int8(self.get::<i64>(row, index)),
293 ValueType::Int16 => Value::Int16(self.get::<i128>(row, index)),
294 ValueType::Utf8 => Value::Utf8(self.get_utf8(row, index).to_string()),
295 ValueType::Uint1 => Value::Uint1(self.get::<u8>(row, index)),
296 ValueType::Uint2 => Value::Uint2(self.get::<u16>(row, index)),
297 ValueType::Uint4 => Value::Uint4(self.get::<u32>(row, index)),
298 ValueType::Uint8 => Value::Uint8(self.get::<u64>(row, index)),
299 ValueType::Uint16 => Value::Uint16(self.get::<u128>(row, index)),
300 ValueType::Date => Value::Date(self.get::<Date>(row, index)),
301 ValueType::DateTime => Value::DateTime(self.get::<DateTime>(row, index)),
302 ValueType::Time => Value::Time(self.get::<Time>(row, index)),
303 ValueType::Duration => Value::Duration(self.get::<Duration>(row, index)),
304 ValueType::IdentityId => Value::IdentityId(self.get::<IdentityId>(row, index)),
305 ValueType::Uuid4 => Value::Uuid4(self.get::<Uuid4>(row, index)),
306 ValueType::Uuid7 => Value::Uuid7(self.get::<Uuid7>(row, index)),
307 ValueType::Blob => Value::Blob(self.get_blob(row, index)),
308 ValueType::Int => Value::Int(self.get_int(row, index)),
309 ValueType::Uint => Value::Uint(self.get_uint(row, index)),
310 ValueType::Decimal => Value::Decimal(self.get_decimal(row, index)),
311 ValueType::DictionaryId => Value::DictionaryId(self.get_dictionary_id(row, index)),
312 ValueType::Option(_) => unreachable!("Option type already unwrapped"),
313 ValueType::Any => Value::Any(Box::new(self.get_any(row, index))),
314 ValueType::List(_) => unreachable!("List type cannot be stored in database"),
315 ValueType::Record(_) => unreachable!("Record type cannot be stored in database"),
316 ValueType::Tuple(_) => unreachable!("Tuple type cannot be stored in database"),
317 }
318 }
319}