Skip to main content

reifydb_codec/row/shape/
values.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}