reifydb_core/value/frame/
data.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use reifydb_type::{Date, DateTime, Decimal, Duration, Int, Time, Type, Uint, Uuid4, Uuid7, Value};
5use serde::{Deserialize, Serialize};
6
7use crate::value::container::{
8	AnyContainer, BlobContainer, BoolContainer, IdentityIdContainer, NumberContainer, RowNumberContainer,
9	TemporalContainer, UndefinedContainer, Utf8Container, UuidContainer,
10};
11
12#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
13pub enum FrameColumnData {
14	Bool(BoolContainer),
15	Float4(NumberContainer<f32>),
16	Float8(NumberContainer<f64>),
17	Int1(NumberContainer<i8>),
18	Int2(NumberContainer<i16>),
19	Int4(NumberContainer<i32>),
20	Int8(NumberContainer<i64>),
21	Int16(NumberContainer<i128>),
22	Uint1(NumberContainer<u8>),
23	Uint2(NumberContainer<u16>),
24	Uint4(NumberContainer<u32>),
25	Uint8(NumberContainer<u64>),
26	Uint16(NumberContainer<u128>),
27	Utf8(Utf8Container),
28	Date(TemporalContainer<Date>),
29	DateTime(TemporalContainer<DateTime>),
30	Time(TemporalContainer<Time>),
31	Duration(TemporalContainer<Duration>),
32	RowNumber(RowNumberContainer),
33	IdentityId(IdentityIdContainer),
34	Uuid4(UuidContainer<Uuid4>),
35	Uuid7(UuidContainer<Uuid7>),
36	Blob(BlobContainer),
37	Int(NumberContainer<Int>),
38	Uint(NumberContainer<Uint>),
39	Decimal(NumberContainer<Decimal>),
40	Any(AnyContainer),
41	// special case: all undefined
42	Undefined(UndefinedContainer),
43}
44
45impl FrameColumnData {
46	pub fn get_type(&self) -> Type {
47		match self {
48			FrameColumnData::Bool(_) => Type::Boolean,
49			FrameColumnData::Float4(_) => Type::Float4,
50			FrameColumnData::Float8(_) => Type::Float8,
51			FrameColumnData::Int1(_) => Type::Int1,
52			FrameColumnData::Int2(_) => Type::Int2,
53			FrameColumnData::Int4(_) => Type::Int4,
54			FrameColumnData::Int8(_) => Type::Int8,
55			FrameColumnData::Int16(_) => Type::Int16,
56			FrameColumnData::Uint1(_) => Type::Uint1,
57			FrameColumnData::Uint2(_) => Type::Uint2,
58			FrameColumnData::Uint4(_) => Type::Uint4,
59			FrameColumnData::Uint8(_) => Type::Uint8,
60			FrameColumnData::Uint16(_) => Type::Uint16,
61			FrameColumnData::Utf8(_) => Type::Utf8,
62			FrameColumnData::Date(_) => Type::Date,
63			FrameColumnData::DateTime(_) => Type::DateTime,
64			FrameColumnData::Time(_) => Type::Time,
65			FrameColumnData::Duration(_) => Type::Duration,
66			FrameColumnData::RowNumber(_) => Type::RowNumber,
67			FrameColumnData::IdentityId(_) => Type::IdentityId,
68			FrameColumnData::Uuid4(_) => Type::Uuid4,
69			FrameColumnData::Uuid7(_) => Type::Uuid7,
70			FrameColumnData::Blob(_) => Type::Blob,
71			FrameColumnData::Int(_) => Type::Int,
72			FrameColumnData::Uint(_) => Type::Uint,
73			FrameColumnData::Decimal(_) => Type::Decimal,
74			FrameColumnData::Any(_) => Type::Any,
75			FrameColumnData::Undefined(_) => Type::Undefined,
76		}
77	}
78
79	pub fn is_defined(&self, idx: usize) -> bool {
80		match self {
81			FrameColumnData::Bool(container) => container.is_defined(idx),
82			FrameColumnData::Float4(container) => container.is_defined(idx),
83			FrameColumnData::Float8(container) => container.is_defined(idx),
84			FrameColumnData::Int1(container) => container.is_defined(idx),
85			FrameColumnData::Int2(container) => container.is_defined(idx),
86			FrameColumnData::Int4(container) => container.is_defined(idx),
87			FrameColumnData::Int8(container) => container.is_defined(idx),
88			FrameColumnData::Int16(container) => container.is_defined(idx),
89			FrameColumnData::Uint1(container) => container.is_defined(idx),
90			FrameColumnData::Uint2(container) => container.is_defined(idx),
91			FrameColumnData::Uint4(container) => container.is_defined(idx),
92			FrameColumnData::Uint8(container) => container.is_defined(idx),
93			FrameColumnData::Uint16(container) => container.is_defined(idx),
94			FrameColumnData::Utf8(container) => container.is_defined(idx),
95			FrameColumnData::Date(container) => container.is_defined(idx),
96			FrameColumnData::DateTime(container) => container.is_defined(idx),
97			FrameColumnData::Time(container) => container.is_defined(idx),
98			FrameColumnData::Duration(container) => container.is_defined(idx),
99			FrameColumnData::RowNumber(container) => container.is_defined(idx),
100			FrameColumnData::IdentityId(container) => container.is_defined(idx),
101			FrameColumnData::Uuid4(container) => container.is_defined(idx),
102			FrameColumnData::Uuid7(container) => container.is_defined(idx),
103			FrameColumnData::Blob(container) => container.is_defined(idx),
104			FrameColumnData::Int(container) => container.is_defined(idx),
105			FrameColumnData::Uint(container) => container.is_defined(idx),
106			FrameColumnData::Decimal(container) => container.is_defined(idx),
107			FrameColumnData::Any(container) => container.is_defined(idx),
108			FrameColumnData::Undefined(_) => false,
109		}
110	}
111
112	pub fn is_bool(&self) -> bool {
113		self.get_type() == Type::Boolean
114	}
115
116	pub fn is_float(&self) -> bool {
117		self.get_type() == Type::Float4 || self.get_type() == Type::Float8
118	}
119
120	pub fn is_utf8(&self) -> bool {
121		self.get_type() == Type::Utf8
122	}
123
124	pub fn is_number(&self) -> bool {
125		matches!(
126			self.get_type(),
127			Type::Float4
128				| Type::Float8 | Type::Int1 | Type::Int2
129				| Type::Int4 | Type::Int8 | Type::Int16
130				| Type::Uint1 | Type::Uint2 | Type::Uint4
131				| Type::Uint8 | Type::Uint16
132		)
133	}
134
135	pub fn is_text(&self) -> bool {
136		self.get_type() == Type::Utf8
137	}
138
139	pub fn is_temporal(&self) -> bool {
140		matches!(self.get_type(), Type::Date | Type::DateTime | Type::Time | Type::Duration)
141	}
142
143	pub fn is_uuid(&self) -> bool {
144		matches!(self.get_type(), Type::Uuid4 | Type::Uuid7)
145	}
146
147	pub fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = Value> + 'a> {
148		Box::new((0..self.len()).map(move |i| self.get_value(i)))
149	}
150}
151
152impl FrameColumnData {
153	pub fn len(&self) -> usize {
154		match self {
155			FrameColumnData::Bool(container) => container.len(),
156			FrameColumnData::Float4(container) => container.len(),
157			FrameColumnData::Float8(container) => container.len(),
158			FrameColumnData::Int1(container) => container.len(),
159			FrameColumnData::Int2(container) => container.len(),
160			FrameColumnData::Int4(container) => container.len(),
161			FrameColumnData::Int8(container) => container.len(),
162			FrameColumnData::Int16(container) => container.len(),
163			FrameColumnData::Uint1(container) => container.len(),
164			FrameColumnData::Uint2(container) => container.len(),
165			FrameColumnData::Uint4(container) => container.len(),
166			FrameColumnData::Uint8(container) => container.len(),
167			FrameColumnData::Uint16(container) => container.len(),
168			FrameColumnData::Utf8(container) => container.len(),
169			FrameColumnData::Date(container) => container.len(),
170			FrameColumnData::DateTime(container) => container.len(),
171			FrameColumnData::Time(container) => container.len(),
172			FrameColumnData::Duration(container) => container.len(),
173			FrameColumnData::RowNumber(container) => container.len(),
174			FrameColumnData::IdentityId(container) => container.len(),
175			FrameColumnData::Uuid4(container) => container.len(),
176			FrameColumnData::Uuid7(container) => container.len(),
177			FrameColumnData::Blob(container) => container.len(),
178			FrameColumnData::Int(container) => container.len(),
179			FrameColumnData::Uint(container) => container.len(),
180			FrameColumnData::Decimal(container) => container.len(),
181			FrameColumnData::Any(container) => container.len(),
182			FrameColumnData::Undefined(container) => container.len(),
183		}
184	}
185
186	pub fn as_string(&self, index: usize) -> String {
187		match self {
188			FrameColumnData::Bool(container) => container.as_string(index),
189			FrameColumnData::Float4(container) => container.as_string(index),
190			FrameColumnData::Float8(container) => container.as_string(index),
191			FrameColumnData::Int1(container) => container.as_string(index),
192			FrameColumnData::Int2(container) => container.as_string(index),
193			FrameColumnData::Int4(container) => container.as_string(index),
194			FrameColumnData::Int8(container) => container.as_string(index),
195			FrameColumnData::Int16(container) => container.as_string(index),
196			FrameColumnData::Uint1(container) => container.as_string(index),
197			FrameColumnData::Uint2(container) => container.as_string(index),
198			FrameColumnData::Uint4(container) => container.as_string(index),
199			FrameColumnData::Uint8(container) => container.as_string(index),
200			FrameColumnData::Uint16(container) => container.as_string(index),
201			FrameColumnData::Utf8(container) => container.as_string(index),
202			FrameColumnData::Date(container) => container.as_string(index),
203			FrameColumnData::DateTime(container) => container.as_string(index),
204			FrameColumnData::Time(container) => container.as_string(index),
205			FrameColumnData::Duration(container) => container.as_string(index),
206			FrameColumnData::RowNumber(container) => container.as_string(index),
207			FrameColumnData::IdentityId(container) => container.as_string(index),
208			FrameColumnData::Uuid4(container) => container.as_string(index),
209			FrameColumnData::Uuid7(container) => container.as_string(index),
210			FrameColumnData::Blob(container) => container.as_string(index),
211			FrameColumnData::Int(container) => container.as_string(index),
212			FrameColumnData::Uint(container) => container.as_string(index),
213			FrameColumnData::Decimal(container) => container.as_string(index),
214			FrameColumnData::Any(container) => container.as_string(index),
215			FrameColumnData::Undefined(container) => container.as_string(index),
216		}
217	}
218}
219
220impl FrameColumnData {
221	pub fn get_value(&self, index: usize) -> Value {
222		match self {
223			FrameColumnData::Bool(container) => container.get_value(index),
224			FrameColumnData::Float4(container) => container.get_value(index),
225			FrameColumnData::Float8(container) => container.get_value(index),
226			FrameColumnData::Int1(container) => container.get_value(index),
227			FrameColumnData::Int2(container) => container.get_value(index),
228			FrameColumnData::Int4(container) => container.get_value(index),
229			FrameColumnData::Int8(container) => container.get_value(index),
230			FrameColumnData::Int16(container) => container.get_value(index),
231			FrameColumnData::Uint1(container) => container.get_value(index),
232			FrameColumnData::Uint2(container) => container.get_value(index),
233			FrameColumnData::Uint4(container) => container.get_value(index),
234			FrameColumnData::Uint8(container) => container.get_value(index),
235			FrameColumnData::Uint16(container) => container.get_value(index),
236			FrameColumnData::Utf8(container) => container.get_value(index),
237			FrameColumnData::Date(container) => container.get_value(index),
238			FrameColumnData::DateTime(container) => container.get_value(index),
239			FrameColumnData::Time(container) => container.get_value(index),
240			FrameColumnData::Duration(container) => container.get_value(index),
241			FrameColumnData::RowNumber(container) => container.get_value(index),
242			FrameColumnData::IdentityId(container) => container.get_value(index),
243			FrameColumnData::Uuid4(container) => container.get_value(index),
244			FrameColumnData::Uuid7(container) => container.get_value(index),
245			FrameColumnData::Blob(container) => container.get_value(index),
246			FrameColumnData::Int(container) => container.get_value(index),
247			FrameColumnData::Uint(container) => container.get_value(index),
248			FrameColumnData::Decimal(container) => container.get_value(index),
249			FrameColumnData::Any(container) => container.get_value(index),
250			FrameColumnData::Undefined(container) => container.get_value(index),
251		}
252	}
253}