Skip to main content

reifydb_core/value/column/
mod.rs

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