reifydb_core/value/column/data/
mod.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4mod 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	// Container for Any type (heterogeneous values)
72	Any(AnyContainer),
73	// special case: all undefined
74	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}