reifydb_core/value/column/data/
factory.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use reifydb_type::{Blob, Date, DateTime, Decimal, Duration, IdentityId, Int, RowNumber, Time, Uint, Uuid4, Uuid7};
5
6use crate::{
7	BitVec,
8	value::{
9		column::ColumnData,
10		container::{
11			AnyContainer, BlobContainer, BoolContainer, IdentityIdContainer, NumberContainer,
12			RowNumberContainer, TemporalContainer, UndefinedContainer, Utf8Container, UuidContainer,
13		},
14	},
15};
16
17impl ColumnData {
18	pub fn bool(data: impl IntoIterator<Item = bool>) -> Self {
19		let data = data.into_iter().collect::<Vec<_>>();
20		ColumnData::Bool(BoolContainer::from_vec(data))
21	}
22
23	pub fn bool_optional(data: impl IntoIterator<Item = Option<bool>>) -> Self {
24		let mut values = Vec::new();
25		let mut bitvec = Vec::new();
26
27		for opt in data {
28			match opt {
29				Some(value) => {
30					values.push(value);
31					bitvec.push(true);
32				}
33				None => {
34					values.push(false);
35					bitvec.push(false);
36				}
37			}
38		}
39
40		ColumnData::Bool(BoolContainer::new(values, BitVec::from(bitvec)))
41	}
42
43	pub fn bool_with_capacity(capacity: usize) -> Self {
44		ColumnData::Bool(BoolContainer::with_capacity(capacity))
45	}
46
47	pub fn bool_with_bitvec(data: impl IntoIterator<Item = bool>, bitvec: impl Into<BitVec>) -> Self {
48		let data = data.into_iter().collect::<Vec<_>>();
49		let bitvec = bitvec.into();
50		assert_eq!(bitvec.len(), data.len());
51		ColumnData::Bool(BoolContainer::new(data, bitvec))
52	}
53
54	pub fn float4(data: impl IntoIterator<Item = f32>) -> Self {
55		let data = data.into_iter().collect::<Vec<_>>();
56		ColumnData::Float4(NumberContainer::from_vec(data))
57	}
58
59	pub fn float4_optional(data: impl IntoIterator<Item = Option<f32>>) -> Self {
60		let mut values = Vec::new();
61		let mut bitvec = Vec::new();
62
63		for opt in data {
64			match opt {
65				Some(value) => {
66					values.push(value);
67					bitvec.push(true);
68				}
69				None => {
70					values.push(0.0);
71					bitvec.push(false);
72				}
73			}
74		}
75
76		ColumnData::Float4(NumberContainer::new(values, BitVec::from(bitvec)))
77	}
78
79	pub fn float4_with_capacity(capacity: usize) -> Self {
80		ColumnData::Float4(NumberContainer::with_capacity(capacity))
81	}
82
83	pub fn float4_with_bitvec(data: impl IntoIterator<Item = f32>, bitvec: impl Into<BitVec>) -> Self {
84		let data = data.into_iter().collect::<Vec<_>>();
85		let bitvec = bitvec.into();
86		assert_eq!(bitvec.len(), data.len());
87		ColumnData::Float4(NumberContainer::new(data, bitvec))
88	}
89
90	pub fn float8(data: impl IntoIterator<Item = f64>) -> Self {
91		let data = data.into_iter().collect::<Vec<_>>();
92		ColumnData::Float8(NumberContainer::from_vec(data))
93	}
94
95	pub fn float8_optional(data: impl IntoIterator<Item = Option<f64>>) -> Self {
96		let mut values = Vec::new();
97		let mut bitvec = Vec::new();
98
99		for opt in data {
100			match opt {
101				Some(value) => {
102					values.push(value);
103					bitvec.push(true);
104				}
105				None => {
106					values.push(0.0);
107					bitvec.push(false);
108				}
109			}
110		}
111
112		ColumnData::Float8(NumberContainer::new(values, BitVec::from(bitvec)))
113	}
114
115	pub fn float8_with_capacity(capacity: usize) -> Self {
116		ColumnData::Float8(NumberContainer::with_capacity(capacity))
117	}
118
119	pub fn float8_with_bitvec(data: impl IntoIterator<Item = f64>, bitvec: impl Into<BitVec>) -> Self {
120		let data = data.into_iter().collect::<Vec<_>>();
121		let bitvec = bitvec.into();
122		assert_eq!(bitvec.len(), data.len());
123		ColumnData::Float8(NumberContainer::new(data, bitvec))
124	}
125
126	pub fn int1(data: impl IntoIterator<Item = i8>) -> Self {
127		let data = data.into_iter().collect::<Vec<_>>();
128		ColumnData::Int1(NumberContainer::from_vec(data))
129	}
130
131	pub fn int1_optional(data: impl IntoIterator<Item = Option<i8>>) -> Self {
132		let mut values = Vec::new();
133		let mut bitvec = Vec::new();
134
135		for opt in data {
136			match opt {
137				Some(value) => {
138					values.push(value);
139					bitvec.push(true);
140				}
141				None => {
142					values.push(0);
143					bitvec.push(false);
144				}
145			}
146		}
147
148		ColumnData::Int1(NumberContainer::new(values, BitVec::from(bitvec)))
149	}
150
151	pub fn int1_with_capacity(capacity: usize) -> Self {
152		ColumnData::Int1(NumberContainer::with_capacity(capacity))
153	}
154
155	pub fn int1_with_bitvec(data: impl IntoIterator<Item = i8>, bitvec: impl Into<BitVec>) -> Self {
156		let data = data.into_iter().collect::<Vec<_>>();
157		let bitvec = bitvec.into();
158		assert_eq!(bitvec.len(), data.len());
159		ColumnData::Int1(NumberContainer::new(data, bitvec))
160	}
161
162	pub fn int2(data: impl IntoIterator<Item = i16>) -> Self {
163		let data = data.into_iter().collect::<Vec<_>>();
164		ColumnData::Int2(NumberContainer::from_vec(data))
165	}
166
167	pub fn int2_optional(data: impl IntoIterator<Item = Option<i16>>) -> Self {
168		let mut values = Vec::new();
169		let mut bitvec = Vec::new();
170
171		for opt in data {
172			match opt {
173				Some(value) => {
174					values.push(value);
175					bitvec.push(true);
176				}
177				None => {
178					values.push(0);
179					bitvec.push(false);
180				}
181			}
182		}
183
184		ColumnData::Int2(NumberContainer::new(values, BitVec::from(bitvec)))
185	}
186
187	pub fn int2_with_capacity(capacity: usize) -> Self {
188		ColumnData::Int2(NumberContainer::with_capacity(capacity))
189	}
190
191	pub fn int2_with_bitvec(data: impl IntoIterator<Item = i16>, bitvec: impl Into<BitVec>) -> Self {
192		let data = data.into_iter().collect::<Vec<_>>();
193		let bitvec = bitvec.into();
194		assert_eq!(bitvec.len(), data.len());
195		ColumnData::Int2(NumberContainer::new(data, bitvec))
196	}
197
198	pub fn int4(data: impl IntoIterator<Item = i32>) -> Self {
199		let data = data.into_iter().collect::<Vec<_>>();
200		ColumnData::Int4(NumberContainer::from_vec(data))
201	}
202
203	pub fn int4_optional(data: impl IntoIterator<Item = Option<i32>>) -> Self {
204		let mut values = Vec::new();
205		let mut bitvec = Vec::new();
206
207		for opt in data {
208			match opt {
209				Some(value) => {
210					values.push(value);
211					bitvec.push(true);
212				}
213				None => {
214					values.push(0);
215					bitvec.push(false);
216				}
217			}
218		}
219
220		ColumnData::Int4(NumberContainer::new(values, BitVec::from(bitvec)))
221	}
222
223	pub fn int4_with_capacity(capacity: usize) -> Self {
224		ColumnData::Int4(NumberContainer::with_capacity(capacity))
225	}
226
227	pub fn int4_with_bitvec(data: impl IntoIterator<Item = i32>, bitvec: impl Into<BitVec>) -> Self {
228		let data = data.into_iter().collect::<Vec<_>>();
229		let bitvec = bitvec.into();
230		assert_eq!(bitvec.len(), data.len());
231		ColumnData::Int4(NumberContainer::new(data, bitvec))
232	}
233
234	pub fn int8(data: impl IntoIterator<Item = i64>) -> Self {
235		let data = data.into_iter().collect::<Vec<_>>();
236		ColumnData::Int8(NumberContainer::from_vec(data))
237	}
238
239	pub fn int8_optional(data: impl IntoIterator<Item = Option<i64>>) -> Self {
240		let mut values = Vec::new();
241		let mut bitvec = Vec::new();
242
243		for opt in data {
244			match opt {
245				Some(value) => {
246					values.push(value);
247					bitvec.push(true);
248				}
249				None => {
250					values.push(0);
251					bitvec.push(false);
252				}
253			}
254		}
255
256		ColumnData::Int8(NumberContainer::new(values, BitVec::from(bitvec)))
257	}
258
259	pub fn int8_with_capacity(capacity: usize) -> Self {
260		ColumnData::Int8(NumberContainer::with_capacity(capacity))
261	}
262
263	pub fn int8_with_bitvec(data: impl IntoIterator<Item = i64>, bitvec: impl Into<BitVec>) -> Self {
264		let data = data.into_iter().collect::<Vec<_>>();
265		let bitvec = bitvec.into();
266		assert_eq!(bitvec.len(), data.len());
267		ColumnData::Int8(NumberContainer::new(data, bitvec))
268	}
269
270	pub fn int16(data: impl IntoIterator<Item = i128>) -> Self {
271		let data = data.into_iter().collect::<Vec<_>>();
272		ColumnData::Int16(NumberContainer::from_vec(data))
273	}
274
275	pub fn int16_optional(data: impl IntoIterator<Item = Option<i128>>) -> Self {
276		let mut values = Vec::new();
277		let mut bitvec = Vec::new();
278
279		for opt in data {
280			match opt {
281				Some(value) => {
282					values.push(value);
283					bitvec.push(true);
284				}
285				None => {
286					values.push(0);
287					bitvec.push(false);
288				}
289			}
290		}
291
292		ColumnData::Int16(NumberContainer::new(values, BitVec::from(bitvec)))
293	}
294
295	pub fn int16_with_capacity(capacity: usize) -> Self {
296		ColumnData::Int16(NumberContainer::with_capacity(capacity))
297	}
298
299	pub fn int16_with_bitvec(data: impl IntoIterator<Item = i128>, bitvec: impl Into<BitVec>) -> Self {
300		let data = data.into_iter().collect::<Vec<_>>();
301		let bitvec = bitvec.into();
302		assert_eq!(bitvec.len(), data.len());
303		ColumnData::Int16(NumberContainer::new(data, bitvec))
304	}
305
306	pub fn utf8(data: impl IntoIterator<Item = impl Into<String>>) -> Self {
307		use reifydb_type::value::constraint::bytes::MaxBytes;
308		let data = data.into_iter().map(|c| c.into()).collect::<Vec<_>>();
309		ColumnData::Utf8 {
310			container: Utf8Container::from_vec(data),
311			max_bytes: MaxBytes::MAX,
312		}
313	}
314
315	pub fn utf8_optional(data: impl IntoIterator<Item = Option<String>>) -> Self {
316		use reifydb_type::value::constraint::bytes::MaxBytes;
317		let mut values = Vec::new();
318		let mut bitvec = Vec::new();
319
320		for opt in data {
321			match opt {
322				Some(value) => {
323					values.push(value);
324					bitvec.push(true);
325				}
326				None => {
327					values.push(String::new());
328					bitvec.push(false);
329				}
330			}
331		}
332
333		ColumnData::Utf8 {
334			container: Utf8Container::new(values, BitVec::from(bitvec)),
335			max_bytes: MaxBytes::MAX,
336		}
337	}
338
339	pub fn utf8_with_capacity(capacity: usize) -> Self {
340		use reifydb_type::value::constraint::bytes::MaxBytes;
341		ColumnData::Utf8 {
342			container: Utf8Container::with_capacity(capacity),
343			max_bytes: MaxBytes::MAX,
344		}
345	}
346
347	pub fn utf8_with_bitvec<'a>(
348		data: impl IntoIterator<Item = impl Into<String>>,
349		bitvec: impl Into<BitVec>,
350	) -> Self {
351		use reifydb_type::value::constraint::bytes::MaxBytes;
352		let data = data.into_iter().map(Into::into).collect::<Vec<_>>();
353		let bitvec = bitvec.into();
354		assert_eq!(bitvec.len(), data.len());
355		ColumnData::Utf8 {
356			container: Utf8Container::new(data, bitvec),
357			max_bytes: MaxBytes::MAX,
358		}
359	}
360
361	pub fn uint1(data: impl IntoIterator<Item = u8>) -> Self {
362		let data = data.into_iter().collect::<Vec<_>>();
363		ColumnData::Uint1(NumberContainer::from_vec(data))
364	}
365
366	pub fn uint1_optional(data: impl IntoIterator<Item = Option<u8>>) -> Self {
367		let mut values = Vec::new();
368		let mut bitvec = Vec::new();
369
370		for opt in data {
371			match opt {
372				Some(value) => {
373					values.push(value);
374					bitvec.push(true);
375				}
376				None => {
377					values.push(0);
378					bitvec.push(false);
379				}
380			}
381		}
382
383		ColumnData::Uint1(NumberContainer::new(values, BitVec::from(bitvec)))
384	}
385
386	pub fn uint1_with_capacity(capacity: usize) -> Self {
387		ColumnData::Uint1(NumberContainer::with_capacity(capacity))
388	}
389
390	pub fn uint1_with_bitvec(data: impl IntoIterator<Item = u8>, bitvec: impl Into<BitVec>) -> Self {
391		let data = data.into_iter().collect::<Vec<_>>();
392		let bitvec = bitvec.into();
393		assert_eq!(bitvec.len(), data.len());
394		ColumnData::Uint1(NumberContainer::new(data, bitvec))
395	}
396
397	pub fn uint2(data: impl IntoIterator<Item = u16>) -> Self {
398		let data = data.into_iter().collect::<Vec<_>>();
399		ColumnData::Uint2(NumberContainer::from_vec(data))
400	}
401
402	pub fn uint2_optional(data: impl IntoIterator<Item = Option<u16>>) -> Self {
403		let mut values = Vec::new();
404		let mut bitvec = Vec::new();
405
406		for opt in data {
407			match opt {
408				Some(value) => {
409					values.push(value);
410					bitvec.push(true);
411				}
412				None => {
413					values.push(0);
414					bitvec.push(false);
415				}
416			}
417		}
418
419		ColumnData::Uint2(NumberContainer::new(values, BitVec::from(bitvec)))
420	}
421
422	pub fn uint2_with_capacity(capacity: usize) -> Self {
423		ColumnData::Uint2(NumberContainer::with_capacity(capacity))
424	}
425
426	pub fn uint2_with_bitvec(data: impl IntoIterator<Item = u16>, bitvec: impl Into<BitVec>) -> Self {
427		let data = data.into_iter().collect::<Vec<_>>();
428		let bitvec = bitvec.into();
429		assert_eq!(bitvec.len(), data.len());
430		ColumnData::Uint2(NumberContainer::new(data, bitvec))
431	}
432
433	pub fn uint4(data: impl IntoIterator<Item = u32>) -> Self {
434		let data = data.into_iter().collect::<Vec<_>>();
435		ColumnData::Uint4(NumberContainer::from_vec(data))
436	}
437
438	pub fn uint4_optional(data: impl IntoIterator<Item = Option<u32>>) -> Self {
439		let mut values = Vec::new();
440		let mut bitvec = Vec::new();
441
442		for opt in data {
443			match opt {
444				Some(value) => {
445					values.push(value);
446					bitvec.push(true);
447				}
448				None => {
449					values.push(0);
450					bitvec.push(false);
451				}
452			}
453		}
454
455		ColumnData::Uint4(NumberContainer::new(values, BitVec::from(bitvec)))
456	}
457
458	pub fn uint4_with_capacity(capacity: usize) -> Self {
459		ColumnData::Uint4(NumberContainer::with_capacity(capacity))
460	}
461
462	pub fn uint4_with_bitvec(data: impl IntoIterator<Item = u32>, bitvec: impl Into<BitVec>) -> Self {
463		let data = data.into_iter().collect::<Vec<_>>();
464		let bitvec = bitvec.into();
465		assert_eq!(bitvec.len(), data.len());
466		ColumnData::Uint4(NumberContainer::new(data, bitvec))
467	}
468
469	pub fn uint8(data: impl IntoIterator<Item = u64>) -> Self {
470		let data = data.into_iter().collect::<Vec<_>>();
471		ColumnData::Uint8(NumberContainer::from_vec(data))
472	}
473
474	pub fn uint8_optional(data: impl IntoIterator<Item = Option<u64>>) -> Self {
475		let mut values = Vec::new();
476		let mut bitvec = Vec::new();
477
478		for opt in data {
479			match opt {
480				Some(value) => {
481					values.push(value);
482					bitvec.push(true);
483				}
484				None => {
485					values.push(0);
486					bitvec.push(false);
487				}
488			}
489		}
490
491		ColumnData::Uint8(NumberContainer::new(values, BitVec::from(bitvec)))
492	}
493
494	pub fn uint8_with_capacity(capacity: usize) -> Self {
495		ColumnData::Uint8(NumberContainer::with_capacity(capacity))
496	}
497
498	pub fn uint8_with_bitvec(data: impl IntoIterator<Item = u64>, bitvec: impl Into<BitVec>) -> Self {
499		let data = data.into_iter().collect::<Vec<_>>();
500		let bitvec = bitvec.into();
501		assert_eq!(bitvec.len(), data.len());
502		ColumnData::Uint8(NumberContainer::new(data, bitvec))
503	}
504
505	pub fn uint16(data: impl IntoIterator<Item = u128>) -> Self {
506		let data = data.into_iter().collect::<Vec<_>>();
507		ColumnData::Uint16(NumberContainer::from_vec(data))
508	}
509
510	pub fn uint16_optional(data: impl IntoIterator<Item = Option<u128>>) -> Self {
511		let mut values = Vec::new();
512		let mut bitvec = Vec::new();
513
514		for opt in data {
515			match opt {
516				Some(value) => {
517					values.push(value);
518					bitvec.push(true);
519				}
520				None => {
521					values.push(0);
522					bitvec.push(false);
523				}
524			}
525		}
526
527		ColumnData::Uint16(NumberContainer::new(values, BitVec::from(bitvec)))
528	}
529
530	pub fn uint16_with_capacity(capacity: usize) -> Self {
531		ColumnData::Uint16(NumberContainer::with_capacity(capacity))
532	}
533
534	pub fn uint16_with_bitvec(data: impl IntoIterator<Item = u128>, bitvec: impl Into<BitVec>) -> Self {
535		let data = data.into_iter().collect::<Vec<_>>();
536		let bitvec = bitvec.into();
537		assert_eq!(bitvec.len(), data.len());
538		ColumnData::Uint16(NumberContainer::new(data, bitvec))
539	}
540
541	pub fn date(data: impl IntoIterator<Item = Date>) -> Self {
542		let data = data.into_iter().collect::<Vec<_>>();
543		ColumnData::Date(TemporalContainer::from_vec(data))
544	}
545
546	pub fn date_optional(data: impl IntoIterator<Item = Option<Date>>) -> Self {
547		let mut values = Vec::new();
548		let mut bitvec = Vec::new();
549
550		for opt in data {
551			match opt {
552				Some(value) => {
553					values.push(value);
554					bitvec.push(true);
555				}
556				None => {
557					values.push(Date::default());
558					bitvec.push(false);
559				}
560			}
561		}
562
563		ColumnData::Date(TemporalContainer::new(values, BitVec::from(bitvec)))
564	}
565
566	pub fn date_with_capacity(capacity: usize) -> Self {
567		ColumnData::Date(TemporalContainer::with_capacity(capacity))
568	}
569
570	pub fn date_with_bitvec(data: impl IntoIterator<Item = Date>, bitvec: impl Into<BitVec>) -> Self {
571		let data = data.into_iter().collect::<Vec<_>>();
572		let bitvec = bitvec.into();
573		assert_eq!(bitvec.len(), data.len());
574		ColumnData::Date(TemporalContainer::new(data, bitvec))
575	}
576
577	pub fn datetime(data: impl IntoIterator<Item = DateTime>) -> Self {
578		let data = data.into_iter().collect::<Vec<_>>();
579		ColumnData::DateTime(TemporalContainer::from_vec(data))
580	}
581
582	pub fn datetime_optional(data: impl IntoIterator<Item = Option<DateTime>>) -> Self {
583		let mut values = Vec::new();
584		let mut bitvec = Vec::new();
585
586		for opt in data {
587			match opt {
588				Some(value) => {
589					values.push(value);
590					bitvec.push(true);
591				}
592				None => {
593					values.push(DateTime::default());
594					bitvec.push(false);
595				}
596			}
597		}
598
599		ColumnData::DateTime(TemporalContainer::new(values, BitVec::from(bitvec)))
600	}
601
602	pub fn datetime_with_capacity(capacity: usize) -> Self {
603		ColumnData::DateTime(TemporalContainer::with_capacity(capacity))
604	}
605
606	pub fn datetime_with_bitvec(data: impl IntoIterator<Item = DateTime>, bitvec: impl Into<BitVec>) -> Self {
607		let data = data.into_iter().collect::<Vec<_>>();
608		let bitvec = bitvec.into();
609		assert_eq!(bitvec.len(), data.len());
610		ColumnData::DateTime(TemporalContainer::new(data, bitvec))
611	}
612
613	pub fn time(data: impl IntoIterator<Item = Time>) -> Self {
614		let data = data.into_iter().collect::<Vec<_>>();
615		ColumnData::Time(TemporalContainer::from_vec(data))
616	}
617
618	pub fn time_optional(data: impl IntoIterator<Item = Option<Time>>) -> Self {
619		let mut values = Vec::new();
620		let mut bitvec = Vec::new();
621
622		for opt in data {
623			match opt {
624				Some(value) => {
625					values.push(value);
626					bitvec.push(true);
627				}
628				None => {
629					values.push(Time::default());
630					bitvec.push(false);
631				}
632			}
633		}
634
635		ColumnData::Time(TemporalContainer::new(values, BitVec::from(bitvec)))
636	}
637
638	pub fn time_with_capacity(capacity: usize) -> Self {
639		ColumnData::Time(TemporalContainer::with_capacity(capacity))
640	}
641
642	pub fn time_with_bitvec(data: impl IntoIterator<Item = Time>, bitvec: impl Into<BitVec>) -> Self {
643		let data = data.into_iter().collect::<Vec<_>>();
644		let bitvec = bitvec.into();
645		assert_eq!(bitvec.len(), data.len());
646		ColumnData::Time(TemporalContainer::new(data, bitvec))
647	}
648
649	pub fn duration(data: impl IntoIterator<Item = Duration>) -> Self {
650		let data = data.into_iter().collect::<Vec<_>>();
651		ColumnData::Duration(TemporalContainer::from_vec(data))
652	}
653
654	pub fn duration_optional(data: impl IntoIterator<Item = Option<Duration>>) -> Self {
655		let mut values = Vec::new();
656		let mut bitvec = Vec::new();
657
658		for opt in data {
659			match opt {
660				Some(value) => {
661					values.push(value);
662					bitvec.push(true);
663				}
664				None => {
665					values.push(Duration::default());
666					bitvec.push(false);
667				}
668			}
669		}
670
671		ColumnData::Duration(TemporalContainer::new(values, BitVec::from(bitvec)))
672	}
673
674	pub fn duration_with_capacity(capacity: usize) -> Self {
675		ColumnData::Duration(TemporalContainer::with_capacity(capacity))
676	}
677
678	pub fn duration_with_bitvec(data: impl IntoIterator<Item = Duration>, bitvec: impl Into<BitVec>) -> Self {
679		let data = data.into_iter().collect::<Vec<_>>();
680		let bitvec = bitvec.into();
681		assert_eq!(bitvec.len(), data.len());
682		ColumnData::Duration(TemporalContainer::new(data, bitvec))
683	}
684
685	pub fn uuid4(data: impl IntoIterator<Item = Uuid4>) -> Self {
686		let data = data.into_iter().collect::<Vec<_>>();
687		ColumnData::Uuid4(UuidContainer::from_vec(data))
688	}
689
690	pub fn uuid4_optional(data: impl IntoIterator<Item = Option<Uuid4>>) -> Self {
691		let mut values = Vec::new();
692		let mut bitvec = Vec::new();
693
694		for opt in data {
695			match opt {
696				Some(value) => {
697					values.push(value);
698					bitvec.push(true);
699				}
700				None => {
701					values.push(Uuid4::default());
702					bitvec.push(false);
703				}
704			}
705		}
706
707		ColumnData::Uuid4(UuidContainer::new(values, BitVec::from(bitvec)))
708	}
709
710	pub fn uuid4_with_capacity(capacity: usize) -> Self {
711		ColumnData::Uuid4(UuidContainer::with_capacity(capacity))
712	}
713
714	pub fn uuid4_with_bitvec(data: impl IntoIterator<Item = Uuid4>, bitvec: impl Into<BitVec>) -> Self {
715		let data = data.into_iter().collect::<Vec<_>>();
716		let bitvec = bitvec.into();
717		assert_eq!(bitvec.len(), data.len());
718		ColumnData::Uuid4(UuidContainer::new(data, bitvec))
719	}
720
721	pub fn uuid7(data: impl IntoIterator<Item = Uuid7>) -> Self {
722		let data = data.into_iter().collect::<Vec<_>>();
723		ColumnData::Uuid7(UuidContainer::from_vec(data))
724	}
725
726	pub fn uuid7_optional(data: impl IntoIterator<Item = Option<Uuid7>>) -> Self {
727		let mut values = Vec::new();
728		let mut bitvec = Vec::new();
729
730		for opt in data {
731			match opt {
732				Some(value) => {
733					values.push(value);
734					bitvec.push(true);
735				}
736				None => {
737					values.push(Uuid7::default());
738					bitvec.push(false);
739				}
740			}
741		}
742
743		ColumnData::Uuid7(UuidContainer::new(values, BitVec::from(bitvec)))
744	}
745
746	pub fn uuid7_with_capacity(capacity: usize) -> Self {
747		ColumnData::Uuid7(UuidContainer::with_capacity(capacity))
748	}
749
750	pub fn uuid7_with_bitvec(data: impl IntoIterator<Item = Uuid7>, bitvec: impl Into<BitVec>) -> Self {
751		let data = data.into_iter().collect::<Vec<_>>();
752		let bitvec = bitvec.into();
753		assert_eq!(bitvec.len(), data.len());
754		ColumnData::Uuid7(UuidContainer::new(data, bitvec))
755	}
756
757	pub fn blob(data: impl IntoIterator<Item = Blob>) -> Self {
758		use reifydb_type::value::constraint::bytes::MaxBytes;
759		let data = data.into_iter().collect::<Vec<_>>();
760		ColumnData::Blob {
761			container: BlobContainer::from_vec(data),
762			max_bytes: MaxBytes::MAX,
763		}
764	}
765
766	pub fn blob_optional(data: impl IntoIterator<Item = Option<Blob>>) -> Self {
767		use reifydb_type::value::constraint::bytes::MaxBytes;
768		let mut values = Vec::new();
769		let mut bitvec = Vec::new();
770
771		for opt in data {
772			match opt {
773				Some(value) => {
774					values.push(value);
775					bitvec.push(true);
776				}
777				None => {
778					values.push(Blob::default());
779					bitvec.push(false);
780				}
781			}
782		}
783
784		ColumnData::Blob {
785			container: BlobContainer::new(values, BitVec::from(bitvec)),
786			max_bytes: MaxBytes::MAX,
787		}
788	}
789
790	pub fn blob_with_capacity(capacity: usize) -> Self {
791		use reifydb_type::value::constraint::bytes::MaxBytes;
792		ColumnData::Blob {
793			container: BlobContainer::with_capacity(capacity),
794			max_bytes: MaxBytes::MAX,
795		}
796	}
797
798	pub fn blob_with_bitvec(data: impl IntoIterator<Item = Blob>, bitvec: impl Into<BitVec>) -> Self {
799		use reifydb_type::value::constraint::bytes::MaxBytes;
800		let data = data.into_iter().collect::<Vec<_>>();
801		let bitvec = bitvec.into();
802		assert_eq!(bitvec.len(), data.len());
803		ColumnData::Blob {
804			container: BlobContainer::new(data, bitvec),
805			max_bytes: MaxBytes::MAX,
806		}
807	}
808
809	pub fn row_number(row_numbers: impl IntoIterator<Item = RowNumber>) -> Self {
810		let data = row_numbers.into_iter().collect::<Vec<_>>();
811		ColumnData::RowNumber(RowNumberContainer::from_vec(data))
812	}
813
814	pub fn row_number_optional(row_numbers: impl IntoIterator<Item = Option<RowNumber>>) -> Self {
815		let mut values = Vec::new();
816		let mut bitvec = Vec::new();
817
818		for opt in row_numbers {
819			match opt {
820				Some(value) => {
821					values.push(value);
822					bitvec.push(true);
823				}
824				None => {
825					values.push(RowNumber::default());
826					bitvec.push(false);
827				}
828			}
829		}
830
831		ColumnData::RowNumber(RowNumberContainer::new(values, BitVec::from(bitvec)))
832	}
833
834	pub fn row_number_with_capacity(capacity: usize) -> Self {
835		ColumnData::RowNumber(RowNumberContainer::with_capacity(capacity))
836	}
837
838	pub fn row_number_with_bitvec(
839		row_numbers: impl IntoIterator<Item = RowNumber>,
840		bitvec: impl Into<BitVec>,
841	) -> Self {
842		let data = row_numbers.into_iter().collect::<Vec<_>>();
843		let bitvec = bitvec.into();
844		assert_eq!(bitvec.len(), data.len());
845		ColumnData::RowNumber(RowNumberContainer::new(data, bitvec))
846	}
847
848	pub fn identity_id(identity_ids: impl IntoIterator<Item = IdentityId>) -> Self {
849		let data = identity_ids.into_iter().collect::<Vec<_>>();
850		ColumnData::IdentityId(IdentityIdContainer::from_vec(data))
851	}
852
853	pub fn identity_id_optional(identity_ids: impl IntoIterator<Item = Option<IdentityId>>) -> Self {
854		let mut values = Vec::new();
855		let mut bitvec = Vec::new();
856
857		for opt in identity_ids {
858			match opt {
859				Some(value) => {
860					values.push(value);
861					bitvec.push(true);
862				}
863				None => {
864					values.push(IdentityId::default());
865					bitvec.push(false);
866				}
867			}
868		}
869
870		ColumnData::IdentityId(IdentityIdContainer::new(values, BitVec::from(bitvec)))
871	}
872
873	pub fn identity_id_with_capacity(capacity: usize) -> Self {
874		ColumnData::IdentityId(IdentityIdContainer::with_capacity(capacity))
875	}
876
877	pub fn identity_id_with_bitvec(
878		identity_ids: impl IntoIterator<Item = IdentityId>,
879		bitvec: impl Into<BitVec>,
880	) -> Self {
881		let data = identity_ids.into_iter().collect::<Vec<_>>();
882		let bitvec = bitvec.into();
883		assert_eq!(bitvec.len(), data.len());
884		ColumnData::IdentityId(IdentityIdContainer::new(data, bitvec))
885	}
886
887	pub fn int(data: impl IntoIterator<Item = Int>) -> Self {
888		use reifydb_type::value::constraint::bytes::MaxBytes;
889		let data = data.into_iter().collect::<Vec<_>>();
890		ColumnData::Int {
891			container: NumberContainer::from_vec(data),
892			max_bytes: MaxBytes::MAX,
893		}
894	}
895
896	pub fn int_optional(data: impl IntoIterator<Item = Option<Int>>) -> Self {
897		use reifydb_type::value::constraint::bytes::MaxBytes;
898		let mut values = Vec::new();
899		let mut bitvec = Vec::new();
900
901		for opt in data {
902			match opt {
903				Some(value) => {
904					values.push(value);
905					bitvec.push(true);
906				}
907				None => {
908					values.push(Int::default());
909					bitvec.push(false);
910				}
911			}
912		}
913
914		ColumnData::Int {
915			container: NumberContainer::new(values, BitVec::from(bitvec)),
916			max_bytes: MaxBytes::MAX,
917		}
918	}
919
920	pub fn uint(data: impl IntoIterator<Item = Uint>) -> Self {
921		use reifydb_type::value::constraint::bytes::MaxBytes;
922		let data = data.into_iter().collect::<Vec<_>>();
923		ColumnData::Uint {
924			container: NumberContainer::from_vec(data),
925			max_bytes: MaxBytes::MAX,
926		}
927	}
928
929	pub fn uint_optional(data: impl IntoIterator<Item = Option<Uint>>) -> Self {
930		use reifydb_type::value::constraint::bytes::MaxBytes;
931		let mut values = Vec::new();
932		let mut bitvec = Vec::new();
933
934		for opt in data {
935			match opt {
936				Some(value) => {
937					values.push(value);
938					bitvec.push(true);
939				}
940				None => {
941					values.push(Uint::default());
942					bitvec.push(false);
943				}
944			}
945		}
946
947		ColumnData::Uint {
948			container: NumberContainer::new(values, BitVec::from(bitvec)),
949			max_bytes: MaxBytes::MAX,
950		}
951	}
952
953	pub fn int_with_capacity(capacity: usize) -> Self {
954		use reifydb_type::value::constraint::bytes::MaxBytes;
955		ColumnData::Int {
956			container: NumberContainer::with_capacity(capacity),
957			max_bytes: MaxBytes::MAX,
958		}
959	}
960
961	pub fn uint_with_capacity(capacity: usize) -> Self {
962		use reifydb_type::value::constraint::bytes::MaxBytes;
963		ColumnData::Uint {
964			container: NumberContainer::with_capacity(capacity),
965			max_bytes: MaxBytes::MAX,
966		}
967	}
968
969	pub fn int_with_bitvec(data: impl IntoIterator<Item = Int>, bitvec: impl Into<BitVec>) -> Self {
970		use reifydb_type::value::constraint::bytes::MaxBytes;
971		let data = data.into_iter().collect::<Vec<_>>();
972		let bitvec = bitvec.into();
973		assert_eq!(bitvec.len(), data.len());
974		ColumnData::Int {
975			container: NumberContainer::new(data, bitvec),
976			max_bytes: MaxBytes::MAX,
977		}
978	}
979
980	pub fn uint_with_bitvec(data: impl IntoIterator<Item = Uint>, bitvec: impl Into<BitVec>) -> Self {
981		use reifydb_type::value::constraint::bytes::MaxBytes;
982		let data = data.into_iter().collect::<Vec<_>>();
983		let bitvec = bitvec.into();
984		assert_eq!(bitvec.len(), data.len());
985		ColumnData::Uint {
986			container: NumberContainer::new(data, bitvec),
987			max_bytes: MaxBytes::MAX,
988		}
989	}
990
991	pub fn decimal(data: impl IntoIterator<Item = Decimal>) -> Self {
992		use reifydb_type::value::constraint::{precision::Precision, scale::Scale};
993		let data = data.into_iter().collect::<Vec<_>>();
994		ColumnData::Decimal {
995			container: NumberContainer::from_vec(data),
996			precision: Precision::MAX,
997			scale: Scale::new(0),
998		}
999	}
1000
1001	pub fn decimal_optional(data: impl IntoIterator<Item = Option<Decimal>>) -> Self {
1002		use reifydb_type::value::constraint::{precision::Precision, scale::Scale};
1003		let mut values = Vec::new();
1004		let mut bitvec = Vec::new();
1005
1006		for opt in data {
1007			match opt {
1008				Some(value) => {
1009					values.push(value);
1010					bitvec.push(true);
1011				}
1012				None => {
1013					values.push(Decimal::default());
1014					bitvec.push(false);
1015				}
1016			}
1017		}
1018
1019		ColumnData::Decimal {
1020			container: NumberContainer::new(values, BitVec::from(bitvec)),
1021			precision: Precision::MAX,
1022			scale: Scale::new(0),
1023		}
1024	}
1025
1026	pub fn decimal_with_capacity(capacity: usize) -> Self {
1027		use reifydb_type::value::constraint::{precision::Precision, scale::Scale};
1028		ColumnData::Decimal {
1029			container: NumberContainer::with_capacity(capacity),
1030			precision: Precision::MAX,
1031			scale: Scale::new(0),
1032		}
1033	}
1034
1035	pub fn decimal_with_bitvec(data: impl IntoIterator<Item = Decimal>, bitvec: impl Into<BitVec>) -> Self {
1036		use reifydb_type::value::constraint::{precision::Precision, scale::Scale};
1037		let data = data.into_iter().collect::<Vec<_>>();
1038		let bitvec = bitvec.into();
1039		assert_eq!(bitvec.len(), data.len());
1040		ColumnData::Decimal {
1041			container: NumberContainer::new(data, bitvec),
1042			precision: Precision::MAX,
1043			scale: Scale::new(0),
1044		}
1045	}
1046
1047	pub fn any(data: impl IntoIterator<Item = Box<reifydb_type::Value>>) -> Self {
1048		let data = data.into_iter().collect::<Vec<_>>();
1049		ColumnData::Any(AnyContainer::from_vec(data))
1050	}
1051
1052	pub fn any_optional(data: impl IntoIterator<Item = Option<Box<reifydb_type::Value>>>) -> Self {
1053		let mut values = Vec::new();
1054		let mut bitvec = Vec::new();
1055
1056		for opt in data {
1057			match opt {
1058				Some(value) => {
1059					values.push(value);
1060					bitvec.push(true);
1061				}
1062				None => {
1063					values.push(Box::new(reifydb_type::Value::Undefined));
1064					bitvec.push(false);
1065				}
1066			}
1067		}
1068
1069		ColumnData::Any(AnyContainer::new(values, BitVec::from(bitvec)))
1070	}
1071
1072	pub fn any_with_capacity(capacity: usize) -> Self {
1073		ColumnData::Any(AnyContainer::with_capacity(capacity))
1074	}
1075
1076	pub fn any_with_bitvec(
1077		data: impl IntoIterator<Item = Box<reifydb_type::Value>>,
1078		bitvec: impl Into<BitVec>,
1079	) -> Self {
1080		let data = data.into_iter().collect::<Vec<_>>();
1081		let bitvec = bitvec.into();
1082		assert_eq!(bitvec.len(), data.len());
1083		ColumnData::Any(AnyContainer::new(data, bitvec))
1084	}
1085
1086	pub fn undefined(len: usize) -> Self {
1087		ColumnData::Undefined(UndefinedContainer::new(len))
1088	}
1089}