Skip to main content

reifydb_core/value/column/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use std::fmt;
5
6use reifydb_type::{
7	fragment::Fragment,
8	util::bitvec::BitVec,
9	value::{
10		dictionary::DictionaryEntryId,
11		r#type::Type,
12		uuid::{Uuid4, Uuid7},
13	},
14};
15
16use crate::value::column::{array::Column, buffer::ColumnBuffer};
17
18pub mod array;
19pub mod buffer;
20pub mod columns;
21pub mod compressed;
22pub mod encoding;
23pub mod frame;
24pub mod headers;
25pub mod mask;
26pub mod nones;
27pub mod push;
28pub mod row;
29pub mod row_ref;
30pub mod stats;
31pub mod transform;
32pub mod view;
33
34pub struct ColumnWithName {
35	pub name: Fragment,
36	pub data: ColumnBuffer,
37}
38
39impl Clone for ColumnWithName {
40	fn clone(&self) -> Self {
41		Self {
42			name: self.name.clone(),
43			data: self.data.clone(),
44		}
45	}
46}
47
48impl PartialEq for ColumnWithName {
49	fn eq(&self, other: &Self) -> bool {
50		self.name == other.name && self.data == other.data
51	}
52}
53
54impl fmt::Debug for ColumnWithName {
55	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56		f.debug_struct("ColumnWithName").field("name", &self.name).field("data", &self.data).finish()
57	}
58}
59
60impl ColumnWithName {
61	pub fn new(name: impl Into<Fragment>, data: ColumnBuffer) -> Self {
62		Self {
63			name: name.into(),
64			data,
65		}
66	}
67
68	// Build a named column from a polymorphic `Column` trait-object handle.
69	// Materializes via `to_canonical` + `to_buffer` (Arc-bumps the inner
70	// buffer when the `Column` is already canonical).
71	pub fn from_column(name: impl Into<Fragment>, column: Column) -> Self {
72		let buffer = column
73			.to_canonical()
74			.map(|c| c.to_buffer())
75			.unwrap_or_else(|_| panic!("ColumnWithName::from_column: to_canonical failed"));
76		Self {
77			name: name.into(),
78			data: buffer,
79		}
80	}
81
82	pub fn get_type(&self) -> Type {
83		self.data.get_type()
84	}
85
86	pub fn with_new_data(&self, data: ColumnBuffer) -> ColumnWithName {
87		ColumnWithName {
88			name: self.name.clone(),
89			data,
90		}
91	}
92
93	pub fn name(&self) -> &Fragment {
94		&self.name
95	}
96
97	pub fn name_owned(&self) -> Fragment {
98		self.name.clone()
99	}
100
101	pub fn data(&self) -> &ColumnBuffer {
102		&self.data
103	}
104
105	pub fn data_mut(&mut self) -> &mut ColumnBuffer {
106		&mut self.data
107	}
108
109	// Return a polymorphic `Column` handle (trait-object wrapper around the
110	// canonical form of `self.data`). Use this when you need encoding-agnostic
111	// read operators (`filter`, `take`, `slice`, ...) or downcasting to
112	// specialized impls - compressed encodings live behind this boundary.
113	pub fn column(&self) -> Column {
114		Column::from_column_buffer(self.data.clone())
115	}
116
117	pub fn to_static(&self) -> ColumnWithName {
118		self.clone()
119	}
120}
121
122impl ColumnWithName {
123	pub fn int1(name: impl Into<Fragment>, data: impl IntoIterator<Item = i8>) -> Self {
124		ColumnWithName {
125			name: name.into(),
126			data: ColumnBuffer::int1(data),
127		}
128	}
129
130	pub fn int1_with_bitvec(
131		name: impl Into<Fragment>,
132		data: impl IntoIterator<Item = i8>,
133		bitvec: impl Into<BitVec>,
134	) -> Self {
135		ColumnWithName {
136			name: name.into(),
137			data: ColumnBuffer::int1_with_bitvec(data, bitvec),
138		}
139	}
140
141	pub fn int2(name: impl Into<Fragment>, data: impl IntoIterator<Item = i16>) -> Self {
142		ColumnWithName {
143			name: name.into(),
144			data: ColumnBuffer::int2(data),
145		}
146	}
147
148	pub fn int2_with_bitvec(
149		name: impl Into<Fragment>,
150		data: impl IntoIterator<Item = i16>,
151		bitvec: impl Into<BitVec>,
152	) -> Self {
153		ColumnWithName {
154			name: name.into(),
155			data: ColumnBuffer::int2_with_bitvec(data, bitvec),
156		}
157	}
158
159	pub fn int4(name: impl Into<Fragment>, data: impl IntoIterator<Item = i32>) -> Self {
160		ColumnWithName {
161			name: name.into(),
162			data: ColumnBuffer::int4(data),
163		}
164	}
165
166	pub fn int4_with_bitvec(
167		name: impl Into<Fragment>,
168		data: impl IntoIterator<Item = i32>,
169		bitvec: impl Into<BitVec>,
170	) -> Self {
171		ColumnWithName {
172			name: name.into(),
173			data: ColumnBuffer::int4_with_bitvec(data, bitvec),
174		}
175	}
176
177	pub fn int8(name: impl Into<Fragment>, data: impl IntoIterator<Item = i64>) -> Self {
178		ColumnWithName {
179			name: name.into(),
180			data: ColumnBuffer::int8(data),
181		}
182	}
183
184	pub fn int8_with_bitvec(
185		name: impl Into<Fragment>,
186		data: impl IntoIterator<Item = i64>,
187		bitvec: impl Into<BitVec>,
188	) -> Self {
189		ColumnWithName {
190			name: name.into(),
191			data: ColumnBuffer::int8_with_bitvec(data, bitvec),
192		}
193	}
194
195	pub fn int16(name: impl Into<Fragment>, data: impl IntoIterator<Item = i128>) -> Self {
196		ColumnWithName {
197			name: name.into(),
198			data: ColumnBuffer::int16(data),
199		}
200	}
201
202	pub fn int16_with_bitvec(
203		name: impl Into<Fragment>,
204		data: impl IntoIterator<Item = i128>,
205		bitvec: impl Into<BitVec>,
206	) -> Self {
207		ColumnWithName {
208			name: name.into(),
209			data: ColumnBuffer::int16_with_bitvec(data, bitvec),
210		}
211	}
212
213	pub fn uint1(name: impl Into<Fragment>, data: impl IntoIterator<Item = u8>) -> Self {
214		ColumnWithName {
215			name: name.into(),
216			data: ColumnBuffer::uint1(data),
217		}
218	}
219
220	pub fn uint1_with_bitvec(
221		name: impl Into<Fragment>,
222		data: impl IntoIterator<Item = u8>,
223		bitvec: impl Into<BitVec>,
224	) -> Self {
225		ColumnWithName {
226			name: name.into(),
227			data: ColumnBuffer::uint1_with_bitvec(data, bitvec),
228		}
229	}
230
231	pub fn uint2(name: impl Into<Fragment>, data: impl IntoIterator<Item = u16>) -> Self {
232		ColumnWithName {
233			name: name.into(),
234			data: ColumnBuffer::uint2(data),
235		}
236	}
237
238	pub fn uint2_with_bitvec(
239		name: impl Into<Fragment>,
240		data: impl IntoIterator<Item = u16>,
241		bitvec: impl Into<BitVec>,
242	) -> Self {
243		ColumnWithName {
244			name: name.into(),
245			data: ColumnBuffer::uint2_with_bitvec(data, bitvec),
246		}
247	}
248
249	pub fn uint4(name: impl Into<Fragment>, data: impl IntoIterator<Item = u32>) -> Self {
250		ColumnWithName {
251			name: name.into(),
252			data: ColumnBuffer::uint4(data),
253		}
254	}
255
256	pub fn uint4_with_bitvec(
257		name: impl Into<Fragment>,
258		data: impl IntoIterator<Item = u32>,
259		bitvec: impl Into<BitVec>,
260	) -> Self {
261		ColumnWithName {
262			name: name.into(),
263			data: ColumnBuffer::uint4_with_bitvec(data, bitvec),
264		}
265	}
266
267	pub fn uint8(name: impl Into<Fragment>, data: impl IntoIterator<Item = u64>) -> Self {
268		ColumnWithName {
269			name: name.into(),
270			data: ColumnBuffer::uint8(data),
271		}
272	}
273
274	pub fn uint8_with_bitvec(
275		name: impl Into<Fragment>,
276		data: impl IntoIterator<Item = u64>,
277		bitvec: impl Into<BitVec>,
278	) -> Self {
279		ColumnWithName {
280			name: name.into(),
281			data: ColumnBuffer::uint8_with_bitvec(data, bitvec),
282		}
283	}
284
285	pub fn uint16(name: impl Into<Fragment>, data: impl IntoIterator<Item = u128>) -> Self {
286		ColumnWithName {
287			name: name.into(),
288			data: ColumnBuffer::uint16(data),
289		}
290	}
291
292	pub fn uint16_with_bitvec(
293		name: impl Into<Fragment>,
294		data: impl IntoIterator<Item = u128>,
295		bitvec: impl Into<BitVec>,
296	) -> Self {
297		ColumnWithName {
298			name: name.into(),
299			data: ColumnBuffer::uint16_with_bitvec(data, bitvec),
300		}
301	}
302
303	pub fn float4(name: impl Into<Fragment>, data: impl IntoIterator<Item = f32>) -> Self {
304		ColumnWithName {
305			name: name.into(),
306			data: ColumnBuffer::float4(data),
307		}
308	}
309
310	pub fn float4_with_bitvec(
311		name: impl Into<Fragment>,
312		data: impl IntoIterator<Item = f32>,
313		bitvec: impl Into<BitVec>,
314	) -> Self {
315		ColumnWithName {
316			name: name.into(),
317			data: ColumnBuffer::float4_with_bitvec(data, bitvec),
318		}
319	}
320
321	pub fn float8(name: impl Into<Fragment>, data: impl IntoIterator<Item = f64>) -> Self {
322		ColumnWithName {
323			name: name.into(),
324			data: ColumnBuffer::float8(data),
325		}
326	}
327
328	pub fn float8_with_bitvec(
329		name: impl Into<Fragment>,
330		data: impl IntoIterator<Item = f64>,
331		bitvec: impl Into<BitVec>,
332	) -> Self {
333		ColumnWithName {
334			name: name.into(),
335			data: ColumnBuffer::float8_with_bitvec(data, bitvec),
336		}
337	}
338
339	pub fn bool(name: impl Into<Fragment>, data: impl IntoIterator<Item = bool>) -> Self {
340		ColumnWithName {
341			name: name.into(),
342			data: ColumnBuffer::bool(data),
343		}
344	}
345
346	pub fn bool_with_bitvec(
347		name: impl Into<Fragment>,
348		data: impl IntoIterator<Item = bool>,
349		bitvec: impl Into<BitVec>,
350	) -> Self {
351		ColumnWithName {
352			name: name.into(),
353			data: ColumnBuffer::bool_with_bitvec(data, bitvec),
354		}
355	}
356
357	pub fn utf8(name: impl Into<Fragment>, data: impl IntoIterator<Item = String>) -> Self {
358		ColumnWithName {
359			name: name.into(),
360			data: ColumnBuffer::utf8(data),
361		}
362	}
363
364	pub fn utf8_with_bitvec(
365		name: impl Into<Fragment>,
366		data: impl IntoIterator<Item = String>,
367		bitvec: impl Into<BitVec>,
368	) -> Self {
369		ColumnWithName {
370			name: name.into(),
371			data: ColumnBuffer::utf8_with_bitvec(data, bitvec),
372		}
373	}
374
375	pub fn uuid4(name: impl Into<Fragment>, data: impl IntoIterator<Item = Uuid4>) -> Self {
376		ColumnWithName {
377			name: name.into(),
378			data: ColumnBuffer::uuid4(data),
379		}
380	}
381
382	pub fn uuid4_with_bitvec(
383		name: impl Into<Fragment>,
384		data: impl IntoIterator<Item = Uuid4>,
385		bitvec: impl Into<BitVec>,
386	) -> Self {
387		ColumnWithName {
388			name: name.into(),
389			data: ColumnBuffer::uuid4_with_bitvec(data, bitvec),
390		}
391	}
392
393	pub fn uuid7(name: impl Into<Fragment>, data: impl IntoIterator<Item = Uuid7>) -> Self {
394		ColumnWithName {
395			name: name.into(),
396			data: ColumnBuffer::uuid7(data),
397		}
398	}
399
400	pub fn uuid7_with_bitvec(
401		name: impl Into<Fragment>,
402		data: impl IntoIterator<Item = Uuid7>,
403		bitvec: impl Into<BitVec>,
404	) -> Self {
405		ColumnWithName {
406			name: name.into(),
407			data: ColumnBuffer::uuid7_with_bitvec(data, bitvec),
408		}
409	}
410
411	pub fn dictionary_id(name: impl Into<Fragment>, data: impl IntoIterator<Item = DictionaryEntryId>) -> Self {
412		ColumnWithName {
413			name: name.into(),
414			data: ColumnBuffer::dictionary_id(data),
415		}
416	}
417
418	pub fn dictionary_id_with_bitvec(
419		name: impl Into<Fragment>,
420		data: impl IntoIterator<Item = DictionaryEntryId>,
421		bitvec: impl Into<BitVec>,
422	) -> Self {
423		ColumnWithName {
424			name: name.into(),
425			data: ColumnBuffer::dictionary_id_with_bitvec(data, bitvec),
426		}
427	}
428
429	pub fn undefined_typed(name: impl Into<Fragment>, ty: Type, row_count: usize) -> Self {
430		ColumnWithName {
431			name: name.into(),
432			data: ColumnBuffer::none_typed(ty, row_count),
433		}
434	}
435}