reifydb_type/value/frame/
data.rs

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