1use 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 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}