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