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