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