Skip to main content

reifydb_type/value/frame/
data.rs

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