1use reifydb_type::{
5 Result,
6 storage::DataBitVec,
7 util::bitvec::BitVec,
8 value::{
9 Value,
10 blob::Blob,
11 constraint::Constraint,
12 date::Date,
13 datetime::DateTime,
14 decimal::Decimal,
15 duration::Duration,
16 int::Int,
17 row_number::RowNumber,
18 time::Time,
19 r#type::Type,
20 uint::Uint,
21 uuid::{Uuid4, Uuid7},
22 },
23};
24use uuid::Uuid;
25
26use crate::{
27 encoded::{encoded::EncodedValues, schema::Schema},
28 error::CoreError,
29 value::column::{ColumnData, columns::Columns},
30};
31
32impl Columns {
33 pub fn append_columns(&mut self, other: Columns) -> Result<()> {
34 if self.len() != other.len() {
35 return Err(CoreError::FrameError {
36 message: "mismatched column count".to_string(),
37 }
38 .into());
39 }
40
41 if !other.row_numbers.is_empty() {
43 self.row_numbers.make_mut().extend(other.row_numbers.iter().copied());
44 }
45
46 let columns = self.columns.make_mut();
47 for (i, (l, r)) in columns.iter_mut().zip(other.columns.into_iter()).enumerate() {
48 if l.name().text() != r.name().text() {
49 return Err(CoreError::FrameError {
50 message: format!(
51 "column name mismatch at index {}: '{}' vs '{}'",
52 i,
53 l.name().text(),
54 r.name().text(),
55 ),
56 }
57 .into());
58 }
59 l.extend(r)?;
60 }
61 Ok(())
62 }
63}
64
65impl Columns {
66 pub fn append_rows(
67 &mut self,
68 schema: &Schema,
69 rows: impl IntoIterator<Item = EncodedValues>,
70 row_numbers: Vec<RowNumber>,
71 ) -> Result<()> {
72 if self.len() != schema.field_count() {
73 return Err(CoreError::FrameError {
74 message: format!(
75 "mismatched column count: expected {}, got {}",
76 self.len(),
77 schema.field_count()
78 ),
79 }
80 .into());
81 }
82
83 let rows: Vec<EncodedValues> = rows.into_iter().collect();
84
85 if !row_numbers.is_empty() && row_numbers.len() != rows.len() {
87 return Err(CoreError::FrameError {
88 message: format!(
89 "row_numbers length {} does not match rows length {}",
90 row_numbers.len(),
91 rows.len()
92 ),
93 }
94 .into());
95 }
96
97 if !row_numbers.is_empty() {
99 self.row_numbers.make_mut().extend(row_numbers);
100 }
101
102 let columns = self.columns.make_mut();
104 for (index, column) in columns.iter_mut().enumerate() {
105 let field = schema.get_field(index).unwrap();
106 let is_all_none = if let ColumnData::Option {
107 bitvec,
108 ..
109 } = column.data()
110 {
111 DataBitVec::count_ones(bitvec) == 0
112 } else {
113 false
114 };
115 if is_all_none {
116 let size = column.data().len();
117 let new_data = match field.constraint.get_type() {
118 Type::Boolean => ColumnData::bool_with_bitvec(
119 vec![false; size],
120 BitVec::repeat(size, false),
121 ),
122 Type::Float4 => ColumnData::float4_with_bitvec(
123 vec![0.0f32; size],
124 BitVec::repeat(size, false),
125 ),
126 Type::Float8 => ColumnData::float8_with_bitvec(
127 vec![0.0f64; size],
128 BitVec::repeat(size, false),
129 ),
130 Type::Int1 => ColumnData::int1_with_bitvec(
131 vec![0i8; size],
132 BitVec::repeat(size, false),
133 ),
134 Type::Int2 => ColumnData::int2_with_bitvec(
135 vec![0i16; size],
136 BitVec::repeat(size, false),
137 ),
138 Type::Int4 => ColumnData::int4_with_bitvec(
139 vec![0i32; size],
140 BitVec::repeat(size, false),
141 ),
142 Type::Int8 => ColumnData::int8_with_bitvec(
143 vec![0i64; size],
144 BitVec::repeat(size, false),
145 ),
146 Type::Int16 => ColumnData::int16_with_bitvec(
147 vec![0i128; size],
148 BitVec::repeat(size, false),
149 ),
150 Type::Utf8 => ColumnData::utf8_with_bitvec(
151 vec![String::new(); size],
152 BitVec::repeat(size, false),
153 ),
154 Type::Uint1 => ColumnData::uint1_with_bitvec(
155 vec![0u8; size],
156 BitVec::repeat(size, false),
157 ),
158 Type::Uint2 => ColumnData::uint2_with_bitvec(
159 vec![0u16; size],
160 BitVec::repeat(size, false),
161 ),
162 Type::Uint4 => ColumnData::uint4_with_bitvec(
163 vec![0u32; size],
164 BitVec::repeat(size, false),
165 ),
166 Type::Uint8 => ColumnData::uint8_with_bitvec(
167 vec![0u64; size],
168 BitVec::repeat(size, false),
169 ),
170 Type::Uint16 => ColumnData::uint16_with_bitvec(
171 vec![0u128; size],
172 BitVec::repeat(size, false),
173 ),
174 Type::Date => ColumnData::date_with_bitvec(
175 vec![Date::default(); size],
176 BitVec::repeat(size, false),
177 ),
178 Type::DateTime => ColumnData::datetime_with_bitvec(
179 vec![DateTime::default(); size],
180 BitVec::repeat(size, false),
181 ),
182 Type::Time => ColumnData::time_with_bitvec(
183 vec![Time::default(); size],
184 BitVec::repeat(size, false),
185 ),
186 Type::Duration => ColumnData::duration_with_bitvec(
187 vec![Duration::default(); size],
188 BitVec::repeat(size, false),
189 ),
190 Type::Option(_) => column.data().clone(),
191 Type::IdentityId => ColumnData::identity_id_with_bitvec(
192 vec![Default::default(); size],
193 BitVec::repeat(size, false),
194 ),
195 Type::Uuid4 => ColumnData::uuid4_with_bitvec(
196 vec![Uuid4::from(Uuid::nil()); size],
197 BitVec::repeat(size, false),
198 ),
199 Type::Uuid7 => ColumnData::uuid7_with_bitvec(
200 vec![Uuid7::from(Uuid::nil()); size],
201 BitVec::repeat(size, false),
202 ),
203 Type::Blob => ColumnData::blob_with_bitvec(
204 vec![Blob::new(vec![]); size],
205 BitVec::repeat(size, false),
206 ),
207 Type::Int => ColumnData::int_with_bitvec(
208 vec![Int::default(); size],
209 BitVec::repeat(size, false),
210 ),
211 Type::Uint => ColumnData::uint_with_bitvec(
212 vec![Uint::default(); size],
213 BitVec::repeat(size, false),
214 ),
215 Type::Decimal {
216 ..
217 } => ColumnData::decimal_with_bitvec(
218 vec![Decimal::from(0); size],
219 BitVec::repeat(size, false),
220 ),
221 Type::DictionaryId => {
222 let mut col_data = ColumnData::dictionary_id_with_bitvec(
223 vec![Default::default(); size],
224 BitVec::repeat(size, false),
225 );
226 if let ColumnData::DictionaryId(container) = &mut col_data {
227 if let Some(Constraint::Dictionary(dict_id, _)) =
228 field.constraint.constraint()
229 {
230 container.set_dictionary_id(*dict_id);
231 }
232 }
233 col_data
234 }
235 Type::Any | Type::List(_) => ColumnData::any_with_bitvec(
236 vec![Box::new(Value::none()); size],
237 BitVec::repeat(size, false),
238 ),
239 };
240
241 *column = column.with_new_data(new_data);
242 }
243
244 if let ColumnData::DictionaryId(container) = column.data_mut() {
246 if container.dictionary_id().is_none() {
247 if let Some(Constraint::Dictionary(dict_id, _)) = field.constraint.constraint()
248 {
249 container.set_dictionary_id(*dict_id);
250 }
251 }
252 }
253 }
254
255 for row in &rows {
257 let all_defined = (0..schema.field_count()).all(|i| row.is_defined(i));
259
260 if all_defined {
261 self.append_all_defined_from_schema(schema, &row)?;
262 } else {
263 self.append_fallback_from_schema(schema, &row)?;
264 }
265 }
266
267 Ok(())
268 }
269
270 fn append_all_defined_from_schema(&mut self, schema: &Schema, row: &EncodedValues) -> Result<()> {
271 let columns = self.columns.make_mut();
272 for (index, column) in columns.iter_mut().enumerate() {
273 let field = schema.get_field(index).unwrap();
274 match (column.data_mut(), field.constraint.get_type()) {
275 (
277 ColumnData::Option {
278 inner,
279 bitvec,
280 },
281 _ty,
282 ) => {
283 let value = schema.get_value(&row, index);
284 if matches!(value, Value::None { .. }) {
285 inner.push_none();
286 DataBitVec::push(bitvec, false);
287 } else {
288 inner.push_value(value);
289 DataBitVec::push(bitvec, true);
290 }
291 }
292 (ColumnData::Bool(container), Type::Boolean) => {
293 container.push(schema.get_bool(&row, index));
294 }
295 (ColumnData::Float4(container), Type::Float4) => {
296 container.push(schema.get_f32(&row, index));
297 }
298 (ColumnData::Float8(container), Type::Float8) => {
299 container.push(schema.get_f64(&row, index));
300 }
301 (ColumnData::Int1(container), Type::Int1) => {
302 container.push(schema.get_i8(&row, index));
303 }
304 (ColumnData::Int2(container), Type::Int2) => {
305 container.push(schema.get_i16(&row, index));
306 }
307 (ColumnData::Int4(container), Type::Int4) => {
308 container.push(schema.get_i32(&row, index));
309 }
310 (ColumnData::Int8(container), Type::Int8) => {
311 container.push(schema.get_i64(&row, index));
312 }
313 (ColumnData::Int16(container), Type::Int16) => {
314 container.push(schema.get_i128(&row, index));
315 }
316 (
317 ColumnData::Utf8 {
318 container,
319 ..
320 },
321 Type::Utf8,
322 ) => {
323 container.push(schema.get_utf8(&row, index).to_string());
324 }
325 (ColumnData::Uint1(container), Type::Uint1) => {
326 container.push(schema.get_u8(&row, index));
327 }
328 (ColumnData::Uint2(container), Type::Uint2) => {
329 container.push(schema.get_u16(&row, index));
330 }
331 (ColumnData::Uint4(container), Type::Uint4) => {
332 container.push(schema.get_u32(&row, index));
333 }
334 (ColumnData::Uint8(container), Type::Uint8) => {
335 container.push(schema.get_u64(&row, index));
336 }
337 (ColumnData::Uint16(container), Type::Uint16) => {
338 container.push(schema.get_u128(&row, index));
339 }
340 (ColumnData::Date(container), Type::Date) => {
341 container.push(schema.get_date(&row, index));
342 }
343 (ColumnData::DateTime(container), Type::DateTime) => {
344 container.push(schema.get_datetime(&row, index));
345 }
346 (ColumnData::Time(container), Type::Time) => {
347 container.push(schema.get_time(&row, index));
348 }
349 (ColumnData::Duration(container), Type::Duration) => {
350 container.push(schema.get_duration(&row, index));
351 }
352 (ColumnData::Uuid4(container), Type::Uuid4) => {
353 container.push(schema.get_uuid4(&row, index));
354 }
355 (ColumnData::Uuid7(container), Type::Uuid7) => {
356 container.push(schema.get_uuid7(&row, index));
357 }
358 (
359 ColumnData::Blob {
360 container,
361 ..
362 },
363 Type::Blob,
364 ) => {
365 container.push(schema.get_blob(&row, index));
366 }
367 (
368 ColumnData::Int {
369 container,
370 ..
371 },
372 Type::Int,
373 ) => {
374 container.push(schema.get_int(&row, index));
375 }
376 (
377 ColumnData::Uint {
378 container,
379 ..
380 },
381 Type::Uint,
382 ) => {
383 container.push(schema.get_uint(&row, index));
384 }
385 (
386 ColumnData::Decimal {
387 container,
388 ..
389 },
390 Type::Decimal {
391 ..
392 },
393 ) => {
394 container.push(schema.get_decimal(&row, index));
395 }
396 (ColumnData::DictionaryId(container), Type::DictionaryId) => {
397 match schema.get_value(&row, index) {
398 Value::DictionaryId(id) => container.push(id),
399 _ => container.push_default(),
400 }
401 }
402 (_, v) => {
403 return Err(CoreError::FrameError {
404 message: format!(
405 "type mismatch for column '{}'({}): incompatible with value {}",
406 column.name().text(),
407 column.data().get_type(),
408 v
409 ),
410 }
411 .into());
412 }
413 }
414 }
415 Ok(())
416 }
417
418 fn append_fallback_from_schema(&mut self, schema: &Schema, row: &EncodedValues) -> Result<()> {
419 let columns = self.columns.make_mut();
420 for (index, column) in columns.iter_mut().enumerate() {
421 let field = schema.get_field(index).unwrap();
422
423 if !row.is_defined(index) {
426 column.data_mut().push_none();
427 continue;
428 }
429
430 match (column.data_mut(), field.constraint.get_type()) {
431 (
433 ColumnData::Option {
434 inner,
435 bitvec,
436 },
437 _ty,
438 ) => {
439 let value = schema.get_value(row, index);
440 inner.push_value(value);
441 DataBitVec::push(bitvec, true);
442 }
443 (ColumnData::Bool(container), Type::Boolean) => {
444 container.push(schema.get_bool(row, index));
445 }
446 (ColumnData::Float4(container), Type::Float4) => {
447 container.push(schema.get_f32(row, index));
448 }
449 (ColumnData::Float8(container), Type::Float8) => {
450 container.push(schema.get_f64(row, index));
451 }
452 (ColumnData::Int1(container), Type::Int1) => {
453 container.push(schema.get_i8(row, index));
454 }
455 (ColumnData::Int2(container), Type::Int2) => {
456 container.push(schema.get_i16(row, index));
457 }
458 (ColumnData::Int4(container), Type::Int4) => {
459 container.push(schema.get_i32(row, index));
460 }
461 (ColumnData::Int8(container), Type::Int8) => {
462 container.push(schema.get_i64(row, index));
463 }
464 (ColumnData::Int16(container), Type::Int16) => {
465 container.push(schema.get_i128(row, index));
466 }
467 (
468 ColumnData::Utf8 {
469 container,
470 ..
471 },
472 Type::Utf8,
473 ) => {
474 container.push(schema.get_utf8(row, index).to_string());
475 }
476 (ColumnData::Uint1(container), Type::Uint1) => {
477 container.push(schema.get_u8(row, index));
478 }
479 (ColumnData::Uint2(container), Type::Uint2) => {
480 container.push(schema.get_u16(row, index));
481 }
482 (ColumnData::Uint4(container), Type::Uint4) => {
483 container.push(schema.get_u32(row, index));
484 }
485 (ColumnData::Uint8(container), Type::Uint8) => {
486 container.push(schema.get_u64(row, index));
487 }
488 (ColumnData::Uint16(container), Type::Uint16) => {
489 container.push(schema.get_u128(row, index));
490 }
491 (ColumnData::Date(container), Type::Date) => {
492 container.push(schema.get_date(row, index));
493 }
494 (ColumnData::DateTime(container), Type::DateTime) => {
495 container.push(schema.get_datetime(row, index));
496 }
497 (ColumnData::Time(container), Type::Time) => {
498 container.push(schema.get_time(row, index));
499 }
500 (ColumnData::Duration(container), Type::Duration) => {
501 container.push(schema.get_duration(row, index));
502 }
503 (ColumnData::Uuid4(container), Type::Uuid4) => {
504 container.push(schema.get_uuid4(row, index));
505 }
506 (ColumnData::Uuid7(container), Type::Uuid7) => {
507 container.push(schema.get_uuid7(row, index));
508 }
509 (
510 ColumnData::Int {
511 container,
512 ..
513 },
514 Type::Int,
515 ) => {
516 container.push(schema.get_int(row, index));
517 }
518 (
519 ColumnData::Uint {
520 container,
521 ..
522 },
523 Type::Uint,
524 ) => {
525 container.push(schema.get_uint(row, index));
526 }
527 (
528 ColumnData::Decimal {
529 container,
530 ..
531 },
532 Type::Decimal {
533 ..
534 },
535 ) => {
536 container.push(schema.get_decimal(row, index));
537 }
538 (ColumnData::DictionaryId(container), Type::DictionaryId) => {
539 match schema.get_value(row, index) {
540 Value::DictionaryId(id) => container.push(id),
541 _ => container.push_default(),
542 }
543 }
544 (l, r) => unreachable!("{:#?} {:#?}", l, r),
545 }
546 }
547 Ok(())
548 }
549}
550
551#[cfg(test)]
552pub mod tests {
553 mod columns {
554 use reifydb_type::value::{
555 r#type::Type,
556 uuid::{Uuid4, Uuid7},
557 };
558 use uuid::{Timestamp, Uuid};
559
560 use crate::value::column::{Column, ColumnData, columns::Columns};
561
562 #[test]
563 fn test_boolean() {
564 let mut test_instance1 = Columns::new(vec![Column::bool_with_bitvec("id", [true], [false])]);
565
566 let test_instance2 = Columns::new(vec![Column::bool_with_bitvec("id", [false], [true])]);
567
568 test_instance1.append_columns(test_instance2).unwrap();
569
570 assert_eq!(
571 test_instance1[0].data(),
572 &ColumnData::bool_with_bitvec([true, false], [false, true])
573 );
574 }
575
576 #[test]
577 fn test_float4() {
578 let mut test_instance1 = Columns::new(vec![Column::float4("id", [1.0f32, 2.0])]);
579
580 let test_instance2 =
581 Columns::new(vec![Column::float4_with_bitvec("id", [3.0f32, 4.0], [true, false])]);
582
583 test_instance1.append_columns(test_instance2).unwrap();
584
585 assert_eq!(
586 test_instance1[0].data(),
587 &ColumnData::float4_with_bitvec([1.0f32, 2.0, 3.0, 4.0], [true, true, true, false])
588 );
589 }
590
591 #[test]
592 fn test_float8() {
593 let mut test_instance1 = Columns::new(vec![Column::float8("id", [1.0f64, 2.0])]);
594
595 let test_instance2 =
596 Columns::new(vec![Column::float8_with_bitvec("id", [3.0f64, 4.0], [true, false])]);
597
598 test_instance1.append_columns(test_instance2).unwrap();
599
600 assert_eq!(
601 test_instance1[0].data(),
602 &ColumnData::float8_with_bitvec([1.0f64, 2.0, 3.0, 4.0], [true, true, true, false])
603 );
604 }
605
606 #[test]
607 fn test_int1() {
608 let mut test_instance1 = Columns::new(vec![Column::int1("id", [1, 2])]);
609
610 let test_instance2 = Columns::new(vec![Column::int1_with_bitvec("id", [3, 4], [true, false])]);
611
612 test_instance1.append_columns(test_instance2).unwrap();
613
614 assert_eq!(
615 test_instance1[0].data(),
616 &ColumnData::int1_with_bitvec([1, 2, 3, 4], [true, true, true, false])
617 );
618 }
619
620 #[test]
621 fn test_int2() {
622 let mut test_instance1 = Columns::new(vec![Column::int2("id", [1, 2])]);
623
624 let test_instance2 = Columns::new(vec![Column::int2_with_bitvec("id", [3, 4], [true, false])]);
625
626 test_instance1.append_columns(test_instance2).unwrap();
627
628 assert_eq!(
629 test_instance1[0].data(),
630 &ColumnData::int2_with_bitvec([1, 2, 3, 4], [true, true, true, false])
631 );
632 }
633
634 #[test]
635 fn test_int4() {
636 let mut test_instance1 = Columns::new(vec![Column::int4("id", [1, 2])]);
637
638 let test_instance2 = Columns::new(vec![Column::int4_with_bitvec("id", [3, 4], [true, false])]);
639
640 test_instance1.append_columns(test_instance2).unwrap();
641
642 assert_eq!(
643 test_instance1[0].data(),
644 &ColumnData::int4_with_bitvec([1, 2, 3, 4], [true, true, true, false])
645 );
646 }
647
648 #[test]
649 fn test_int8() {
650 let mut test_instance1 = Columns::new(vec![Column::int8("id", [1, 2])]);
651
652 let test_instance2 = Columns::new(vec![Column::int8_with_bitvec("id", [3, 4], [true, false])]);
653
654 test_instance1.append_columns(test_instance2).unwrap();
655
656 assert_eq!(
657 test_instance1[0].data(),
658 &ColumnData::int8_with_bitvec([1, 2, 3, 4], [true, true, true, false])
659 );
660 }
661
662 #[test]
663 fn test_int16() {
664 let mut test_instance1 = Columns::new(vec![Column::int16("id", [1, 2])]);
665
666 let test_instance2 = Columns::new(vec![Column::int16_with_bitvec("id", [3, 4], [true, false])]);
667
668 test_instance1.append_columns(test_instance2).unwrap();
669
670 assert_eq!(
671 test_instance1[0].data(),
672 &ColumnData::int16_with_bitvec([1, 2, 3, 4], [true, true, true, false])
673 );
674 }
675
676 #[test]
677 fn test_string() {
678 let mut test_instance1 = Columns::new(vec![Column::utf8_with_bitvec(
679 "id",
680 vec!["a".to_string(), "b".to_string()],
681 [true, true],
682 )]);
683
684 let test_instance2 = Columns::new(vec![Column::utf8_with_bitvec(
685 "id",
686 vec!["c".to_string(), "d".to_string()],
687 [true, false],
688 )]);
689
690 test_instance1.append_columns(test_instance2).unwrap();
691
692 assert_eq!(
693 test_instance1[0].data(),
694 &ColumnData::utf8_with_bitvec(
695 vec!["a".to_string(), "b".to_string(), "c".to_string(), "d".to_string()],
696 vec![true, true, true, false]
697 )
698 );
699 }
700
701 #[test]
702 fn test_uint1() {
703 let mut test_instance1 = Columns::new(vec![Column::uint1("id", [1, 2])]);
704
705 let test_instance2 = Columns::new(vec![Column::uint1_with_bitvec("id", [3, 4], [true, false])]);
706
707 test_instance1.append_columns(test_instance2).unwrap();
708
709 assert_eq!(
710 test_instance1[0].data(),
711 &ColumnData::uint1_with_bitvec([1, 2, 3, 4], [true, true, true, false])
712 );
713 }
714
715 #[test]
716 fn test_uint2() {
717 let mut test_instance1 = Columns::new(vec![Column::uint2("id", [1, 2])]);
718
719 let test_instance2 = Columns::new(vec![Column::uint2_with_bitvec("id", [3, 4], [true, false])]);
720
721 test_instance1.append_columns(test_instance2).unwrap();
722
723 assert_eq!(
724 test_instance1[0].data(),
725 &ColumnData::uint2_with_bitvec([1, 2, 3, 4], [true, true, true, false])
726 );
727 }
728
729 #[test]
730 fn test_uint4() {
731 let mut test_instance1 = Columns::new(vec![Column::uint4("id", [1, 2])]);
732
733 let test_instance2 = Columns::new(vec![Column::uint4_with_bitvec("id", [3, 4], [true, false])]);
734
735 test_instance1.append_columns(test_instance2).unwrap();
736
737 assert_eq!(
738 test_instance1[0].data(),
739 &ColumnData::uint4_with_bitvec([1, 2, 3, 4], [true, true, true, false])
740 );
741 }
742
743 #[test]
744 fn test_uint8() {
745 let mut test_instance1 = Columns::new(vec![Column::uint8("id", [1, 2])]);
746
747 let test_instance2 = Columns::new(vec![Column::uint8_with_bitvec("id", [3, 4], [true, false])]);
748
749 test_instance1.append_columns(test_instance2).unwrap();
750
751 assert_eq!(
752 test_instance1[0].data(),
753 &ColumnData::uint8_with_bitvec([1, 2, 3, 4], [true, true, true, false])
754 );
755 }
756
757 #[test]
758 fn test_uint16() {
759 let mut test_instance1 = Columns::new(vec![Column::uint16("id", [1, 2])]);
760
761 let test_instance2 =
762 Columns::new(vec![Column::uint16_with_bitvec("id", [3, 4], [true, false])]);
763
764 test_instance1.append_columns(test_instance2).unwrap();
765
766 assert_eq!(
767 test_instance1[0].data(),
768 &ColumnData::uint16_with_bitvec([1, 2, 3, 4], [true, true, true, false])
769 );
770 }
771
772 #[test]
773 fn test_uuid4() {
774 let uuid1 = Uuid4::from(Uuid::new_v4());
775 let uuid2 = Uuid4::from(Uuid::new_v4());
776 let uuid3 = Uuid4::from(Uuid::new_v4());
777 let uuid4 = Uuid4::from(Uuid::new_v4());
778
779 let mut test_instance1 = Columns::new(vec![Column::uuid4("id", [uuid1, uuid2])]);
780
781 let test_instance2 =
782 Columns::new(vec![Column::uuid4_with_bitvec("id", [uuid3, uuid4], [true, false])]);
783
784 test_instance1.append_columns(test_instance2).unwrap();
785
786 assert_eq!(
787 test_instance1[0].data(),
788 &ColumnData::uuid4_with_bitvec([uuid1, uuid2, uuid3, uuid4], [true, true, true, false])
789 );
790 }
791
792 #[test]
793 fn test_uuid7() {
794 let uuid1 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(1, 1)));
795 let uuid2 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(1, 2)));
796 let uuid3 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(2, 1)));
797 let uuid4 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(2, 2)));
798
799 let mut test_instance1 = Columns::new(vec![Column::uuid7("id", [uuid1, uuid2])]);
800
801 let test_instance2 =
802 Columns::new(vec![Column::uuid7_with_bitvec("id", [uuid3, uuid4], [true, false])]);
803
804 test_instance1.append_columns(test_instance2).unwrap();
805
806 assert_eq!(
807 test_instance1[0].data(),
808 &ColumnData::uuid7_with_bitvec([uuid1, uuid2, uuid3, uuid4], [true, true, true, false])
809 );
810 }
811
812 #[test]
813 fn test_with_undefined_lr_promotes_correctly() {
814 let mut test_instance1 =
815 Columns::new(vec![Column::int2_with_bitvec("id", [1, 2], [true, false])]);
816
817 let test_instance2 = Columns::new(vec![Column::undefined_typed("id", Type::Boolean, 2)]);
818
819 test_instance1.append_columns(test_instance2).unwrap();
820
821 assert_eq!(
822 test_instance1[0].data(),
823 &ColumnData::int2_with_bitvec([1, 2, 0, 0], [true, false, false, false])
824 );
825 }
826
827 #[test]
828 fn test_with_undefined_l_promotes_correctly() {
829 let mut test_instance1 = Columns::new(vec![Column::undefined_typed("score", Type::Boolean, 2)]);
830
831 let test_instance2 =
832 Columns::new(vec![Column::int2_with_bitvec("score", [10, 20], [true, false])]);
833
834 test_instance1.append_columns(test_instance2).unwrap();
835
836 assert_eq!(
837 test_instance1[0].data(),
838 &ColumnData::int2_with_bitvec([0, 0, 10, 20], [false, false, true, false])
839 );
840 }
841
842 #[test]
843 fn test_fails_on_column_count_mismatch() {
844 let mut test_instance1 = Columns::new(vec![Column::int2("id", [1])]);
845
846 let test_instance2 = Columns::new(vec![
847 Column::int2("id", [2]),
848 Column::utf8("name", vec!["Bob".to_string()]),
849 ]);
850
851 let result = test_instance1.append_columns(test_instance2);
852 assert!(result.is_err());
853 }
854
855 #[test]
856 fn test_fails_on_column_name_mismatch() {
857 let mut test_instance1 = Columns::new(vec![Column::int2("id", [1])]);
858
859 let test_instance2 = Columns::new(vec![Column::int2("wrong", [2])]);
860
861 let result = test_instance1.append_columns(test_instance2);
862 assert!(result.is_err());
863 }
864
865 #[test]
866 fn test_fails_on_type_mismatch() {
867 let mut test_instance1 = Columns::new(vec![Column::int2("id", [1])]);
868
869 let test_instance2 = Columns::new(vec![Column::utf8("id", vec!["A".to_string()])]);
870
871 let result = test_instance1.append_columns(test_instance2);
872 assert!(result.is_err());
873 }
874 }
875
876 mod row {
877 use reifydb_type::{
878 fragment::Fragment,
879 util::bitvec::BitVec,
880 value::{
881 Value,
882 constraint::TypeConstraint,
883 dictionary::{DictionaryEntryId, DictionaryId},
884 ordered_f32::OrderedF32,
885 ordered_f64::OrderedF64,
886 r#type::Type,
887 },
888 };
889
890 use crate::{
891 encoded::schema::{Schema, SchemaField},
892 value::column::{Column, ColumnData, columns::Columns},
893 };
894
895 #[test]
896 fn test_before_undefined_bool() {
897 let mut test_instance =
898 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
899
900 let schema = Schema::testing(&[Type::Boolean]);
901 let mut row = schema.allocate();
902 schema.set_values(&mut row, &[Value::Boolean(true)]);
903
904 test_instance.append_rows(&schema, [row], vec![]).unwrap();
905
906 assert_eq!(
907 *test_instance[0].data(),
908 ColumnData::bool_with_bitvec(
909 [false, false, true],
910 BitVec::from_slice(&[false, false, true])
911 )
912 );
913 }
914
915 #[test]
916 fn test_before_undefined_float4() {
917 let mut test_instance =
918 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
919 let schema = Schema::testing(&[Type::Float4]);
920 let mut row = schema.allocate();
921 schema.set_values(&mut row, &[Value::Float4(OrderedF32::try_from(1.5).unwrap())]);
922 test_instance.append_rows(&schema, [row], vec![]).unwrap();
923
924 assert_eq!(
925 *test_instance[0].data(),
926 ColumnData::float4_with_bitvec(
927 [0.0, 0.0, 1.5],
928 BitVec::from_slice(&[false, false, true])
929 )
930 );
931 }
932
933 #[test]
934 fn test_before_undefined_float8() {
935 let mut test_instance =
936 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
937 let schema = Schema::testing(&[Type::Float8]);
938 let mut row = schema.allocate();
939 schema.set_values(&mut row, &[Value::Float8(OrderedF64::try_from(2.25).unwrap())]);
940 test_instance.append_rows(&schema, [row], vec![]).unwrap();
941
942 assert_eq!(
943 *test_instance[0].data(),
944 ColumnData::float8_with_bitvec(
945 [0.0, 0.0, 2.25],
946 BitVec::from_slice(&[false, false, true])
947 )
948 );
949 }
950
951 #[test]
952 fn test_before_undefined_int1() {
953 let mut test_instance =
954 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
955 let schema = Schema::testing(&[Type::Int1]);
956 let mut row = schema.allocate();
957 schema.set_values(&mut row, &[Value::Int1(42)]);
958 test_instance.append_rows(&schema, [row], vec![]).unwrap();
959
960 assert_eq!(
961 *test_instance[0].data(),
962 ColumnData::int1_with_bitvec([0, 0, 42], BitVec::from_slice(&[false, false, true]))
963 );
964 }
965
966 #[test]
967 fn test_before_undefined_int2() {
968 let mut test_instance =
969 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
970 let schema = Schema::testing(&[Type::Int2]);
971 let mut row = schema.allocate();
972 schema.set_values(&mut row, &[Value::Int2(-1234)]);
973 test_instance.append_rows(&schema, [row], vec![]).unwrap();
974
975 assert_eq!(
976 *test_instance[0].data(),
977 ColumnData::int2_with_bitvec([0, 0, -1234], BitVec::from_slice(&[false, false, true]))
978 );
979 }
980
981 #[test]
982 fn test_before_undefined_int4() {
983 let mut test_instance =
984 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
985 let schema = Schema::testing(&[Type::Int4]);
986 let mut row = schema.allocate();
987 schema.set_values(&mut row, &[Value::Int4(56789)]);
988 test_instance.append_rows(&schema, [row], vec![]).unwrap();
989
990 assert_eq!(
991 *test_instance[0].data(),
992 ColumnData::int4_with_bitvec([0, 0, 56789], BitVec::from_slice(&[false, false, true]))
993 );
994 }
995
996 #[test]
997 fn test_before_undefined_int8() {
998 let mut test_instance =
999 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1000 let schema = Schema::testing(&[Type::Int8]);
1001 let mut row = schema.allocate();
1002 schema.set_values(&mut row, &[Value::Int8(-987654321)]);
1003 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1004
1005 assert_eq!(
1006 *test_instance[0].data(),
1007 ColumnData::int8_with_bitvec(
1008 [0, 0, -987654321],
1009 BitVec::from_slice(&[false, false, true])
1010 )
1011 );
1012 }
1013
1014 #[test]
1015 fn test_before_undefined_int16() {
1016 let mut test_instance =
1017 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1018 let schema = Schema::testing(&[Type::Int16]);
1019 let mut row = schema.allocate();
1020 schema.set_values(&mut row, &[Value::Int16(123456789012345678901234567890i128)]);
1021 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1022
1023 assert_eq!(
1024 *test_instance[0].data(),
1025 ColumnData::int16_with_bitvec(
1026 [0, 0, 123456789012345678901234567890i128],
1027 BitVec::from_slice(&[false, false, true])
1028 )
1029 );
1030 }
1031
1032 #[test]
1033 fn test_before_undefined_string() {
1034 let mut test_instance =
1035 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1036 let schema = Schema::testing(&[Type::Utf8]);
1037 let mut row = schema.allocate();
1038 schema.set_values(&mut row, &[Value::Utf8("reifydb".into())]);
1039 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1040
1041 assert_eq!(
1042 *test_instance[0].data(),
1043 ColumnData::utf8_with_bitvec(
1044 ["".to_string(), "".to_string(), "reifydb".to_string()],
1045 BitVec::from_slice(&[false, false, true])
1046 )
1047 );
1048 }
1049
1050 #[test]
1051 fn test_before_undefined_uint1() {
1052 let mut test_instance =
1053 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1054 let schema = Schema::testing(&[Type::Uint1]);
1055 let mut row = schema.allocate();
1056 schema.set_values(&mut row, &[Value::Uint1(255)]);
1057 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1058
1059 assert_eq!(
1060 *test_instance[0].data(),
1061 ColumnData::uint1_with_bitvec([0, 0, 255], BitVec::from_slice(&[false, false, true]))
1062 );
1063 }
1064
1065 #[test]
1066 fn test_before_undefined_uint2() {
1067 let mut test_instance =
1068 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1069 let schema = Schema::testing(&[Type::Uint2]);
1070 let mut row = schema.allocate();
1071 schema.set_values(&mut row, &[Value::Uint2(65535)]);
1072 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1073
1074 assert_eq!(
1075 *test_instance[0].data(),
1076 ColumnData::uint2_with_bitvec([0, 0, 65535], BitVec::from_slice(&[false, false, true]))
1077 );
1078 }
1079
1080 #[test]
1081 fn test_before_undefined_uint4() {
1082 let mut test_instance =
1083 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1084 let schema = Schema::testing(&[Type::Uint4]);
1085 let mut row = schema.allocate();
1086 schema.set_values(&mut row, &[Value::Uint4(4294967295)]);
1087 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1088
1089 assert_eq!(
1090 *test_instance[0].data(),
1091 ColumnData::uint4_with_bitvec(
1092 [0, 0, 4294967295],
1093 BitVec::from_slice(&[false, false, true])
1094 )
1095 );
1096 }
1097
1098 #[test]
1099 fn test_before_undefined_uint8() {
1100 let mut test_instance =
1101 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1102 let schema = Schema::testing(&[Type::Uint8]);
1103 let mut row = schema.allocate();
1104 schema.set_values(&mut row, &[Value::Uint8(18446744073709551615)]);
1105 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1106
1107 assert_eq!(
1108 *test_instance[0].data(),
1109 ColumnData::uint8_with_bitvec(
1110 [0, 0, 18446744073709551615],
1111 BitVec::from_slice(&[false, false, true])
1112 )
1113 );
1114 }
1115
1116 #[test]
1117 fn test_before_undefined_uint16() {
1118 let mut test_instance =
1119 Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1120 let schema = Schema::testing(&[Type::Uint16]);
1121 let mut row = schema.allocate();
1122 schema.set_values(&mut row, &[Value::Uint16(340282366920938463463374607431768211455u128)]);
1123 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1124
1125 assert_eq!(
1126 *test_instance[0].data(),
1127 ColumnData::uint16_with_bitvec(
1128 [0, 0, 340282366920938463463374607431768211455u128],
1129 BitVec::from_slice(&[false, false, true])
1130 )
1131 );
1132 }
1133
1134 #[test]
1135 fn test_mismatched_columns() {
1136 let mut test_instance = Columns::new(vec![]);
1137
1138 let schema = Schema::testing(&[Type::Int2]);
1139 let mut row = schema.allocate();
1140 schema.set_values(&mut row, &[Value::Int2(2)]);
1141
1142 let err = test_instance.append_rows(&schema, [row], vec![]).err().unwrap();
1143 assert!(err.to_string().contains("mismatched column count: expected 0, got 1"));
1144 }
1145
1146 #[test]
1147 fn test_ok() {
1148 let mut test_instance = test_instance_with_columns();
1149
1150 let schema = Schema::testing(&[Type::Int2, Type::Boolean]);
1151 let mut row_one = schema.allocate();
1152 schema.set_values(&mut row_one, &[Value::Int2(2), Value::Boolean(true)]);
1153 let mut row_two = schema.allocate();
1154 schema.set_values(&mut row_two, &[Value::Int2(3), Value::Boolean(false)]);
1155
1156 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1157
1158 assert_eq!(*test_instance[0].data(), ColumnData::int2([1, 2, 3]));
1159 assert_eq!(*test_instance[1].data(), ColumnData::bool([true, true, false]));
1160 }
1161
1162 #[test]
1163 fn test_all_defined_bool() {
1164 let mut test_instance = Columns::new(vec![Column::bool("test_col", Vec::<bool>::new())]);
1165
1166 let schema = Schema::testing(&[Type::Boolean]);
1167 let mut row_one = schema.allocate();
1168 schema.set_bool(&mut row_one, 0, true);
1169 let mut row_two = schema.allocate();
1170 schema.set_bool(&mut row_two, 0, false);
1171
1172 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1173
1174 assert_eq!(*test_instance[0].data(), ColumnData::bool([true, false]));
1175 }
1176
1177 #[test]
1178 fn test_all_defined_float4() {
1179 let mut test_instance = Columns::new(vec![Column::float4("test_col", Vec::<f32>::new())]);
1180
1181 let schema = Schema::testing(&[Type::Float4]);
1182 let mut row_one = schema.allocate();
1183 schema.set_values(&mut row_one, &[Value::Float4(OrderedF32::try_from(1.0).unwrap())]);
1184 let mut row_two = schema.allocate();
1185 schema.set_values(&mut row_two, &[Value::Float4(OrderedF32::try_from(2.0).unwrap())]);
1186
1187 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1188
1189 assert_eq!(*test_instance[0].data(), ColumnData::float4([1.0, 2.0]));
1190 }
1191
1192 #[test]
1193 fn test_all_defined_float8() {
1194 let mut test_instance = Columns::new(vec![Column::float8("test_col", Vec::<f64>::new())]);
1195
1196 let schema = Schema::testing(&[Type::Float8]);
1197 let mut row_one = schema.allocate();
1198 schema.set_values(&mut row_one, &[Value::Float8(OrderedF64::try_from(1.0).unwrap())]);
1199 let mut row_two = schema.allocate();
1200 schema.set_values(&mut row_two, &[Value::Float8(OrderedF64::try_from(2.0).unwrap())]);
1201
1202 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1203
1204 assert_eq!(*test_instance[0].data(), ColumnData::float8([1.0, 2.0]));
1205 }
1206
1207 #[test]
1208 fn test_all_defined_int1() {
1209 let mut test_instance = Columns::new(vec![Column::int1("test_col", Vec::<i8>::new())]);
1210
1211 let schema = Schema::testing(&[Type::Int1]);
1212 let mut row_one = schema.allocate();
1213 schema.set_values(&mut row_one, &[Value::Int1(1)]);
1214 let mut row_two = schema.allocate();
1215 schema.set_values(&mut row_two, &[Value::Int1(2)]);
1216
1217 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1218
1219 assert_eq!(*test_instance[0].data(), ColumnData::int1([1, 2]));
1220 }
1221
1222 #[test]
1223 fn test_all_defined_int2() {
1224 let mut test_instance = Columns::new(vec![Column::int2("test_col", Vec::<i16>::new())]);
1225
1226 let schema = Schema::testing(&[Type::Int2]);
1227 let mut row_one = schema.allocate();
1228 schema.set_values(&mut row_one, &[Value::Int2(100)]);
1229 let mut row_two = schema.allocate();
1230 schema.set_values(&mut row_two, &[Value::Int2(200)]);
1231
1232 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1233
1234 assert_eq!(*test_instance[0].data(), ColumnData::int2([100, 200]));
1235 }
1236
1237 #[test]
1238 fn test_all_defined_int4() {
1239 let mut test_instance = Columns::new(vec![Column::int4("test_col", Vec::<i32>::new())]);
1240
1241 let schema = Schema::testing(&[Type::Int4]);
1242 let mut row_one = schema.allocate();
1243 schema.set_values(&mut row_one, &[Value::Int4(1000)]);
1244 let mut row_two = schema.allocate();
1245 schema.set_values(&mut row_two, &[Value::Int4(2000)]);
1246
1247 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1248
1249 assert_eq!(*test_instance[0].data(), ColumnData::int4([1000, 2000]));
1250 }
1251
1252 #[test]
1253 fn test_all_defined_int8() {
1254 let mut test_instance = Columns::new(vec![Column::int8("test_col", Vec::<i64>::new())]);
1255
1256 let schema = Schema::testing(&[Type::Int8]);
1257 let mut row_one = schema.allocate();
1258 schema.set_values(&mut row_one, &[Value::Int8(10000)]);
1259 let mut row_two = schema.allocate();
1260 schema.set_values(&mut row_two, &[Value::Int8(20000)]);
1261
1262 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1263
1264 assert_eq!(*test_instance[0].data(), ColumnData::int8([10000, 20000]));
1265 }
1266
1267 #[test]
1268 fn test_all_defined_int16() {
1269 let mut test_instance = Columns::new(vec![Column::int16("test_col", Vec::<i128>::new())]);
1270
1271 let schema = Schema::testing(&[Type::Int16]);
1272 let mut row_one = schema.allocate();
1273 schema.set_values(&mut row_one, &[Value::Int16(1000)]);
1274 let mut row_two = schema.allocate();
1275 schema.set_values(&mut row_two, &[Value::Int16(2000)]);
1276
1277 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1278
1279 assert_eq!(*test_instance[0].data(), ColumnData::int16([1000, 2000]));
1280 }
1281
1282 #[test]
1283 fn test_all_defined_string() {
1284 let mut test_instance = Columns::new(vec![Column::utf8("test_col", Vec::<String>::new())]);
1285
1286 let schema = Schema::testing(&[Type::Utf8]);
1287 let mut row_one = schema.allocate();
1288 schema.set_values(&mut row_one, &[Value::Utf8("a".into())]);
1289 let mut row_two = schema.allocate();
1290 schema.set_values(&mut row_two, &[Value::Utf8("b".into())]);
1291
1292 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1293
1294 assert_eq!(*test_instance[0].data(), ColumnData::utf8(["a".to_string(), "b".to_string()]));
1295 }
1296
1297 #[test]
1298 fn test_all_defined_uint1() {
1299 let mut test_instance = Columns::new(vec![Column::uint1("test_col", Vec::<u8>::new())]);
1300
1301 let schema = Schema::testing(&[Type::Uint1]);
1302 let mut row_one = schema.allocate();
1303 schema.set_values(&mut row_one, &[Value::Uint1(1)]);
1304 let mut row_two = schema.allocate();
1305 schema.set_values(&mut row_two, &[Value::Uint1(2)]);
1306
1307 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1308
1309 assert_eq!(*test_instance[0].data(), ColumnData::uint1([1, 2]));
1310 }
1311
1312 #[test]
1313 fn test_all_defined_uint2() {
1314 let mut test_instance = Columns::new(vec![Column::uint2("test_col", Vec::<u16>::new())]);
1315
1316 let schema = Schema::testing(&[Type::Uint2]);
1317 let mut row_one = schema.allocate();
1318 schema.set_values(&mut row_one, &[Value::Uint2(100)]);
1319 let mut row_two = schema.allocate();
1320 schema.set_values(&mut row_two, &[Value::Uint2(200)]);
1321
1322 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1323
1324 assert_eq!(*test_instance[0].data(), ColumnData::uint2([100, 200]));
1325 }
1326
1327 #[test]
1328 fn test_all_defined_uint4() {
1329 let mut test_instance = Columns::new(vec![Column::uint4("test_col", Vec::<u32>::new())]);
1330
1331 let schema = Schema::testing(&[Type::Uint4]);
1332 let mut row_one = schema.allocate();
1333 schema.set_values(&mut row_one, &[Value::Uint4(1000)]);
1334 let mut row_two = schema.allocate();
1335 schema.set_values(&mut row_two, &[Value::Uint4(2000)]);
1336
1337 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1338
1339 assert_eq!(*test_instance[0].data(), ColumnData::uint4([1000, 2000]));
1340 }
1341
1342 #[test]
1343 fn test_all_defined_uint8() {
1344 let mut test_instance = Columns::new(vec![Column::uint8("test_col", Vec::<u64>::new())]);
1345
1346 let schema = Schema::testing(&[Type::Uint8]);
1347 let mut row_one = schema.allocate();
1348 schema.set_values(&mut row_one, &[Value::Uint8(10000)]);
1349 let mut row_two = schema.allocate();
1350 schema.set_values(&mut row_two, &[Value::Uint8(20000)]);
1351
1352 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1353
1354 assert_eq!(*test_instance[0].data(), ColumnData::uint8([10000, 20000]));
1355 }
1356
1357 #[test]
1358 fn test_all_defined_uint16() {
1359 let mut test_instance = Columns::new(vec![Column::uint16("test_col", Vec::<u128>::new())]);
1360
1361 let schema = Schema::testing(&[Type::Uint16]);
1362 let mut row_one = schema.allocate();
1363 schema.set_values(&mut row_one, &[Value::Uint16(1000)]);
1364 let mut row_two = schema.allocate();
1365 schema.set_values(&mut row_two, &[Value::Uint16(2000)]);
1366
1367 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1368
1369 assert_eq!(*test_instance[0].data(), ColumnData::uint16([1000, 2000]));
1370 }
1371
1372 #[test]
1373 fn test_row_with_undefined() {
1374 let mut test_instance = test_instance_with_columns();
1375
1376 let schema = Schema::testing(&[Type::Int2, Type::Boolean]);
1377 let mut row = schema.allocate();
1378 schema.set_values(&mut row, &[Value::none(), Value::Boolean(false)]);
1379
1380 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1381
1382 assert_eq!(
1383 *test_instance[0].data(),
1384 ColumnData::int2_with_bitvec(vec![1, 0], vec![true, false])
1385 );
1386 assert_eq!(*test_instance[1].data(), ColumnData::bool_with_bitvec([true, false], [true, true]));
1387 }
1388
1389 #[test]
1390 fn test_row_with_type_mismatch_fails() {
1391 let mut test_instance = test_instance_with_columns();
1392
1393 let schema = Schema::testing(&[Type::Boolean, Type::Boolean]);
1394 let mut row = schema.allocate();
1395 schema.set_values(&mut row, &[Value::Boolean(true), Value::Boolean(true)]);
1396
1397 let result = test_instance.append_rows(&schema, [row], vec![]);
1398 assert!(result.is_err());
1399 assert!(result.unwrap_err().to_string().contains("type mismatch"));
1400 }
1401
1402 #[test]
1403 fn test_row_wrong_length_fails() {
1404 let mut test_instance = test_instance_with_columns();
1405
1406 let schema = Schema::testing(&[Type::Int2]);
1407 let mut row = schema.allocate();
1408 schema.set_values(&mut row, &[Value::Int2(2)]);
1409
1410 let result = test_instance.append_rows(&schema, [row], vec![]);
1411 assert!(result.is_err());
1412 assert!(result.unwrap_err().to_string().contains("mismatched column count"));
1413 }
1414
1415 #[test]
1416 fn test_fallback_bool() {
1417 let mut test_instance = Columns::new(vec![
1418 Column::bool("test_col", Vec::<bool>::new()),
1419 Column::bool("none", Vec::<bool>::new()),
1420 ]);
1421
1422 let schema = Schema::testing(&[Type::Boolean, Type::Boolean]);
1423 let mut row_one = schema.allocate();
1424 schema.set_bool(&mut row_one, 0, true);
1425 schema.set_none(&mut row_one, 1);
1426
1427 test_instance.append_rows(&schema, [row_one], vec![]).unwrap();
1428
1429 assert_eq!(*test_instance[0].data(), ColumnData::bool_with_bitvec([true], [true]));
1430
1431 assert_eq!(*test_instance[1].data(), ColumnData::bool_with_bitvec([false], [false]));
1432 }
1433
1434 #[test]
1435 fn test_fallback_float4() {
1436 let mut test_instance = Columns::new(vec![
1437 Column::float4("test_col", Vec::<f32>::new()),
1438 Column::float4("none", Vec::<f32>::new()),
1439 ]);
1440
1441 let schema = Schema::testing(&[Type::Float4, Type::Float4]);
1442 let mut row = schema.allocate();
1443 schema.set_f32(&mut row, 0, 1.5);
1444 schema.set_none(&mut row, 1);
1445
1446 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1447
1448 assert_eq!(*test_instance[0].data(), ColumnData::float4_with_bitvec([1.5], [true]));
1449 assert_eq!(*test_instance[1].data(), ColumnData::float4_with_bitvec([0.0], [false]));
1450 }
1451
1452 #[test]
1453 fn test_fallback_float8() {
1454 let mut test_instance = Columns::new(vec![
1455 Column::float8("test_col", Vec::<f64>::new()),
1456 Column::float8("none", Vec::<f64>::new()),
1457 ]);
1458
1459 let schema = Schema::testing(&[Type::Float8, Type::Float8]);
1460 let mut row = schema.allocate();
1461 schema.set_f64(&mut row, 0, 2.5);
1462 schema.set_none(&mut row, 1);
1463
1464 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1465
1466 assert_eq!(*test_instance[0].data(), ColumnData::float8_with_bitvec([2.5], [true]));
1467 assert_eq!(*test_instance[1].data(), ColumnData::float8_with_bitvec([0.0], [false]));
1468 }
1469
1470 #[test]
1471 fn test_fallback_int1() {
1472 let mut test_instance = Columns::new(vec![
1473 Column::int1("test_col", Vec::<i8>::new()),
1474 Column::int1("none", Vec::<i8>::new()),
1475 ]);
1476
1477 let schema = Schema::testing(&[Type::Int1, Type::Int1]);
1478 let mut row = schema.allocate();
1479 schema.set_i8(&mut row, 0, 42);
1480 schema.set_none(&mut row, 1);
1481
1482 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1483
1484 assert_eq!(*test_instance[0].data(), ColumnData::int1_with_bitvec([42], [true]));
1485 assert_eq!(*test_instance[1].data(), ColumnData::int1_with_bitvec([0], [false]));
1486 }
1487
1488 #[test]
1489 fn test_fallback_int2() {
1490 let mut test_instance = Columns::new(vec![
1491 Column::int2("test_col", Vec::<i16>::new()),
1492 Column::int2("none", Vec::<i16>::new()),
1493 ]);
1494
1495 let schema = Schema::testing(&[Type::Int2, Type::Int2]);
1496 let mut row = schema.allocate();
1497 schema.set_i16(&mut row, 0, -1234i16);
1498 schema.set_none(&mut row, 1);
1499
1500 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1501
1502 assert_eq!(*test_instance[0].data(), ColumnData::int2_with_bitvec([-1234], [true]));
1503 assert_eq!(*test_instance[1].data(), ColumnData::int2_with_bitvec([0], [false]));
1504 }
1505
1506 #[test]
1507 fn test_fallback_int4() {
1508 let mut test_instance = Columns::new(vec![
1509 Column::int4("test_col", Vec::<i32>::new()),
1510 Column::int4("none", Vec::<i32>::new()),
1511 ]);
1512
1513 let schema = Schema::testing(&[Type::Int4, Type::Int4]);
1514 let mut row = schema.allocate();
1515 schema.set_i32(&mut row, 0, 56789);
1516 schema.set_none(&mut row, 1);
1517
1518 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1519
1520 assert_eq!(*test_instance[0].data(), ColumnData::int4_with_bitvec([56789], [true]));
1521 assert_eq!(*test_instance[1].data(), ColumnData::int4_with_bitvec([0], [false]));
1522 }
1523
1524 #[test]
1525 fn test_fallback_int8() {
1526 let mut test_instance = Columns::new(vec![
1527 Column::int8("test_col", Vec::<i64>::new()),
1528 Column::int8("none", Vec::<i64>::new()),
1529 ]);
1530
1531 let schema = Schema::testing(&[Type::Int8, Type::Int8]);
1532 let mut row = schema.allocate();
1533 schema.set_i64(&mut row, 0, -987654321);
1534 schema.set_none(&mut row, 1);
1535
1536 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1537
1538 assert_eq!(*test_instance[0].data(), ColumnData::int8_with_bitvec([-987654321], [true]));
1539 assert_eq!(*test_instance[1].data(), ColumnData::int8_with_bitvec([0], [false]));
1540 }
1541
1542 #[test]
1543 fn test_fallback_int16() {
1544 let mut test_instance = Columns::new(vec![
1545 Column::int16("test_col", Vec::<i128>::new()),
1546 Column::int16("none", Vec::<i128>::new()),
1547 ]);
1548
1549 let schema = Schema::testing(&[Type::Int16, Type::Int16]);
1550 let mut row = schema.allocate();
1551 schema.set_i128(&mut row, 0, 123456789012345678901234567890i128);
1552 schema.set_none(&mut row, 1);
1553
1554 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1555
1556 assert_eq!(
1557 *test_instance[0].data(),
1558 ColumnData::int16_with_bitvec([123456789012345678901234567890i128], [true])
1559 );
1560 assert_eq!(*test_instance[1].data(), ColumnData::int16_with_bitvec([0], [false]));
1561 }
1562
1563 #[test]
1564 fn test_fallback_string() {
1565 let mut test_instance = Columns::new(vec![
1566 Column::utf8("test_col", Vec::<String>::new()),
1567 Column::utf8("none", Vec::<String>::new()),
1568 ]);
1569
1570 let schema = Schema::testing(&[Type::Utf8, Type::Utf8]);
1571 let mut row = schema.allocate();
1572 schema.set_utf8(&mut row, 0, "reifydb");
1573 schema.set_none(&mut row, 1);
1574
1575 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1576
1577 assert_eq!(
1578 *test_instance[0].data(),
1579 ColumnData::utf8_with_bitvec(["reifydb".to_string()], [true])
1580 );
1581 assert_eq!(*test_instance[1].data(), ColumnData::utf8_with_bitvec(["".to_string()], [false]));
1582 }
1583
1584 #[test]
1585 fn test_fallback_uint1() {
1586 let mut test_instance = Columns::new(vec![
1587 Column::uint1("test_col", Vec::<u8>::new()),
1588 Column::uint1("none", Vec::<u8>::new()),
1589 ]);
1590
1591 let schema = Schema::testing(&[Type::Uint1, Type::Uint1]);
1592 let mut row = schema.allocate();
1593 schema.set_u8(&mut row, 0, 255);
1594 schema.set_none(&mut row, 1);
1595
1596 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1597
1598 assert_eq!(*test_instance[0].data(), ColumnData::uint1_with_bitvec([255], [true]));
1599 assert_eq!(*test_instance[1].data(), ColumnData::uint1_with_bitvec([0], [false]));
1600 }
1601
1602 #[test]
1603 fn test_fallback_uint2() {
1604 let mut test_instance = Columns::new(vec![
1605 Column::uint2("test_col", Vec::<u16>::new()),
1606 Column::uint2("none", Vec::<u16>::new()),
1607 ]);
1608
1609 let schema = Schema::testing(&[Type::Uint2, Type::Uint2]);
1610 let mut row = schema.allocate();
1611 schema.set_u16(&mut row, 0, 65535u16);
1612 schema.set_none(&mut row, 1);
1613
1614 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1615
1616 assert_eq!(*test_instance[0].data(), ColumnData::uint2_with_bitvec([65535], [true]));
1617 assert_eq!(*test_instance[1].data(), ColumnData::uint2_with_bitvec([0], [false]));
1618 }
1619
1620 #[test]
1621 fn test_fallback_uint4() {
1622 let mut test_instance = Columns::new(vec![
1623 Column::uint4("test_col", Vec::<u32>::new()),
1624 Column::uint4("none", Vec::<u32>::new()),
1625 ]);
1626
1627 let schema = Schema::testing(&[Type::Uint4, Type::Uint4]);
1628 let mut row = schema.allocate();
1629 schema.set_u32(&mut row, 0, 4294967295u32);
1630 schema.set_none(&mut row, 1);
1631
1632 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1633
1634 assert_eq!(*test_instance[0].data(), ColumnData::uint4_with_bitvec([4294967295], [true]));
1635 assert_eq!(*test_instance[1].data(), ColumnData::uint4_with_bitvec([0], [false]));
1636 }
1637
1638 #[test]
1639 fn test_fallback_uint8() {
1640 let mut test_instance = Columns::new(vec![
1641 Column::uint8("test_col", Vec::<u64>::new()),
1642 Column::uint8("none", Vec::<u64>::new()),
1643 ]);
1644
1645 let schema = Schema::testing(&[Type::Uint8, Type::Uint8]);
1646 let mut row = schema.allocate();
1647 schema.set_u64(&mut row, 0, 18446744073709551615u64);
1648 schema.set_none(&mut row, 1);
1649
1650 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1651
1652 assert_eq!(
1653 *test_instance[0].data(),
1654 ColumnData::uint8_with_bitvec([18446744073709551615], [true])
1655 );
1656 assert_eq!(*test_instance[1].data(), ColumnData::uint8_with_bitvec([0], [false]));
1657 }
1658
1659 #[test]
1660 fn test_fallback_uint16() {
1661 let mut test_instance = Columns::new(vec![
1662 Column::uint16("test_col", Vec::<u128>::new()),
1663 Column::uint16("none", Vec::<u128>::new()),
1664 ]);
1665
1666 let schema = Schema::testing(&[Type::Uint16, Type::Uint16]);
1667 let mut row = schema.allocate();
1668 schema.set_u128(&mut row, 0, 340282366920938463463374607431768211455u128);
1669 schema.set_none(&mut row, 1);
1670
1671 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1672
1673 assert_eq!(
1674 *test_instance[0].data(),
1675 ColumnData::uint16_with_bitvec([340282366920938463463374607431768211455u128], [true])
1676 );
1677 assert_eq!(*test_instance[1].data(), ColumnData::uint16_with_bitvec([0], [false]));
1678 }
1679
1680 #[test]
1681 fn test_all_defined_dictionary_id() {
1682 let constraint = TypeConstraint::dictionary(DictionaryId::from(1u64), Type::Uint4);
1683 let schema = Schema::new(vec![SchemaField::new("status", constraint)]);
1684
1685 let mut test_instance =
1686 Columns::new(vec![Column::dictionary_id("status", Vec::<DictionaryEntryId>::new())]);
1687
1688 let mut row_one = schema.allocate();
1689 schema.set_values(&mut row_one, &[Value::DictionaryId(DictionaryEntryId::U4(10))]);
1690 let mut row_two = schema.allocate();
1691 schema.set_values(&mut row_two, &[Value::DictionaryId(DictionaryEntryId::U4(20))]);
1692
1693 test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1694
1695 assert_eq!(
1696 test_instance[0].data().get_value(0),
1697 Value::DictionaryId(DictionaryEntryId::U4(10))
1698 );
1699 assert_eq!(
1700 test_instance[0].data().get_value(1),
1701 Value::DictionaryId(DictionaryEntryId::U4(20))
1702 );
1703 }
1704
1705 #[test]
1706 fn test_fallback_dictionary_id() {
1707 let dict_constraint = TypeConstraint::dictionary(DictionaryId::from(1u64), Type::Uint4);
1708 let schema = Schema::new(vec![
1709 SchemaField::new("dict_col", dict_constraint),
1710 SchemaField::unconstrained("bool_col", Type::Boolean),
1711 ]);
1712
1713 let mut test_instance = Columns::new(vec![
1714 Column::dictionary_id("dict_col", Vec::<DictionaryEntryId>::new()),
1715 Column::bool("bool_col", Vec::<bool>::new()),
1716 ]);
1717
1718 let mut row = schema.allocate();
1719 schema.set_values(&mut row, &[Value::none(), Value::Boolean(true)]);
1720
1721 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1722
1723 assert!(!test_instance[0].data().is_defined(0));
1725 assert_eq!(test_instance[1].data().get_value(0), Value::Boolean(true));
1727 }
1728
1729 #[test]
1730 fn test_before_undefined_dictionary_id() {
1731 let constraint = TypeConstraint::dictionary(DictionaryId::from(2u64), Type::Uint4);
1732 let schema = Schema::new(vec![SchemaField::new("tag", constraint)]);
1733
1734 let mut test_instance = Columns::new(vec![Column::undefined_typed("tag", Type::Boolean, 2)]);
1735
1736 let mut row = schema.allocate();
1737 schema.set_values(&mut row, &[Value::DictionaryId(DictionaryEntryId::U4(5))]);
1738
1739 test_instance.append_rows(&schema, [row], vec![]).unwrap();
1740
1741 assert!(!test_instance[0].data().is_defined(0));
1743 assert!(!test_instance[0].data().is_defined(1));
1744 assert!(test_instance[0].data().is_defined(2));
1745 assert_eq!(test_instance[0].data().get_value(2), Value::DictionaryId(DictionaryEntryId::U4(5)));
1746 }
1747
1748 fn test_instance_with_columns() -> Columns {
1749 Columns::new(vec![
1750 Column {
1751 name: Fragment::internal("int2"),
1752 data: ColumnData::int2(vec![1]),
1753 },
1754 Column {
1755 name: Fragment::internal("bool"),
1756 data: ColumnData::bool(vec![true]),
1757 },
1758 ])
1759 }
1760 }
1761}