Skip to main content

reifydb_core/value/column/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use std::fmt;
5
6use reifydb_value::{
7	fragment::Fragment,
8	util::bitvec::BitVec,
9	value::{
10		dictionary::DictionaryEntryId,
11		uuid::{Uuid4, Uuid7},
12		value_type::ValueType,
13	},
14};
15
16use crate::value::column::{buffer::ColumnBuffer, data::Column};
17
18pub mod buffer;
19pub mod cast;
20pub mod columns;
21pub mod data;
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	pub fn from_column(name: impl Into<Fragment>, column: Column) -> Self {
69		let buffer = column
70			.to_canonical()
71			.map(|c| c.to_buffer())
72			.unwrap_or_else(|_| panic!("ColumnWithName::from_column: to_canonical failed"));
73		Self {
74			name: name.into(),
75			data: buffer,
76		}
77	}
78
79	pub fn get_type(&self) -> ValueType {
80		self.data.get_type()
81	}
82
83	pub fn with_new_data(&self, data: ColumnBuffer) -> ColumnWithName {
84		ColumnWithName {
85			name: self.name.clone(),
86			data,
87		}
88	}
89
90	pub fn name(&self) -> &Fragment {
91		&self.name
92	}
93
94	pub fn name_owned(&self) -> Fragment {
95		self.name.clone()
96	}
97
98	pub fn data(&self) -> &ColumnBuffer {
99		&self.data
100	}
101
102	pub fn data_mut(&mut self) -> &mut ColumnBuffer {
103		&mut self.data
104	}
105
106	pub fn column(&self) -> Column {
107		Column::from_column_buffer(self.data.clone())
108	}
109
110	pub fn to_static(&self) -> ColumnWithName {
111		self.clone()
112	}
113}
114
115impl ColumnWithName {
116	pub fn int1(name: impl Into<Fragment>, data: impl IntoIterator<Item = i8>) -> Self {
117		ColumnWithName {
118			name: name.into(),
119			data: ColumnBuffer::int1(data),
120		}
121	}
122
123	pub fn int1_with_bitvec(
124		name: impl Into<Fragment>,
125		data: impl IntoIterator<Item = i8>,
126		bitvec: impl Into<BitVec>,
127	) -> Self {
128		ColumnWithName {
129			name: name.into(),
130			data: ColumnBuffer::int1_with_bitvec(data, bitvec),
131		}
132	}
133
134	pub fn int2(name: impl Into<Fragment>, data: impl IntoIterator<Item = i16>) -> Self {
135		ColumnWithName {
136			name: name.into(),
137			data: ColumnBuffer::int2(data),
138		}
139	}
140
141	pub fn int2_with_bitvec(
142		name: impl Into<Fragment>,
143		data: impl IntoIterator<Item = i16>,
144		bitvec: impl Into<BitVec>,
145	) -> Self {
146		ColumnWithName {
147			name: name.into(),
148			data: ColumnBuffer::int2_with_bitvec(data, bitvec),
149		}
150	}
151
152	pub fn int4(name: impl Into<Fragment>, data: impl IntoIterator<Item = i32>) -> Self {
153		ColumnWithName {
154			name: name.into(),
155			data: ColumnBuffer::int4(data),
156		}
157	}
158
159	pub fn int4_with_bitvec(
160		name: impl Into<Fragment>,
161		data: impl IntoIterator<Item = i32>,
162		bitvec: impl Into<BitVec>,
163	) -> Self {
164		ColumnWithName {
165			name: name.into(),
166			data: ColumnBuffer::int4_with_bitvec(data, bitvec),
167		}
168	}
169
170	pub fn int8(name: impl Into<Fragment>, data: impl IntoIterator<Item = i64>) -> Self {
171		ColumnWithName {
172			name: name.into(),
173			data: ColumnBuffer::int8(data),
174		}
175	}
176
177	pub fn int8_with_bitvec(
178		name: impl Into<Fragment>,
179		data: impl IntoIterator<Item = i64>,
180		bitvec: impl Into<BitVec>,
181	) -> Self {
182		ColumnWithName {
183			name: name.into(),
184			data: ColumnBuffer::int8_with_bitvec(data, bitvec),
185		}
186	}
187
188	pub fn int16(name: impl Into<Fragment>, data: impl IntoIterator<Item = i128>) -> Self {
189		ColumnWithName {
190			name: name.into(),
191			data: ColumnBuffer::int16(data),
192		}
193	}
194
195	pub fn int16_with_bitvec(
196		name: impl Into<Fragment>,
197		data: impl IntoIterator<Item = i128>,
198		bitvec: impl Into<BitVec>,
199	) -> Self {
200		ColumnWithName {
201			name: name.into(),
202			data: ColumnBuffer::int16_with_bitvec(data, bitvec),
203		}
204	}
205
206	pub fn uint1(name: impl Into<Fragment>, data: impl IntoIterator<Item = u8>) -> Self {
207		ColumnWithName {
208			name: name.into(),
209			data: ColumnBuffer::uint1(data),
210		}
211	}
212
213	pub fn uint1_with_bitvec(
214		name: impl Into<Fragment>,
215		data: impl IntoIterator<Item = u8>,
216		bitvec: impl Into<BitVec>,
217	) -> Self {
218		ColumnWithName {
219			name: name.into(),
220			data: ColumnBuffer::uint1_with_bitvec(data, bitvec),
221		}
222	}
223
224	pub fn uint2(name: impl Into<Fragment>, data: impl IntoIterator<Item = u16>) -> Self {
225		ColumnWithName {
226			name: name.into(),
227			data: ColumnBuffer::uint2(data),
228		}
229	}
230
231	pub fn uint2_with_bitvec(
232		name: impl Into<Fragment>,
233		data: impl IntoIterator<Item = u16>,
234		bitvec: impl Into<BitVec>,
235	) -> Self {
236		ColumnWithName {
237			name: name.into(),
238			data: ColumnBuffer::uint2_with_bitvec(data, bitvec),
239		}
240	}
241
242	pub fn uint4(name: impl Into<Fragment>, data: impl IntoIterator<Item = u32>) -> Self {
243		ColumnWithName {
244			name: name.into(),
245			data: ColumnBuffer::uint4(data),
246		}
247	}
248
249	pub fn uint4_with_bitvec(
250		name: impl Into<Fragment>,
251		data: impl IntoIterator<Item = u32>,
252		bitvec: impl Into<BitVec>,
253	) -> Self {
254		ColumnWithName {
255			name: name.into(),
256			data: ColumnBuffer::uint4_with_bitvec(data, bitvec),
257		}
258	}
259
260	pub fn uint8(name: impl Into<Fragment>, data: impl IntoIterator<Item = u64>) -> Self {
261		ColumnWithName {
262			name: name.into(),
263			data: ColumnBuffer::uint8(data),
264		}
265	}
266
267	pub fn uint8_with_bitvec(
268		name: impl Into<Fragment>,
269		data: impl IntoIterator<Item = u64>,
270		bitvec: impl Into<BitVec>,
271	) -> Self {
272		ColumnWithName {
273			name: name.into(),
274			data: ColumnBuffer::uint8_with_bitvec(data, bitvec),
275		}
276	}
277
278	pub fn uint16(name: impl Into<Fragment>, data: impl IntoIterator<Item = u128>) -> Self {
279		ColumnWithName {
280			name: name.into(),
281			data: ColumnBuffer::uint16(data),
282		}
283	}
284
285	pub fn uint16_with_bitvec(
286		name: impl Into<Fragment>,
287		data: impl IntoIterator<Item = u128>,
288		bitvec: impl Into<BitVec>,
289	) -> Self {
290		ColumnWithName {
291			name: name.into(),
292			data: ColumnBuffer::uint16_with_bitvec(data, bitvec),
293		}
294	}
295
296	pub fn float4(name: impl Into<Fragment>, data: impl IntoIterator<Item = f32>) -> Self {
297		ColumnWithName {
298			name: name.into(),
299			data: ColumnBuffer::float4(data),
300		}
301	}
302
303	pub fn float4_with_bitvec(
304		name: impl Into<Fragment>,
305		data: impl IntoIterator<Item = f32>,
306		bitvec: impl Into<BitVec>,
307	) -> Self {
308		ColumnWithName {
309			name: name.into(),
310			data: ColumnBuffer::float4_with_bitvec(data, bitvec),
311		}
312	}
313
314	pub fn float8(name: impl Into<Fragment>, data: impl IntoIterator<Item = f64>) -> Self {
315		ColumnWithName {
316			name: name.into(),
317			data: ColumnBuffer::float8(data),
318		}
319	}
320
321	pub fn float8_with_bitvec(
322		name: impl Into<Fragment>,
323		data: impl IntoIterator<Item = f64>,
324		bitvec: impl Into<BitVec>,
325	) -> Self {
326		ColumnWithName {
327			name: name.into(),
328			data: ColumnBuffer::float8_with_bitvec(data, bitvec),
329		}
330	}
331
332	pub fn bool(name: impl Into<Fragment>, data: impl IntoIterator<Item = bool>) -> Self {
333		ColumnWithName {
334			name: name.into(),
335			data: ColumnBuffer::bool(data),
336		}
337	}
338
339	pub fn bool_with_bitvec(
340		name: impl Into<Fragment>,
341		data: impl IntoIterator<Item = bool>,
342		bitvec: impl Into<BitVec>,
343	) -> Self {
344		ColumnWithName {
345			name: name.into(),
346			data: ColumnBuffer::bool_with_bitvec(data, bitvec),
347		}
348	}
349
350	pub fn utf8(name: impl Into<Fragment>, data: impl IntoIterator<Item = String>) -> Self {
351		ColumnWithName {
352			name: name.into(),
353			data: ColumnBuffer::utf8(data),
354		}
355	}
356
357	pub fn utf8_with_bitvec(
358		name: impl Into<Fragment>,
359		data: impl IntoIterator<Item = String>,
360		bitvec: impl Into<BitVec>,
361	) -> Self {
362		ColumnWithName {
363			name: name.into(),
364			data: ColumnBuffer::utf8_with_bitvec(data, bitvec),
365		}
366	}
367
368	pub fn uuid4(name: impl Into<Fragment>, data: impl IntoIterator<Item = Uuid4>) -> Self {
369		ColumnWithName {
370			name: name.into(),
371			data: ColumnBuffer::uuid4(data),
372		}
373	}
374
375	pub fn uuid4_with_bitvec(
376		name: impl Into<Fragment>,
377		data: impl IntoIterator<Item = Uuid4>,
378		bitvec: impl Into<BitVec>,
379	) -> Self {
380		ColumnWithName {
381			name: name.into(),
382			data: ColumnBuffer::uuid4_with_bitvec(data, bitvec),
383		}
384	}
385
386	pub fn uuid7(name: impl Into<Fragment>, data: impl IntoIterator<Item = Uuid7>) -> Self {
387		ColumnWithName {
388			name: name.into(),
389			data: ColumnBuffer::uuid7(data),
390		}
391	}
392
393	pub fn uuid7_with_bitvec(
394		name: impl Into<Fragment>,
395		data: impl IntoIterator<Item = Uuid7>,
396		bitvec: impl Into<BitVec>,
397	) -> Self {
398		ColumnWithName {
399			name: name.into(),
400			data: ColumnBuffer::uuid7_with_bitvec(data, bitvec),
401		}
402	}
403
404	pub fn dictionary_id(name: impl Into<Fragment>, data: impl IntoIterator<Item = DictionaryEntryId>) -> Self {
405		ColumnWithName {
406			name: name.into(),
407			data: ColumnBuffer::dictionary_id(data),
408		}
409	}
410
411	pub fn dictionary_id_with_bitvec(
412		name: impl Into<Fragment>,
413		data: impl IntoIterator<Item = DictionaryEntryId>,
414		bitvec: impl Into<BitVec>,
415	) -> Self {
416		ColumnWithName {
417			name: name.into(),
418			data: ColumnBuffer::dictionary_id_with_bitvec(data, bitvec),
419		}
420	}
421
422	pub fn undefined_typed(name: impl Into<Fragment>, ty: ValueType, row_count: usize) -> Self {
423		ColumnWithName {
424			name: name.into(),
425			data: ColumnBuffer::none_typed(ty, row_count),
426		}
427	}
428}