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, TemporalContainer,
10		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	IdentityId(IdentityIdContainer),
35	Uuid4(UuidContainer<Uuid4>),
36	Uuid7(UuidContainer<Uuid7>),
37	Blob(BlobContainer),
38	Int(NumberContainer<Int>),
39	Uint(NumberContainer<Uint>),
40	Decimal(NumberContainer<Decimal>),
41	Any(AnyContainer),
42	// special case: all undefined
43	Undefined(UndefinedContainer),
44}
45
46impl FrameColumnData {
47	pub fn get_type(&self) -> Type {
48		match self {
49			FrameColumnData::Bool(_) => Type::Boolean,
50			FrameColumnData::Float4(_) => Type::Float4,
51			FrameColumnData::Float8(_) => Type::Float8,
52			FrameColumnData::Int1(_) => Type::Int1,
53			FrameColumnData::Int2(_) => Type::Int2,
54			FrameColumnData::Int4(_) => Type::Int4,
55			FrameColumnData::Int8(_) => Type::Int8,
56			FrameColumnData::Int16(_) => Type::Int16,
57			FrameColumnData::Uint1(_) => Type::Uint1,
58			FrameColumnData::Uint2(_) => Type::Uint2,
59			FrameColumnData::Uint4(_) => Type::Uint4,
60			FrameColumnData::Uint8(_) => Type::Uint8,
61			FrameColumnData::Uint16(_) => Type::Uint16,
62			FrameColumnData::Utf8(_) => Type::Utf8,
63			FrameColumnData::Date(_) => Type::Date,
64			FrameColumnData::DateTime(_) => Type::DateTime,
65			FrameColumnData::Time(_) => Type::Time,
66			FrameColumnData::Duration(_) => Type::Duration,
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::IdentityId(container) => container.is_defined(idx),
100			FrameColumnData::Uuid4(container) => container.is_defined(idx),
101			FrameColumnData::Uuid7(container) => container.is_defined(idx),
102			FrameColumnData::Blob(container) => container.is_defined(idx),
103			FrameColumnData::Int(container) => container.is_defined(idx),
104			FrameColumnData::Uint(container) => container.is_defined(idx),
105			FrameColumnData::Decimal(container) => container.is_defined(idx),
106			FrameColumnData::Any(container) => container.is_defined(idx),
107			FrameColumnData::Undefined(_) => false,
108		}
109	}
110
111	pub fn is_bool(&self) -> bool {
112		self.get_type() == Type::Boolean
113	}
114
115	pub fn is_float(&self) -> bool {
116		self.get_type() == Type::Float4 || self.get_type() == Type::Float8
117	}
118
119	pub fn is_utf8(&self) -> bool {
120		self.get_type() == Type::Utf8
121	}
122
123	pub fn is_number(&self) -> bool {
124		matches!(
125			self.get_type(),
126			Type::Float4
127				| Type::Float8 | Type::Int1 | Type::Int2
128				| Type::Int4 | Type::Int8 | Type::Int16
129				| Type::Uint1 | Type::Uint2 | Type::Uint4
130				| Type::Uint8 | Type::Uint16
131		)
132	}
133
134	pub fn is_text(&self) -> bool {
135		self.get_type() == Type::Utf8
136	}
137
138	pub fn is_temporal(&self) -> bool {
139		matches!(self.get_type(), Type::Date | Type::DateTime | Type::Time | Type::Duration)
140	}
141
142	pub fn is_uuid(&self) -> bool {
143		matches!(self.get_type(), Type::Uuid4 | Type::Uuid7)
144	}
145
146	pub fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = Value> + 'a> {
147		Box::new((0..self.len()).map(move |i| self.get_value(i)))
148	}
149}
150
151impl FrameColumnData {
152	pub fn len(&self) -> usize {
153		match self {
154			FrameColumnData::Bool(container) => container.len(),
155			FrameColumnData::Float4(container) => container.len(),
156			FrameColumnData::Float8(container) => container.len(),
157			FrameColumnData::Int1(container) => container.len(),
158			FrameColumnData::Int2(container) => container.len(),
159			FrameColumnData::Int4(container) => container.len(),
160			FrameColumnData::Int8(container) => container.len(),
161			FrameColumnData::Int16(container) => container.len(),
162			FrameColumnData::Uint1(container) => container.len(),
163			FrameColumnData::Uint2(container) => container.len(),
164			FrameColumnData::Uint4(container) => container.len(),
165			FrameColumnData::Uint8(container) => container.len(),
166			FrameColumnData::Uint16(container) => container.len(),
167			FrameColumnData::Utf8(container) => container.len(),
168			FrameColumnData::Date(container) => container.len(),
169			FrameColumnData::DateTime(container) => container.len(),
170			FrameColumnData::Time(container) => container.len(),
171			FrameColumnData::Duration(container) => container.len(),
172			FrameColumnData::IdentityId(container) => container.len(),
173			FrameColumnData::Uuid4(container) => container.len(),
174			FrameColumnData::Uuid7(container) => container.len(),
175			FrameColumnData::Blob(container) => container.len(),
176			FrameColumnData::Int(container) => container.len(),
177			FrameColumnData::Uint(container) => container.len(),
178			FrameColumnData::Decimal(container) => container.len(),
179			FrameColumnData::Any(container) => container.len(),
180			FrameColumnData::Undefined(container) => container.len(),
181		}
182	}
183
184	pub fn as_string(&self, index: usize) -> String {
185		match self {
186			FrameColumnData::Bool(container) => container.as_string(index),
187			FrameColumnData::Float4(container) => container.as_string(index),
188			FrameColumnData::Float8(container) => container.as_string(index),
189			FrameColumnData::Int1(container) => container.as_string(index),
190			FrameColumnData::Int2(container) => container.as_string(index),
191			FrameColumnData::Int4(container) => container.as_string(index),
192			FrameColumnData::Int8(container) => container.as_string(index),
193			FrameColumnData::Int16(container) => container.as_string(index),
194			FrameColumnData::Uint1(container) => container.as_string(index),
195			FrameColumnData::Uint2(container) => container.as_string(index),
196			FrameColumnData::Uint4(container) => container.as_string(index),
197			FrameColumnData::Uint8(container) => container.as_string(index),
198			FrameColumnData::Uint16(container) => container.as_string(index),
199			FrameColumnData::Utf8(container) => container.as_string(index),
200			FrameColumnData::Date(container) => container.as_string(index),
201			FrameColumnData::DateTime(container) => container.as_string(index),
202			FrameColumnData::Time(container) => container.as_string(index),
203			FrameColumnData::Duration(container) => container.as_string(index),
204			FrameColumnData::IdentityId(container) => container.as_string(index),
205			FrameColumnData::Uuid4(container) => container.as_string(index),
206			FrameColumnData::Uuid7(container) => container.as_string(index),
207			FrameColumnData::Blob(container) => container.as_string(index),
208			FrameColumnData::Int(container) => container.as_string(index),
209			FrameColumnData::Uint(container) => container.as_string(index),
210			FrameColumnData::Decimal(container) => container.as_string(index),
211			FrameColumnData::Any(container) => container.as_string(index),
212			FrameColumnData::Undefined(container) => container.as_string(index),
213		}
214	}
215}
216
217impl FrameColumnData {
218	pub fn get_value(&self, index: usize) -> Value {
219		match self {
220			FrameColumnData::Bool(container) => container.get_value(index),
221			FrameColumnData::Float4(container) => container.get_value(index),
222			FrameColumnData::Float8(container) => container.get_value(index),
223			FrameColumnData::Int1(container) => container.get_value(index),
224			FrameColumnData::Int2(container) => container.get_value(index),
225			FrameColumnData::Int4(container) => container.get_value(index),
226			FrameColumnData::Int8(container) => container.get_value(index),
227			FrameColumnData::Int16(container) => container.get_value(index),
228			FrameColumnData::Uint1(container) => container.get_value(index),
229			FrameColumnData::Uint2(container) => container.get_value(index),
230			FrameColumnData::Uint4(container) => container.get_value(index),
231			FrameColumnData::Uint8(container) => container.get_value(index),
232			FrameColumnData::Uint16(container) => container.get_value(index),
233			FrameColumnData::Utf8(container) => container.get_value(index),
234			FrameColumnData::Date(container) => container.get_value(index),
235			FrameColumnData::DateTime(container) => container.get_value(index),
236			FrameColumnData::Time(container) => container.get_value(index),
237			FrameColumnData::Duration(container) => container.get_value(index),
238			FrameColumnData::IdentityId(container) => container.get_value(index),
239			FrameColumnData::Uuid4(container) => container.get_value(index),
240			FrameColumnData::Uuid7(container) => container.get_value(index),
241			FrameColumnData::Blob(container) => container.get_value(index),
242			FrameColumnData::Int(container) => container.get_value(index),
243			FrameColumnData::Uint(container) => container.get_value(index),
244			FrameColumnData::Decimal(container) => container.get_value(index),
245			FrameColumnData::Any(container) => container.get_value(index),
246			FrameColumnData::Undefined(container) => container.get_value(index),
247		}
248	}
249}