Skip to main content

reifydb_value/value/frame/
data.rs

1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 ReifyDB
3
4use serde::{Deserialize, Serialize};
5
6use crate::{
7	storage::DataBitVec,
8	util::{
9		bitvec::BitVec,
10		float_format::{format_f32, format_f64},
11	},
12	value::{
13		Value,
14		container::{
15			any::AnyContainer, blob::BlobContainer, bool::BoolContainer, dictionary::DictionaryContainer,
16			identity_id::IdentityIdContainer, number::NumberContainer, temporal::TemporalContainer,
17			utf8::Utf8Container, uuid::UuidContainer,
18		},
19		date::Date,
20		datetime::DateTime,
21		decimal::Decimal,
22		duration::Duration,
23		int::Int,
24		time::Time,
25		uint::Uint,
26		uuid::{Uuid4, Uuid7},
27		value_type::ValueType,
28	},
29};
30
31#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
32pub enum FrameColumnData {
33	Bool(BoolContainer),
34	Float4(NumberContainer<f32>),
35	Float8(NumberContainer<f64>),
36	Int1(NumberContainer<i8>),
37	Int2(NumberContainer<i16>),
38	Int4(NumberContainer<i32>),
39	Int8(NumberContainer<i64>),
40	Int16(NumberContainer<i128>),
41	Uint1(NumberContainer<u8>),
42	Uint2(NumberContainer<u16>),
43	Uint4(NumberContainer<u32>),
44	Uint8(NumberContainer<u64>),
45	Uint16(NumberContainer<u128>),
46	Utf8(Utf8Container),
47	Date(TemporalContainer<Date>),
48	DateTime(TemporalContainer<DateTime>),
49	Time(TemporalContainer<Time>),
50	Duration(TemporalContainer<Duration>),
51	IdentityId(IdentityIdContainer),
52	Uuid4(UuidContainer<Uuid4>),
53	Uuid7(UuidContainer<Uuid7>),
54	Blob(BlobContainer),
55	Int(NumberContainer<Int>),
56	Uint(NumberContainer<Uint>),
57	Decimal(NumberContainer<Decimal>),
58	Any(AnyContainer),
59	DictionaryId(DictionaryContainer),
60
61	Option {
62		inner: Box<FrameColumnData>,
63		bitvec: BitVec,
64	},
65}
66
67impl FrameColumnData {
68	pub fn get_type(&self) -> ValueType {
69		match self {
70			FrameColumnData::Bool(_) => ValueType::Boolean,
71			FrameColumnData::Float4(_) => ValueType::Float4,
72			FrameColumnData::Float8(_) => ValueType::Float8,
73			FrameColumnData::Int1(_) => ValueType::Int1,
74			FrameColumnData::Int2(_) => ValueType::Int2,
75			FrameColumnData::Int4(_) => ValueType::Int4,
76			FrameColumnData::Int8(_) => ValueType::Int8,
77			FrameColumnData::Int16(_) => ValueType::Int16,
78			FrameColumnData::Uint1(_) => ValueType::Uint1,
79			FrameColumnData::Uint2(_) => ValueType::Uint2,
80			FrameColumnData::Uint4(_) => ValueType::Uint4,
81			FrameColumnData::Uint8(_) => ValueType::Uint8,
82			FrameColumnData::Uint16(_) => ValueType::Uint16,
83			FrameColumnData::Utf8(_) => ValueType::Utf8,
84			FrameColumnData::Date(_) => ValueType::Date,
85			FrameColumnData::DateTime(_) => ValueType::DateTime,
86			FrameColumnData::Time(_) => ValueType::Time,
87			FrameColumnData::Duration(_) => ValueType::Duration,
88			FrameColumnData::IdentityId(_) => ValueType::IdentityId,
89			FrameColumnData::Uuid4(_) => ValueType::Uuid4,
90			FrameColumnData::Uuid7(_) => ValueType::Uuid7,
91			FrameColumnData::Blob(_) => ValueType::Blob,
92			FrameColumnData::Int(_) => ValueType::Int,
93			FrameColumnData::Uint(_) => ValueType::Uint,
94			FrameColumnData::Decimal(_) => ValueType::Decimal,
95			FrameColumnData::Any(_) => ValueType::Any,
96			FrameColumnData::DictionaryId(_) => ValueType::DictionaryId,
97			FrameColumnData::Option {
98				inner,
99				..
100			} => ValueType::Option(Box::new(inner.get_type())),
101		}
102	}
103
104	pub fn is_defined(&self, idx: usize) -> bool {
105		match self {
106			FrameColumnData::Bool(container) => container.is_defined(idx),
107			FrameColumnData::Float4(container) => container.is_defined(idx),
108			FrameColumnData::Float8(container) => container.is_defined(idx),
109			FrameColumnData::Int1(container) => container.is_defined(idx),
110			FrameColumnData::Int2(container) => container.is_defined(idx),
111			FrameColumnData::Int4(container) => container.is_defined(idx),
112			FrameColumnData::Int8(container) => container.is_defined(idx),
113			FrameColumnData::Int16(container) => container.is_defined(idx),
114			FrameColumnData::Uint1(container) => container.is_defined(idx),
115			FrameColumnData::Uint2(container) => container.is_defined(idx),
116			FrameColumnData::Uint4(container) => container.is_defined(idx),
117			FrameColumnData::Uint8(container) => container.is_defined(idx),
118			FrameColumnData::Uint16(container) => container.is_defined(idx),
119			FrameColumnData::Utf8(container) => container.is_defined(idx),
120			FrameColumnData::Date(container) => container.is_defined(idx),
121			FrameColumnData::DateTime(container) => container.is_defined(idx),
122			FrameColumnData::Time(container) => container.is_defined(idx),
123			FrameColumnData::Duration(container) => container.is_defined(idx),
124			FrameColumnData::IdentityId(container) => container.is_defined(idx),
125			FrameColumnData::Uuid4(container) => container.is_defined(idx),
126			FrameColumnData::Uuid7(container) => container.is_defined(idx),
127			FrameColumnData::Blob(container) => container.is_defined(idx),
128			FrameColumnData::Int(container) => container.is_defined(idx),
129			FrameColumnData::Uint(container) => container.is_defined(idx),
130			FrameColumnData::Decimal(container) => container.is_defined(idx),
131			FrameColumnData::Any(container) => container.is_defined(idx),
132			FrameColumnData::DictionaryId(container) => container.is_defined(idx),
133			FrameColumnData::Option {
134				bitvec,
135				..
136			} => idx < DataBitVec::len(bitvec) && DataBitVec::get(bitvec, idx),
137		}
138	}
139
140	pub fn is_bool(&self) -> bool {
141		self.get_type() == ValueType::Boolean
142	}
143
144	pub fn is_float(&self) -> bool {
145		self.get_type() == ValueType::Float4 || self.get_type() == ValueType::Float8
146	}
147
148	pub fn is_utf8(&self) -> bool {
149		self.get_type() == ValueType::Utf8
150	}
151
152	pub fn is_number(&self) -> bool {
153		matches!(
154			self.get_type(),
155			ValueType::Float4
156				| ValueType::Float8 | ValueType::Int1
157				| ValueType::Int2 | ValueType::Int4
158				| ValueType::Int8 | ValueType::Int16
159				| ValueType::Uint1 | ValueType::Uint2
160				| ValueType::Uint4 | ValueType::Uint8
161				| ValueType::Uint16
162		)
163	}
164
165	pub fn is_text(&self) -> bool {
166		self.get_type() == ValueType::Utf8
167	}
168
169	pub fn is_temporal(&self) -> bool {
170		matches!(self.get_type(), ValueType::Date | ValueType::DateTime | ValueType::Time | ValueType::Duration)
171	}
172
173	pub fn is_uuid(&self) -> bool {
174		matches!(self.get_type(), ValueType::Uuid4 | ValueType::Uuid7)
175	}
176
177	pub fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = Value> + 'a> {
178		Box::new((0..self.len()).map(move |i| self.get_value(i)))
179	}
180}
181
182impl FrameColumnData {
183	pub fn len(&self) -> usize {
184		match self {
185			FrameColumnData::Bool(container) => container.len(),
186			FrameColumnData::Float4(container) => container.len(),
187			FrameColumnData::Float8(container) => container.len(),
188			FrameColumnData::Int1(container) => container.len(),
189			FrameColumnData::Int2(container) => container.len(),
190			FrameColumnData::Int4(container) => container.len(),
191			FrameColumnData::Int8(container) => container.len(),
192			FrameColumnData::Int16(container) => container.len(),
193			FrameColumnData::Uint1(container) => container.len(),
194			FrameColumnData::Uint2(container) => container.len(),
195			FrameColumnData::Uint4(container) => container.len(),
196			FrameColumnData::Uint8(container) => container.len(),
197			FrameColumnData::Uint16(container) => container.len(),
198			FrameColumnData::Utf8(container) => container.len(),
199			FrameColumnData::Date(container) => container.len(),
200			FrameColumnData::DateTime(container) => container.len(),
201			FrameColumnData::Time(container) => container.len(),
202			FrameColumnData::Duration(container) => container.len(),
203			FrameColumnData::IdentityId(container) => container.len(),
204			FrameColumnData::Uuid4(container) => container.len(),
205			FrameColumnData::Uuid7(container) => container.len(),
206			FrameColumnData::Blob(container) => container.len(),
207			FrameColumnData::Int(container) => container.len(),
208			FrameColumnData::Uint(container) => container.len(),
209			FrameColumnData::Decimal(container) => container.len(),
210			FrameColumnData::Any(container) => container.len(),
211			FrameColumnData::DictionaryId(container) => container.len(),
212			FrameColumnData::Option {
213				inner,
214				..
215			} => inner.len(),
216		}
217	}
218
219	pub fn is_empty(&self) -> bool {
220		self.len() == 0
221	}
222
223	pub fn as_string(&self, index: usize) -> String {
224		match self {
225			FrameColumnData::Bool(container) => container.as_string(index),
226			FrameColumnData::Float4(container) => {
227				if let Some(&v) = container.get(index) {
228					format_f32(v)
229				} else {
230					"none".to_string()
231				}
232			}
233			FrameColumnData::Float8(container) => {
234				if let Some(&v) = container.get(index) {
235					format_f64(v)
236				} else {
237					"none".to_string()
238				}
239			}
240			FrameColumnData::Int1(container) => container.as_string(index),
241			FrameColumnData::Int2(container) => container.as_string(index),
242			FrameColumnData::Int4(container) => container.as_string(index),
243			FrameColumnData::Int8(container) => container.as_string(index),
244			FrameColumnData::Int16(container) => container.as_string(index),
245			FrameColumnData::Uint1(container) => container.as_string(index),
246			FrameColumnData::Uint2(container) => container.as_string(index),
247			FrameColumnData::Uint4(container) => container.as_string(index),
248			FrameColumnData::Uint8(container) => container.as_string(index),
249			FrameColumnData::Uint16(container) => container.as_string(index),
250			FrameColumnData::Utf8(container) => container.as_string(index),
251			FrameColumnData::Date(container) => container.as_string(index),
252			FrameColumnData::DateTime(container) => container.as_string(index),
253			FrameColumnData::Time(container) => container.as_string(index),
254			FrameColumnData::Duration(container) => container.as_string(index),
255			FrameColumnData::IdentityId(container) => container.as_string(index),
256			FrameColumnData::Uuid4(container) => container.as_string(index),
257			FrameColumnData::Uuid7(container) => container.as_string(index),
258			FrameColumnData::Blob(container) => container.as_string(index),
259			FrameColumnData::Int(container) => container.as_string(index),
260			FrameColumnData::Uint(container) => container.as_string(index),
261			FrameColumnData::Decimal(container) => container.as_string(index),
262			FrameColumnData::Any(container) => container.as_string(index),
263			FrameColumnData::DictionaryId(container) => container.as_string(index),
264			FrameColumnData::Option {
265				inner,
266				bitvec,
267			} => {
268				if DataBitVec::get(bitvec, index) {
269					inner.as_string(index)
270				} else {
271					"none".to_string()
272				}
273			}
274		}
275	}
276}
277
278impl FrameColumnData {
279	pub fn get_value(&self, index: usize) -> Value {
280		match self {
281			FrameColumnData::Bool(container) => container.get_value(index),
282			FrameColumnData::Float4(container) => container.get_value(index),
283			FrameColumnData::Float8(container) => container.get_value(index),
284			FrameColumnData::Int1(container) => container.get_value(index),
285			FrameColumnData::Int2(container) => container.get_value(index),
286			FrameColumnData::Int4(container) => container.get_value(index),
287			FrameColumnData::Int8(container) => container.get_value(index),
288			FrameColumnData::Int16(container) => container.get_value(index),
289			FrameColumnData::Uint1(container) => container.get_value(index),
290			FrameColumnData::Uint2(container) => container.get_value(index),
291			FrameColumnData::Uint4(container) => container.get_value(index),
292			FrameColumnData::Uint8(container) => container.get_value(index),
293			FrameColumnData::Uint16(container) => container.get_value(index),
294			FrameColumnData::Utf8(container) => container.get_value(index),
295			FrameColumnData::Date(container) => container.get_value(index),
296			FrameColumnData::DateTime(container) => container.get_value(index),
297			FrameColumnData::Time(container) => container.get_value(index),
298			FrameColumnData::Duration(container) => container.get_value(index),
299			FrameColumnData::IdentityId(container) => container.get_value(index),
300			FrameColumnData::Uuid4(container) => container.get_value(index),
301			FrameColumnData::Uuid7(container) => container.get_value(index),
302			FrameColumnData::Blob(container) => container.get_value(index),
303			FrameColumnData::Int(container) => container.get_value(index),
304			FrameColumnData::Uint(container) => container.get_value(index),
305			FrameColumnData::Decimal(container) => container.get_value(index),
306			FrameColumnData::Any(container) => container.get_value(index),
307			FrameColumnData::DictionaryId(container) => container.get_value(index),
308			FrameColumnData::Option {
309				inner,
310				bitvec,
311			} => {
312				if DataBitVec::get(bitvec, index) {
313					inner.get_value(index)
314				} else {
315					Value::none_of(inner.get_type())
316				}
317			}
318		}
319	}
320}