1use reifydb_type::{
5 storage::DataBitVec,
6 util::bitvec::BitVec,
7 value::{
8 Value,
9 blob::Blob,
10 date::Date,
11 datetime::DateTime,
12 decimal::Decimal,
13 dictionary::DictionaryEntryId,
14 duration::Duration,
15 identity::IdentityId,
16 int::Int,
17 time::Time,
18 uint::Uint,
19 uuid::{Uuid4, Uuid7},
20 },
21};
22
23use crate::value::column::buffer::{ColumnBuffer, with_container};
24
25macro_rules! push_or_promote {
26 (@wrap_option $self:expr, $new_col:expr, $len:expr) => {
27 if $len > 0 {
28 let mut bitvec = BitVec::repeat($len, false);
29 DataBitVec::push(&mut bitvec, true);
30 *$self = ColumnBuffer::Option {
31 inner: Box::new($new_col),
32 bitvec,
33 };
34 } else {
35 *$self = $new_col;
36 }
37 };
38
39 ($self:expr, $val:expr, $col_variant:ident, $factory_expr:expr) => {
40 match $self {
41 ColumnBuffer::$col_variant(_) => $self.push($val),
42 _ => unimplemented!(),
43 }
44 };
45
46 (struct $self:expr, $val:expr, $col_variant:ident, $factory_expr:expr) => {
47 match $self {
48 ColumnBuffer::$col_variant {
49 ..
50 } => $self.push($val),
51 _ => unimplemented!(),
52 }
53 };
54
55 (direct $self:expr, $val:expr, $col_variant:ident, $factory_expr:expr) => {
56 match $self {
57 ColumnBuffer::$col_variant(container) => container.push($val),
58 _ => unimplemented!(),
59 }
60 };
61
62 (struct_direct $self:expr, $val:expr, $col_variant:ident, $factory_expr:expr) => {
63 match $self {
64 ColumnBuffer::$col_variant {
65 container,
66 ..
67 } => container.push($val),
68 _ => unimplemented!(),
69 }
70 };
71}
72
73impl ColumnBuffer {
74 pub fn push_value(&mut self, value: Value) {
75 if let ColumnBuffer::Option {
76 inner,
77 bitvec,
78 } = self
79 {
80 if matches!(value, Value::None { .. }) {
81 with_container!(inner.as_mut(), |c| c.push_default());
82 DataBitVec::push(bitvec, false);
83 } else if DataBitVec::count_ones(bitvec) == 0 {
84 let len = inner.len();
85
86 let mut new_inner = match &value {
87 Value::Boolean(_) => ColumnBuffer::bool(vec![false; len]),
88 Value::Float4(_) => ColumnBuffer::float4(vec![0.0f32; len]),
89 Value::Float8(_) => ColumnBuffer::float8(vec![0.0f64; len]),
90 Value::Int1(_) => ColumnBuffer::int1(vec![0i8; len]),
91 Value::Int2(_) => ColumnBuffer::int2(vec![0i16; len]),
92 Value::Int4(_) => ColumnBuffer::int4(vec![0i32; len]),
93 Value::Int8(_) => ColumnBuffer::int8(vec![0i64; len]),
94 Value::Int16(_) => ColumnBuffer::int16(vec![0i128; len]),
95 Value::Uint1(_) => ColumnBuffer::uint1(vec![0u8; len]),
96 Value::Uint2(_) => ColumnBuffer::uint2(vec![0u16; len]),
97 Value::Uint4(_) => ColumnBuffer::uint4(vec![0u32; len]),
98 Value::Uint8(_) => ColumnBuffer::uint8(vec![0u64; len]),
99 Value::Uint16(_) => ColumnBuffer::uint16(vec![0u128; len]),
100 Value::Utf8(_) => ColumnBuffer::utf8(vec![String::new(); len]),
101 Value::Date(_) => ColumnBuffer::date(vec![Date::default(); len]),
102 Value::DateTime(_) => ColumnBuffer::datetime(vec![DateTime::default(); len]),
103 Value::Time(_) => ColumnBuffer::time(vec![Time::default(); len]),
104 Value::Duration(_) => ColumnBuffer::duration(vec![Duration::default(); len]),
105 Value::Uuid4(_) => ColumnBuffer::uuid4(vec![Uuid4::default(); len]),
106 Value::Uuid7(_) => ColumnBuffer::uuid7(vec![Uuid7::default(); len]),
107 Value::IdentityId(_) => {
108 ColumnBuffer::identity_id(vec![IdentityId::default(); len])
109 }
110 Value::DictionaryId(_) => {
111 ColumnBuffer::dictionary_id(vec![DictionaryEntryId::default(); len])
112 }
113 Value::Blob(_) => ColumnBuffer::blob(vec![Blob::default(); len]),
114 Value::Int(_) => ColumnBuffer::int(vec![Int::default(); len]),
115 Value::Uint(_) => ColumnBuffer::uint(vec![Uint::default(); len]),
116 Value::Decimal(_) => ColumnBuffer::decimal(vec![Decimal::default(); len]),
117 Value::Any(_) => ColumnBuffer::any(vec![Box::new(Value::none()); len]),
118 Value::Record(_) => ColumnBuffer::any(vec![Box::new(Value::none()); len]),
119 Value::Tuple(_) => ColumnBuffer::any(vec![Box::new(Value::none()); len]),
120 _ => unreachable!(),
121 };
122 new_inner.push_value(value);
123 if len > 0 {
124 let mut new_bitvec = BitVec::repeat(len, false);
125 DataBitVec::push(&mut new_bitvec, true);
126 *self = ColumnBuffer::Option {
127 inner: Box::new(new_inner),
128 bitvec: new_bitvec,
129 };
130 } else {
131 *self = new_inner;
132 }
133 } else {
134 inner.push_value(value);
135 DataBitVec::push(bitvec, true);
136 }
137 return;
138 }
139 match value {
140 Value::Boolean(v) => push_or_promote!(self, v, Bool, ColumnBuffer::bool(vec![])),
141 Value::Float4(v) => push_or_promote!(self, v.value(), Float4, ColumnBuffer::float4(vec![])),
142 Value::Float8(v) => push_or_promote!(self, v.value(), Float8, ColumnBuffer::float8(vec![])),
143 Value::Int1(v) => push_or_promote!(self, v, Int1, ColumnBuffer::int1(vec![])),
144 Value::Int2(v) => push_or_promote!(self, v, Int2, ColumnBuffer::int2(vec![])),
145 Value::Int4(v) => push_or_promote!(self, v, Int4, ColumnBuffer::int4(vec![])),
146 Value::Int8(v) => push_or_promote!(self, v, Int8, ColumnBuffer::int8(vec![])),
147 Value::Int16(v) => push_or_promote!(self, v, Int16, ColumnBuffer::int16(vec![])),
148 Value::Uint1(v) => push_or_promote!(self, v, Uint1, ColumnBuffer::uint1(vec![])),
149 Value::Uint2(v) => push_or_promote!(self, v, Uint2, ColumnBuffer::uint2(vec![])),
150 Value::Uint4(v) => push_or_promote!(self, v, Uint4, ColumnBuffer::uint4(vec![])),
151 Value::Uint8(v) => push_or_promote!(self, v, Uint8, ColumnBuffer::uint8(vec![])),
152 Value::Uint16(v) => push_or_promote!(self, v, Uint16, ColumnBuffer::uint16(vec![])),
153 Value::Utf8(v) => {
154 push_or_promote!(struct self, v, Utf8, ColumnBuffer::utf8(Vec::<String>::new()))
155 }
156 Value::Date(v) => push_or_promote!(self, v, Date, ColumnBuffer::date(vec![])),
157 Value::DateTime(v) => push_or_promote!(self, v, DateTime, ColumnBuffer::datetime(vec![])),
158 Value::Time(v) => push_or_promote!(self, v, Time, ColumnBuffer::time(vec![])),
159 Value::Duration(v) => push_or_promote!(self, v, Duration, ColumnBuffer::duration(vec![])),
160 Value::Uuid4(v) => push_or_promote!(self, v, Uuid4, ColumnBuffer::uuid4(vec![])),
161 Value::Uuid7(v) => push_or_promote!(self, v, Uuid7, ColumnBuffer::uuid7(vec![])),
162 Value::IdentityId(v) => {
163 push_or_promote!(direct self, v, IdentityId, ColumnBuffer::identity_id(vec![]))
164 }
165 Value::DictionaryId(v) => {
166 push_or_promote!(direct self, v, DictionaryId, ColumnBuffer::dictionary_id(vec![]))
167 }
168 Value::Blob(v) => push_or_promote!(struct_direct self, v, Blob, ColumnBuffer::blob(vec![])),
169 Value::Int(v) => push_or_promote!(struct_direct self, v, Int, ColumnBuffer::int(vec![])),
170 Value::Uint(v) => push_or_promote!(struct_direct self, v, Uint, ColumnBuffer::uint(vec![])),
171 Value::Decimal(v) => {
172 push_or_promote!(struct_direct self, v, Decimal, ColumnBuffer::decimal(vec![]))
173 }
174 Value::None {
175 ..
176 } => self.push_none(),
177 Value::Type(t) => self.push_value(Value::Any(Box::new(Value::Type(t)))),
178 Value::List(v) => self.push_value(Value::Any(Box::new(Value::List(v)))),
179 Value::Record(v) => self.push_value(Value::Any(Box::new(Value::Record(v)))),
180 Value::Tuple(v) => self.push_value(Value::Any(Box::new(Value::Tuple(v)))),
181 Value::Any(v) => match self {
182 ColumnBuffer::Any(container) => container.push(v),
183 _ => unreachable!("Cannot push Any value to non-Any column"),
184 },
185 }
186 }
187}
188
189#[cfg(test)]
190#[allow(clippy::approx_constant)]
191pub mod tests {
192 use reifydb_runtime::context::{
193 clock::{Clock, MockClock},
194 rng::Rng,
195 };
196 use reifydb_type::value::{
197 Value,
198 date::Date,
199 datetime::DateTime,
200 dictionary::DictionaryEntryId,
201 duration::Duration,
202 identity::IdentityId,
203 ordered_f32::OrderedF32,
204 ordered_f64::OrderedF64,
205 time::Time,
206 r#type::Type,
207 uuid::{Uuid4, Uuid7},
208 };
209
210 use crate::value::column::ColumnBuffer;
211
212 fn test_clock_and_rng() -> (MockClock, Clock, Rng) {
213 let mock = MockClock::from_millis(1000);
214 let clock = Clock::Mock(mock.clone());
215 let rng = Rng::seeded(42);
216 (mock, clock, rng)
217 }
218
219 #[test]
220 fn test_bool() {
221 let mut col = ColumnBuffer::bool(vec![true]);
222 col.push_value(Value::Boolean(false));
223 let ColumnBuffer::Bool(container) = col else {
224 panic!("Expected Bool");
225 };
226 assert_eq!(container.data().to_vec(), vec![true, false]);
227 }
228
229 #[test]
230 fn test_undefined_bool() {
231 let mut col = ColumnBuffer::bool(vec![true]);
232 col.push_value(Value::none());
233 assert_eq!(col.len(), 2);
235 assert!(col.is_defined(0));
236 assert!(!col.is_defined(1));
237 }
238
239 #[test]
240 fn test_push_value_to_none_bool() {
241 let mut col = ColumnBuffer::none_typed(Type::Boolean, 2);
242 col.push_value(Value::Boolean(true));
243 assert_eq!(col.len(), 3);
244 assert!(!col.is_defined(0));
245 assert!(!col.is_defined(1));
246 assert!(col.is_defined(2));
247 assert_eq!(col.get_value(2), Value::Boolean(true));
248 }
249
250 #[test]
251 fn test_float4() {
252 let mut col = ColumnBuffer::float4(vec![1.0]);
253 col.push_value(Value::Float4(OrderedF32::try_from(2.0).unwrap()));
254 let ColumnBuffer::Float4(container) = col else {
255 panic!("Expected Float4");
256 };
257 assert_eq!(container.data().as_slice(), &[1.0, 2.0]);
258 }
259
260 #[test]
261 fn test_undefined_float4() {
262 let mut col = ColumnBuffer::float4(vec![1.0]);
263 col.push_value(Value::none());
264 assert_eq!(col.len(), 2);
265 assert!(col.is_defined(0));
266 assert!(!col.is_defined(1));
267 }
268
269 #[test]
270 fn test_push_value_to_none_float4() {
271 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
272 col.push_value(Value::Float4(OrderedF32::try_from(3.14).unwrap()));
273 assert_eq!(col.len(), 2);
274 assert!(!col.is_defined(0));
275 assert!(col.is_defined(1));
276 }
277
278 #[test]
279 fn test_float8() {
280 let mut col = ColumnBuffer::float8(vec![1.0]);
281 col.push_value(Value::Float8(OrderedF64::try_from(2.0).unwrap()));
282 let ColumnBuffer::Float8(container) = col else {
283 panic!("Expected Float8");
284 };
285 assert_eq!(container.data().as_slice(), &[1.0, 2.0]);
286 }
287
288 #[test]
289 fn test_undefined_float8() {
290 let mut col = ColumnBuffer::float8(vec![1.0]);
291 col.push_value(Value::none());
292 assert_eq!(col.len(), 2);
293 assert!(col.is_defined(0));
294 assert!(!col.is_defined(1));
295 }
296
297 #[test]
298 fn test_push_value_to_none_float8() {
299 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
300 col.push_value(Value::Float8(OrderedF64::try_from(2.718).unwrap()));
301 assert_eq!(col.len(), 2);
302 assert!(!col.is_defined(0));
303 assert!(col.is_defined(1));
304 }
305
306 #[test]
307 fn test_int1() {
308 let mut col = ColumnBuffer::int1(vec![1]);
309 col.push_value(Value::Int1(2));
310 let ColumnBuffer::Int1(container) = col else {
311 panic!("Expected Int1");
312 };
313 assert_eq!(container.data().as_slice(), &[1, 2]);
314 }
315
316 #[test]
317 fn test_undefined_int1() {
318 let mut col = ColumnBuffer::int1(vec![1]);
319 col.push_value(Value::none());
320 assert_eq!(col.len(), 2);
321 assert!(col.is_defined(0));
322 assert!(!col.is_defined(1));
323 }
324
325 #[test]
326 fn test_push_value_to_none_int1() {
327 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
328 col.push_value(Value::Int1(5));
329 assert_eq!(col.len(), 2);
330 assert!(!col.is_defined(0));
331 assert!(col.is_defined(1));
332 assert_eq!(col.get_value(1), Value::Int1(5));
333 }
334
335 #[test]
336 fn test_int2() {
337 let mut col = ColumnBuffer::int2(vec![1]);
338 col.push_value(Value::Int2(3));
339 let ColumnBuffer::Int2(container) = col else {
340 panic!("Expected Int2");
341 };
342 assert_eq!(container.data().as_slice(), &[1, 3]);
343 }
344
345 #[test]
346 fn test_undefined_int2() {
347 let mut col = ColumnBuffer::int2(vec![1]);
348 col.push_value(Value::none());
349 assert_eq!(col.len(), 2);
350 assert!(col.is_defined(0));
351 assert!(!col.is_defined(1));
352 }
353
354 #[test]
355 fn test_push_value_to_none_int2() {
356 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
357 col.push_value(Value::Int2(10));
358 assert_eq!(col.len(), 2);
359 assert!(!col.is_defined(0));
360 assert!(col.is_defined(1));
361 assert_eq!(col.get_value(1), Value::Int2(10));
362 }
363
364 #[test]
365 fn test_int4() {
366 let mut col = ColumnBuffer::int4(vec![10]);
367 col.push_value(Value::Int4(20));
368 let ColumnBuffer::Int4(container) = col else {
369 panic!("Expected Int4");
370 };
371 assert_eq!(container.data().as_slice(), &[10, 20]);
372 }
373
374 #[test]
375 fn test_undefined_int4() {
376 let mut col = ColumnBuffer::int4(vec![10]);
377 col.push_value(Value::none());
378 assert_eq!(col.len(), 2);
379 assert!(col.is_defined(0));
380 assert!(!col.is_defined(1));
381 }
382
383 #[test]
384 fn test_push_value_to_none_int4() {
385 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
386 col.push_value(Value::Int4(20));
387 assert_eq!(col.len(), 2);
388 assert!(!col.is_defined(0));
389 assert!(col.is_defined(1));
390 assert_eq!(col.get_value(1), Value::Int4(20));
391 }
392
393 #[test]
394 fn test_int8() {
395 let mut col = ColumnBuffer::int8(vec![100]);
396 col.push_value(Value::Int8(200));
397 let ColumnBuffer::Int8(container) = col else {
398 panic!("Expected Int8");
399 };
400 assert_eq!(container.data().as_slice(), &[100, 200]);
401 }
402
403 #[test]
404 fn test_undefined_int8() {
405 let mut col = ColumnBuffer::int8(vec![100]);
406 col.push_value(Value::none());
407 assert_eq!(col.len(), 2);
408 assert!(col.is_defined(0));
409 assert!(!col.is_defined(1));
410 }
411
412 #[test]
413 fn test_push_value_to_none_int8() {
414 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
415 col.push_value(Value::Int8(30));
416 assert_eq!(col.len(), 2);
417 assert!(!col.is_defined(0));
418 assert!(col.is_defined(1));
419 assert_eq!(col.get_value(1), Value::Int8(30));
420 }
421
422 #[test]
423 fn test_int16() {
424 let mut col = ColumnBuffer::int16(vec![1000]);
425 col.push_value(Value::Int16(2000));
426 let ColumnBuffer::Int16(container) = col else {
427 panic!("Expected Int16");
428 };
429 assert_eq!(container.data().as_slice(), &[1000, 2000]);
430 }
431
432 #[test]
433 fn test_undefined_int16() {
434 let mut col = ColumnBuffer::int16(vec![1000]);
435 col.push_value(Value::none());
436 assert_eq!(col.len(), 2);
437 assert!(col.is_defined(0));
438 assert!(!col.is_defined(1));
439 }
440
441 #[test]
442 fn test_push_value_to_none_int16() {
443 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
444 col.push_value(Value::Int16(40));
445 assert_eq!(col.len(), 2);
446 assert!(!col.is_defined(0));
447 assert!(col.is_defined(1));
448 assert_eq!(col.get_value(1), Value::Int16(40));
449 }
450
451 #[test]
452 fn test_uint1() {
453 let mut col = ColumnBuffer::uint1(vec![1]);
454 col.push_value(Value::Uint1(2));
455 let ColumnBuffer::Uint1(container) = col else {
456 panic!("Expected Uint1");
457 };
458 assert_eq!(container.data().as_slice(), &[1, 2]);
459 }
460
461 #[test]
462 fn test_undefined_uint1() {
463 let mut col = ColumnBuffer::uint1(vec![1]);
464 col.push_value(Value::none());
465 assert_eq!(col.len(), 2);
466 assert!(col.is_defined(0));
467 assert!(!col.is_defined(1));
468 }
469
470 #[test]
471 fn test_push_value_to_none_uint1() {
472 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
473 col.push_value(Value::Uint1(1));
474 assert_eq!(col.len(), 2);
475 assert!(!col.is_defined(0));
476 assert!(col.is_defined(1));
477 assert_eq!(col.get_value(1), Value::Uint1(1));
478 }
479
480 #[test]
481 fn test_uint2() {
482 let mut col = ColumnBuffer::uint2(vec![10]);
483 col.push_value(Value::Uint2(20));
484 let ColumnBuffer::Uint2(container) = col else {
485 panic!("Expected Uint2");
486 };
487 assert_eq!(container.data().as_slice(), &[10, 20]);
488 }
489
490 #[test]
491 fn test_undefined_uint2() {
492 let mut col = ColumnBuffer::uint2(vec![10]);
493 col.push_value(Value::none());
494 assert_eq!(col.len(), 2);
495 assert!(col.is_defined(0));
496 assert!(!col.is_defined(1));
497 }
498
499 #[test]
500 fn test_push_value_to_none_uint2() {
501 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
502 col.push_value(Value::Uint2(2));
503 assert_eq!(col.len(), 2);
504 assert!(!col.is_defined(0));
505 assert!(col.is_defined(1));
506 assert_eq!(col.get_value(1), Value::Uint2(2));
507 }
508
509 #[test]
510 fn test_uint4() {
511 let mut col = ColumnBuffer::uint4(vec![100]);
512 col.push_value(Value::Uint4(200));
513 let ColumnBuffer::Uint4(container) = col else {
514 panic!("Expected Uint4");
515 };
516 assert_eq!(container.data().as_slice(), &[100, 200]);
517 }
518
519 #[test]
520 fn test_undefined_uint4() {
521 let mut col = ColumnBuffer::uint4(vec![100]);
522 col.push_value(Value::none());
523 assert_eq!(col.len(), 2);
524 assert!(col.is_defined(0));
525 assert!(!col.is_defined(1));
526 }
527
528 #[test]
529 fn test_push_value_to_none_uint4() {
530 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
531 col.push_value(Value::Uint4(3));
532 assert_eq!(col.len(), 2);
533 assert!(!col.is_defined(0));
534 assert!(col.is_defined(1));
535 assert_eq!(col.get_value(1), Value::Uint4(3));
536 }
537
538 #[test]
539 fn test_uint8() {
540 let mut col = ColumnBuffer::uint8(vec![1000]);
541 col.push_value(Value::Uint8(2000));
542 let ColumnBuffer::Uint8(container) = col else {
543 panic!("Expected Uint8");
544 };
545 assert_eq!(container.data().as_slice(), &[1000, 2000]);
546 }
547
548 #[test]
549 fn test_undefined_uint8() {
550 let mut col = ColumnBuffer::uint8(vec![1000]);
551 col.push_value(Value::none());
552 assert_eq!(col.len(), 2);
553 assert!(col.is_defined(0));
554 assert!(!col.is_defined(1));
555 }
556
557 #[test]
558 fn test_push_value_to_none_uint8() {
559 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
560 col.push_value(Value::Uint8(4));
561 assert_eq!(col.len(), 2);
562 assert!(!col.is_defined(0));
563 assert!(col.is_defined(1));
564 assert_eq!(col.get_value(1), Value::Uint8(4));
565 }
566
567 #[test]
568 fn test_uint16() {
569 let mut col = ColumnBuffer::uint16(vec![10000]);
570 col.push_value(Value::Uint16(20000));
571 let ColumnBuffer::Uint16(container) = col else {
572 panic!("Expected Uint16");
573 };
574 assert_eq!(container.data().as_slice(), &[10000, 20000]);
575 }
576
577 #[test]
578 fn test_undefined_uint16() {
579 let mut col = ColumnBuffer::uint16(vec![10000]);
580 col.push_value(Value::none());
581 assert_eq!(col.len(), 2);
582 assert!(col.is_defined(0));
583 assert!(!col.is_defined(1));
584 }
585
586 #[test]
587 fn test_push_value_to_none_uint16() {
588 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
589 col.push_value(Value::Uint16(5));
590 assert_eq!(col.len(), 2);
591 assert!(!col.is_defined(0));
592 assert!(col.is_defined(1));
593 assert_eq!(col.get_value(1), Value::Uint16(5));
594 }
595
596 #[test]
597 fn test_utf8() {
598 let mut col = ColumnBuffer::utf8(vec!["hello".to_string()]);
599 col.push_value(Value::Utf8("world".to_string()));
600 let ColumnBuffer::Utf8 {
601 container,
602 ..
603 } = col
604 else {
605 panic!("Expected Utf8");
606 };
607 let collected: Vec<&str> = container.iter_str().collect();
608 assert_eq!(collected, vec!["hello", "world"]);
609 }
610
611 #[test]
612 fn test_undefined_utf8() {
613 let mut col = ColumnBuffer::utf8(vec!["hello".to_string()]);
614 col.push_value(Value::none());
615 assert_eq!(col.len(), 2);
616 assert!(col.is_defined(0));
617 assert!(!col.is_defined(1));
618 }
619
620 #[test]
621 fn test_push_value_to_none_utf8() {
622 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
623 col.push_value(Value::Utf8("ok".to_string()));
624 assert_eq!(col.len(), 2);
625 assert!(!col.is_defined(0));
626 assert!(col.is_defined(1));
627 assert_eq!(col.get_value(1), Value::Utf8("ok".to_string()));
628 }
629
630 #[test]
631 fn test_undefined() {
632 let mut col = ColumnBuffer::int2(vec![1]);
633 col.push_value(Value::none());
634 assert_eq!(col.len(), 2);
635 assert!(col.is_defined(0));
636 assert!(!col.is_defined(1));
637 }
638
639 #[test]
640 fn test_date() {
641 let date1 = Date::from_ymd(2023, 1, 1).unwrap();
642 let date2 = Date::from_ymd(2023, 12, 31).unwrap();
643 let mut col = ColumnBuffer::date(vec![date1]);
644 col.push_value(Value::Date(date2));
645 let ColumnBuffer::Date(container) = col else {
646 panic!("Expected Date");
647 };
648 assert_eq!(container.data().as_slice(), &[date1, date2]);
649 }
650
651 #[test]
652 fn test_undefined_date() {
653 let date1 = Date::from_ymd(2023, 1, 1).unwrap();
654 let mut col = ColumnBuffer::date(vec![date1]);
655 col.push_value(Value::none());
656 assert_eq!(col.len(), 2);
657 assert!(col.is_defined(0));
658 assert!(!col.is_defined(1));
659 }
660
661 #[test]
662 fn test_push_value_to_none_date() {
663 let date = Date::from_ymd(2023, 6, 15).unwrap();
664 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
665 col.push_value(Value::Date(date));
666 assert_eq!(col.len(), 2);
667 assert!(!col.is_defined(0));
668 assert!(col.is_defined(1));
669 assert_eq!(col.get_value(1), Value::Date(date));
670 }
671
672 #[test]
673 fn test_datetime() {
674 let dt1 = DateTime::from_timestamp(1672531200).unwrap(); let dt2 = DateTime::from_timestamp(1704067200).unwrap(); let mut col = ColumnBuffer::datetime(vec![dt1]);
677 col.push_value(Value::DateTime(dt2));
678 let ColumnBuffer::DateTime(container) = col else {
679 panic!("Expected DateTime");
680 };
681 assert_eq!(container.data().as_slice(), &[dt1, dt2]);
682 }
683
684 #[test]
685 fn test_undefined_datetime() {
686 let dt1 = DateTime::from_timestamp(1672531200).unwrap();
687 let mut col = ColumnBuffer::datetime(vec![dt1]);
688 col.push_value(Value::none());
689 assert_eq!(col.len(), 2);
690 assert!(col.is_defined(0));
691 assert!(!col.is_defined(1));
692 }
693
694 #[test]
695 fn test_push_value_to_none_datetime() {
696 let dt = DateTime::from_timestamp(1672531200).unwrap();
697 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
698 col.push_value(Value::DateTime(dt));
699 assert_eq!(col.len(), 2);
700 assert!(!col.is_defined(0));
701 assert!(col.is_defined(1));
702 assert_eq!(col.get_value(1), Value::DateTime(dt));
703 }
704
705 #[test]
706 fn test_time() {
707 let time1 = Time::from_hms(12, 30, 0).unwrap();
708 let time2 = Time::from_hms(18, 45, 30).unwrap();
709 let mut col = ColumnBuffer::time(vec![time1]);
710 col.push_value(Value::Time(time2));
711 let ColumnBuffer::Time(container) = col else {
712 panic!("Expected Time");
713 };
714 assert_eq!(container.data().as_slice(), &[time1, time2]);
715 }
716
717 #[test]
718 fn test_undefined_time() {
719 let time1 = Time::from_hms(12, 30, 0).unwrap();
720 let mut col = ColumnBuffer::time(vec![time1]);
721 col.push_value(Value::none());
722 assert_eq!(col.len(), 2);
723 assert!(col.is_defined(0));
724 assert!(!col.is_defined(1));
725 }
726
727 #[test]
728 fn test_push_value_to_none_time() {
729 let time = Time::from_hms(15, 20, 10).unwrap();
730 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
731 col.push_value(Value::Time(time));
732 assert_eq!(col.len(), 2);
733 assert!(!col.is_defined(0));
734 assert!(col.is_defined(1));
735 assert_eq!(col.get_value(1), Value::Time(time));
736 }
737
738 #[test]
739 fn test_duration() {
740 let duration1 = Duration::from_days(30).unwrap();
741 let duration2 = Duration::from_hours(24).unwrap();
742 let mut col = ColumnBuffer::duration(vec![duration1]);
743 col.push_value(Value::Duration(duration2));
744 let ColumnBuffer::Duration(container) = col else {
745 panic!("Expected Duration");
746 };
747 assert_eq!(container.data().as_slice(), &[duration1, duration2]);
748 }
749
750 #[test]
751 fn test_undefined_duration() {
752 let duration1 = Duration::from_days(30).unwrap();
753 let mut col = ColumnBuffer::duration(vec![duration1]);
754 col.push_value(Value::none());
755 assert_eq!(col.len(), 2);
756 assert!(col.is_defined(0));
757 assert!(!col.is_defined(1));
758 }
759
760 #[test]
761 fn test_push_value_to_none_duration() {
762 let duration = Duration::from_minutes(90).unwrap();
763 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
764 col.push_value(Value::Duration(duration));
765 assert_eq!(col.len(), 2);
766 assert!(!col.is_defined(0));
767 assert!(col.is_defined(1));
768 assert_eq!(col.get_value(1), Value::Duration(duration));
769 }
770
771 #[test]
772 fn test_identity_id() {
773 let (mock, clock, rng) = test_clock_and_rng();
774 let id1 = IdentityId::generate(&clock, &rng);
775 mock.advance_millis(1);
776 let id2 = IdentityId::generate(&clock, &rng);
777 let mut col = ColumnBuffer::identity_id(vec![id1]);
778 col.push_value(Value::IdentityId(id2));
779 let ColumnBuffer::IdentityId(container) = col else {
780 panic!("Expected IdentityId");
781 };
782 assert_eq!(container.data().as_slice(), &[id1, id2]);
783 }
784
785 #[test]
786 fn test_undefined_identity_id() {
787 let (_, clock, rng) = test_clock_and_rng();
788 let id1 = IdentityId::generate(&clock, &rng);
789 let mut col = ColumnBuffer::identity_id(vec![id1]);
790 col.push_value(Value::none());
791 assert_eq!(col.len(), 2);
792 assert!(col.is_defined(0));
793 assert!(!col.is_defined(1));
794 }
795
796 #[test]
797 fn test_push_value_to_none_identity_id() {
798 let (_, clock, rng) = test_clock_and_rng();
799 let id = IdentityId::generate(&clock, &rng);
800 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
801 col.push_value(Value::IdentityId(id));
802 assert_eq!(col.len(), 2);
803 assert!(!col.is_defined(0));
804 assert!(col.is_defined(1));
805 assert_eq!(col.get_value(1), Value::IdentityId(id));
806 }
807
808 #[test]
809 fn test_uuid4() {
810 let uuid1 = Uuid4::generate();
811 let uuid2 = Uuid4::generate();
812 let mut col = ColumnBuffer::uuid4(vec![uuid1]);
813 col.push_value(Value::Uuid4(uuid2));
814 let ColumnBuffer::Uuid4(container) = col else {
815 panic!("Expected Uuid4");
816 };
817 assert_eq!(container.data().as_slice(), &[uuid1, uuid2]);
818 }
819
820 #[test]
821 fn test_undefined_uuid4() {
822 let uuid1 = Uuid4::generate();
823 let mut col = ColumnBuffer::uuid4(vec![uuid1]);
824 col.push_value(Value::none());
825 assert_eq!(col.len(), 2);
826 assert!(col.is_defined(0));
827 assert!(!col.is_defined(1));
828 }
829
830 #[test]
831 fn test_push_value_to_none_uuid4() {
832 let uuid = Uuid4::generate();
833 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
834 col.push_value(Value::Uuid4(uuid));
835 assert_eq!(col.len(), 2);
836 assert!(!col.is_defined(0));
837 assert!(col.is_defined(1));
838 assert_eq!(col.get_value(1), Value::Uuid4(uuid));
839 }
840
841 #[test]
842 fn test_uuid7() {
843 let (mock, clock, rng) = test_clock_and_rng();
844 let uuid1 = Uuid7::generate(&clock, &rng);
845 mock.advance_millis(1);
846 let uuid2 = Uuid7::generate(&clock, &rng);
847 let mut col = ColumnBuffer::uuid7(vec![uuid1]);
848 col.push_value(Value::Uuid7(uuid2));
849 let ColumnBuffer::Uuid7(container) = col else {
850 panic!("Expected Uuid7");
851 };
852 assert_eq!(container.data().as_slice(), &[uuid1, uuid2]);
853 }
854
855 #[test]
856 fn test_undefined_uuid7() {
857 let (_, clock, rng) = test_clock_and_rng();
858 let uuid1 = Uuid7::generate(&clock, &rng);
859 let mut col = ColumnBuffer::uuid7(vec![uuid1]);
860 col.push_value(Value::none());
861 assert_eq!(col.len(), 2);
862 assert!(col.is_defined(0));
863 assert!(!col.is_defined(1));
864 }
865
866 #[test]
867 fn test_push_value_to_none_uuid7() {
868 let (_, clock, rng) = test_clock_and_rng();
869 let uuid = Uuid7::generate(&clock, &rng);
870 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
871 col.push_value(Value::Uuid7(uuid));
872 assert_eq!(col.len(), 2);
873 assert!(!col.is_defined(0));
874 assert!(col.is_defined(1));
875 assert_eq!(col.get_value(1), Value::Uuid7(uuid));
876 }
877
878 #[test]
879 fn test_dictionary_id() {
880 let e1 = DictionaryEntryId::U4(10);
881 let e2 = DictionaryEntryId::U4(20);
882 let mut col = ColumnBuffer::dictionary_id(vec![e1]);
883 col.push_value(Value::DictionaryId(e2));
884 let ColumnBuffer::DictionaryId(container) = col else {
885 panic!("Expected DictionaryId");
886 };
887 assert_eq!(container.data().as_slice(), &[e1, e2]);
888 }
889
890 #[test]
891 fn test_undefined_dictionary_id() {
892 let e1 = DictionaryEntryId::U4(10);
893 let mut col = ColumnBuffer::dictionary_id(vec![e1]);
894 col.push_value(Value::none());
895 assert_eq!(col.len(), 2);
896 assert!(col.is_defined(0));
897 assert!(!col.is_defined(1));
898 }
899
900 #[test]
901 fn test_push_value_to_none_dictionary_id() {
902 let e = DictionaryEntryId::U4(42);
903 let mut col = ColumnBuffer::none_typed(Type::Boolean, 1);
904 col.push_value(Value::DictionaryId(e));
905 assert_eq!(col.len(), 2);
906 assert!(!col.is_defined(0));
907 assert!(col.is_defined(1));
908 assert_eq!(col.get_value(1), Value::DictionaryId(e));
909 }
910}