1mod extend;
5mod factory;
6mod filter;
7mod from;
8mod get;
9mod reorder;
10mod slice;
11mod take;
12
13use reifydb_type::{
14 Date, DateTime, Decimal, Duration, Int, Time, Type, Uint, Uuid4, Uuid7, Value,
15 value::constraint::{bytes::MaxBytes, precision::Precision, scale::Scale},
16};
17use serde::{Deserialize, Serialize};
18
19use crate::{
20 BitVec,
21 value::container::{
22 AnyContainer, BlobContainer, BoolContainer, IdentityIdContainer, NumberContainer, RowNumberContainer,
23 TemporalContainer, UndefinedContainer, Utf8Container, UuidContainer,
24 },
25};
26
27#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
28pub enum ColumnData {
29 Bool(BoolContainer),
30 Float4(NumberContainer<f32>),
31 Float8(NumberContainer<f64>),
32 Int1(NumberContainer<i8>),
33 Int2(NumberContainer<i16>),
34 Int4(NumberContainer<i32>),
35 Int8(NumberContainer<i64>),
36 Int16(NumberContainer<i128>),
37 Uint1(NumberContainer<u8>),
38 Uint2(NumberContainer<u16>),
39 Uint4(NumberContainer<u32>),
40 Uint8(NumberContainer<u64>),
41 Uint16(NumberContainer<u128>),
42 Utf8 {
43 container: Utf8Container,
44 max_bytes: MaxBytes,
45 },
46 Date(TemporalContainer<Date>),
47 DateTime(TemporalContainer<DateTime>),
48 Time(TemporalContainer<Time>),
49 Duration(TemporalContainer<Duration>),
50 RowNumber(RowNumberContainer),
51 IdentityId(IdentityIdContainer),
52 Uuid4(UuidContainer<Uuid4>),
53 Uuid7(UuidContainer<Uuid7>),
54 Blob {
55 container: BlobContainer,
56 max_bytes: MaxBytes,
57 },
58 Int {
59 container: NumberContainer<Int>,
60 max_bytes: MaxBytes,
61 },
62 Uint {
63 container: NumberContainer<Uint>,
64 max_bytes: MaxBytes,
65 },
66 Decimal {
67 container: NumberContainer<Decimal>,
68 precision: Precision,
69 scale: Scale,
70 },
71 Any(AnyContainer),
73 Undefined(UndefinedContainer),
75}
76
77impl ColumnData {
78 pub fn get_type(&self) -> Type {
79 match self {
80 ColumnData::Bool(_) => Type::Boolean,
81 ColumnData::Float4(_) => Type::Float4,
82 ColumnData::Float8(_) => Type::Float8,
83 ColumnData::Int1(_) => Type::Int1,
84 ColumnData::Int2(_) => Type::Int2,
85 ColumnData::Int4(_) => Type::Int4,
86 ColumnData::Int8(_) => Type::Int8,
87 ColumnData::Int16(_) => Type::Int16,
88 ColumnData::Uint1(_) => Type::Uint1,
89 ColumnData::Uint2(_) => Type::Uint2,
90 ColumnData::Uint4(_) => Type::Uint4,
91 ColumnData::Uint8(_) => Type::Uint8,
92 ColumnData::Uint16(_) => Type::Uint16,
93 ColumnData::Utf8 {
94 ..
95 } => Type::Utf8,
96 ColumnData::Date(_) => Type::Date,
97 ColumnData::DateTime(_) => Type::DateTime,
98 ColumnData::Time(_) => Type::Time,
99 ColumnData::Duration(_) => Type::Duration,
100 ColumnData::RowNumber(_) => Type::RowNumber,
101 ColumnData::IdentityId(_) => Type::IdentityId,
102 ColumnData::Uuid4(_) => Type::Uuid4,
103 ColumnData::Uuid7(_) => Type::Uuid7,
104 ColumnData::Blob {
105 ..
106 } => Type::Blob,
107 ColumnData::Int {
108 ..
109 } => Type::Int,
110 ColumnData::Uint {
111 ..
112 } => Type::Uint,
113 ColumnData::Decimal {
114 ..
115 } => Type::Decimal,
116 ColumnData::Any(_) => Type::Any,
117 ColumnData::Undefined(_) => Type::Undefined,
118 }
119 }
120
121 pub fn is_defined(&self, idx: usize) -> bool {
122 match self {
123 ColumnData::Bool(container) => container.is_defined(idx),
124 ColumnData::Float4(container) => container.is_defined(idx),
125 ColumnData::Float8(container) => container.is_defined(idx),
126 ColumnData::Int1(container) => container.is_defined(idx),
127 ColumnData::Int2(container) => container.is_defined(idx),
128 ColumnData::Int4(container) => container.is_defined(idx),
129 ColumnData::Int8(container) => container.is_defined(idx),
130 ColumnData::Int16(container) => container.is_defined(idx),
131 ColumnData::Uint1(container) => container.is_defined(idx),
132 ColumnData::Uint2(container) => container.is_defined(idx),
133 ColumnData::Uint4(container) => container.is_defined(idx),
134 ColumnData::Uint8(container) => container.is_defined(idx),
135 ColumnData::Uint16(container) => container.is_defined(idx),
136 ColumnData::Utf8 {
137 container,
138 ..
139 } => container.is_defined(idx),
140 ColumnData::Date(container) => container.is_defined(idx),
141 ColumnData::DateTime(container) => container.is_defined(idx),
142 ColumnData::Time(container) => container.is_defined(idx),
143 ColumnData::Duration(container) => container.is_defined(idx),
144 ColumnData::RowNumber(container) => container.is_defined(idx),
145 ColumnData::IdentityId(container) => container.get(idx).is_some(),
146 ColumnData::Uuid4(container) => container.is_defined(idx),
147 ColumnData::Uuid7(container) => container.is_defined(idx),
148 ColumnData::Blob {
149 container,
150 ..
151 } => container.is_defined(idx),
152 ColumnData::Int {
153 container,
154 ..
155 } => container.is_defined(idx),
156 ColumnData::Uint {
157 container,
158 ..
159 } => container.is_defined(idx),
160 ColumnData::Decimal {
161 container,
162 ..
163 } => container.is_defined(idx),
164 ColumnData::Any(container) => container.is_defined(idx),
165 ColumnData::Undefined(_) => false,
166 }
167 }
168
169 pub fn is_bool(&self) -> bool {
170 self.get_type() == Type::Boolean
171 }
172
173 pub fn is_float(&self) -> bool {
174 self.get_type() == Type::Float4 || self.get_type() == Type::Float8
175 }
176
177 pub fn is_utf8(&self) -> bool {
178 self.get_type() == Type::Utf8
179 }
180
181 pub fn is_number(&self) -> bool {
182 matches!(
183 self.get_type(),
184 Type::Float4
185 | Type::Float8 | Type::Int1 | Type::Int2
186 | Type::Int4 | Type::Int8 | Type::Int16
187 | Type::Uint1 | Type::Uint2 | Type::Uint4
188 | Type::Uint8 | Type::Uint16 | Type::Int
189 | Type::Uint | Type::Decimal { .. }
190 )
191 }
192
193 pub fn is_text(&self) -> bool {
194 self.get_type() == Type::Utf8
195 }
196
197 pub fn is_temporal(&self) -> bool {
198 matches!(self.get_type(), Type::Date | Type::DateTime | Type::Time | Type::Duration)
199 }
200
201 pub fn is_uuid(&self) -> bool {
202 matches!(self.get_type(), Type::Uuid4 | Type::Uuid7)
203 }
204}
205
206impl ColumnData {
207 pub fn bitvec(&self) -> &BitVec {
208 match self {
209 ColumnData::Bool(container) => container.bitvec(),
210 ColumnData::Float4(container) => container.bitvec(),
211 ColumnData::Float8(container) => container.bitvec(),
212 ColumnData::Int1(container) => container.bitvec(),
213 ColumnData::Int2(container) => container.bitvec(),
214 ColumnData::Int4(container) => container.bitvec(),
215 ColumnData::Int8(container) => container.bitvec(),
216 ColumnData::Int16(container) => container.bitvec(),
217 ColumnData::Uint1(container) => container.bitvec(),
218 ColumnData::Uint2(container) => container.bitvec(),
219 ColumnData::Uint4(container) => container.bitvec(),
220 ColumnData::Uint8(container) => container.bitvec(),
221 ColumnData::Uint16(container) => container.bitvec(),
222 ColumnData::Utf8 {
223 container,
224 ..
225 } => container.bitvec(),
226 ColumnData::Date(container) => container.bitvec(),
227 ColumnData::DateTime(container) => container.bitvec(),
228 ColumnData::Time(container) => container.bitvec(),
229 ColumnData::Duration(container) => container.bitvec(),
230 ColumnData::RowNumber(container) => container.bitvec(),
231 ColumnData::IdentityId(container) => container.bitvec(),
232 ColumnData::Uuid4(container) => container.bitvec(),
233 ColumnData::Uuid7(container) => container.bitvec(),
234 ColumnData::Blob {
235 container,
236 ..
237 } => container.bitvec(),
238 ColumnData::Int {
239 container,
240 ..
241 } => container.bitvec(),
242 ColumnData::Uint {
243 container,
244 ..
245 } => container.bitvec(),
246 ColumnData::Decimal {
247 container,
248 ..
249 } => container.bitvec(),
250 ColumnData::Any(container) => container.bitvec(),
251 ColumnData::Undefined(_) => unreachable!(),
252 }
253 }
254
255 pub fn undefined_count(&self) -> usize {
256 self.bitvec().count_zeros()
257 }
258}
259
260impl ColumnData {
261 pub fn with_capacity(target: Type, capacity: usize) -> Self {
262 match target {
263 Type::Boolean => Self::bool_with_capacity(capacity),
264 Type::Float4 => Self::float4_with_capacity(capacity),
265 Type::Float8 => Self::float8_with_capacity(capacity),
266 Type::Int1 => Self::int1_with_capacity(capacity),
267 Type::Int2 => Self::int2_with_capacity(capacity),
268 Type::Int4 => Self::int4_with_capacity(capacity),
269 Type::Int8 => Self::int8_with_capacity(capacity),
270 Type::Int16 => Self::int16_with_capacity(capacity),
271 Type::Uint1 => Self::uint1_with_capacity(capacity),
272 Type::Uint2 => Self::uint2_with_capacity(capacity),
273 Type::Uint4 => Self::uint4_with_capacity(capacity),
274 Type::Uint8 => Self::uint8_with_capacity(capacity),
275 Type::Uint16 => Self::uint16_with_capacity(capacity),
276 Type::Utf8 => Self::utf8_with_capacity(capacity),
277 Type::Date => Self::date_with_capacity(capacity),
278 Type::DateTime => Self::datetime_with_capacity(capacity),
279 Type::Time => Self::time_with_capacity(capacity),
280 Type::Duration => Self::duration_with_capacity(capacity),
281 Type::RowNumber => Self::row_number_with_capacity(capacity),
282 Type::IdentityId => Self::identity_id_with_capacity(capacity),
283 Type::Uuid4 => Self::uuid4_with_capacity(capacity),
284 Type::Uuid7 => Self::uuid7_with_capacity(capacity),
285 Type::Blob => Self::blob_with_capacity(capacity),
286 Type::Int => Self::int_with_capacity(capacity),
287 Type::Uint => Self::uint_with_capacity(capacity),
288 Type::Decimal => Self::decimal_with_capacity(capacity),
289 Type::Undefined => ColumnData::undefined(0),
290 Type::Any => Self::any_with_capacity(capacity),
291 }
292 }
293
294 pub fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = Value> + 'a> {
295 Box::new((0..self.len()).map(move |i| self.get_value(i)))
296 }
297}
298
299impl ColumnData {
300 pub fn len(&self) -> usize {
301 match self {
302 ColumnData::Bool(container) => container.len(),
303 ColumnData::Float4(container) => container.len(),
304 ColumnData::Float8(container) => container.len(),
305 ColumnData::Int1(container) => container.len(),
306 ColumnData::Int2(container) => container.len(),
307 ColumnData::Int4(container) => container.len(),
308 ColumnData::Int8(container) => container.len(),
309 ColumnData::Int16(container) => container.len(),
310 ColumnData::Uint1(container) => container.len(),
311 ColumnData::Uint2(container) => container.len(),
312 ColumnData::Uint4(container) => container.len(),
313 ColumnData::Uint8(container) => container.len(),
314 ColumnData::Uint16(container) => container.len(),
315 ColumnData::Utf8 {
316 container,
317 ..
318 } => container.len(),
319 ColumnData::Date(container) => container.len(),
320 ColumnData::DateTime(container) => container.len(),
321 ColumnData::Time(container) => container.len(),
322 ColumnData::Duration(container) => container.len(),
323 ColumnData::RowNumber(container) => container.len(),
324 ColumnData::IdentityId(container) => container.len(),
325 ColumnData::Uuid4(container) => container.len(),
326 ColumnData::Uuid7(container) => container.len(),
327 ColumnData::Blob {
328 container,
329 ..
330 } => container.len(),
331 ColumnData::Int {
332 container,
333 ..
334 } => container.len(),
335 ColumnData::Uint {
336 container,
337 ..
338 } => container.len(),
339 ColumnData::Decimal {
340 container,
341 ..
342 } => container.len(),
343 ColumnData::Any(container) => container.len(),
344 ColumnData::Undefined(container) => container.len(),
345 }
346 }
347
348 pub fn capacity(&self) -> usize {
349 match self {
350 ColumnData::Bool(container) => container.capacity(),
351 ColumnData::Float4(container) => container.capacity(),
352 ColumnData::Float8(container) => container.capacity(),
353 ColumnData::Int1(container) => container.capacity(),
354 ColumnData::Int2(container) => container.capacity(),
355 ColumnData::Int4(container) => container.capacity(),
356 ColumnData::Int8(container) => container.capacity(),
357 ColumnData::Int16(container) => container.capacity(),
358 ColumnData::Uint1(container) => container.capacity(),
359 ColumnData::Uint2(container) => container.capacity(),
360 ColumnData::Uint4(container) => container.capacity(),
361 ColumnData::Uint8(container) => container.capacity(),
362 ColumnData::Uint16(container) => container.capacity(),
363 ColumnData::Utf8 {
364 container,
365 ..
366 } => container.capacity(),
367 ColumnData::Date(container) => container.capacity(),
368 ColumnData::DateTime(container) => container.capacity(),
369 ColumnData::Time(container) => container.capacity(),
370 ColumnData::Duration(container) => container.capacity(),
371 ColumnData::RowNumber(container) => container.capacity(),
372 ColumnData::IdentityId(container) => container.capacity(),
373 ColumnData::Uuid4(container) => container.capacity(),
374 ColumnData::Uuid7(container) => container.capacity(),
375 ColumnData::Blob {
376 container,
377 ..
378 } => container.capacity(),
379 ColumnData::Int {
380 container,
381 ..
382 } => container.capacity(),
383 ColumnData::Uint {
384 container,
385 ..
386 } => container.capacity(),
387 ColumnData::Decimal {
388 container,
389 ..
390 } => container.capacity(),
391 ColumnData::Any(container) => container.capacity(),
392 ColumnData::Undefined(container) => container.capacity(),
393 }
394 }
395
396 pub fn as_string(&self, index: usize) -> String {
397 match self {
398 ColumnData::Bool(container) => container.as_string(index),
399 ColumnData::Float4(container) => container.as_string(index),
400 ColumnData::Float8(container) => container.as_string(index),
401 ColumnData::Int1(container) => container.as_string(index),
402 ColumnData::Int2(container) => container.as_string(index),
403 ColumnData::Int4(container) => container.as_string(index),
404 ColumnData::Int8(container) => container.as_string(index),
405 ColumnData::Int16(container) => container.as_string(index),
406 ColumnData::Uint1(container) => container.as_string(index),
407 ColumnData::Uint2(container) => container.as_string(index),
408 ColumnData::Uint4(container) => container.as_string(index),
409 ColumnData::Uint8(container) => container.as_string(index),
410 ColumnData::Uint16(container) => container.as_string(index),
411 ColumnData::Utf8 {
412 container,
413 ..
414 } => container.as_string(index),
415 ColumnData::Date(container) => container.as_string(index),
416 ColumnData::DateTime(container) => container.as_string(index),
417 ColumnData::Time(container) => container.as_string(index),
418 ColumnData::Duration(container) => container.as_string(index),
419 ColumnData::RowNumber(container) => container.as_string(index),
420 ColumnData::IdentityId(container) => container.as_string(index),
421 ColumnData::Uuid4(container) => container.as_string(index),
422 ColumnData::Uuid7(container) => container.as_string(index),
423 ColumnData::Blob {
424 container,
425 ..
426 } => container.as_string(index),
427 ColumnData::Int {
428 container,
429 ..
430 } => container.as_string(index),
431 ColumnData::Uint {
432 container,
433 ..
434 } => container.as_string(index),
435 ColumnData::Decimal {
436 container,
437 ..
438 } => container.as_string(index),
439 ColumnData::Any(container) => container.as_string(index),
440 ColumnData::Undefined(container) => container.as_string(index),
441 }
442 }
443}