Skip to content

Commit a67cd1b

Browse files
authored
Support run-end canonicalize for decimals (#9707)
## Summary - add Decimal dispatch in RunEnd canonicalization - decode run-end Decimal values into DecimalArray while preserving precision, scale, and validity - add regression coverage for nullable and non-null decimal runs ## Tests - cargo +nightly fmt --all - cargo test -p vortex-runend Signed-off-by: Daniel King <dan@spiraldb.com>
1 parent 97953be commit a67cd1b

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

encodings/runend/src/array.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,61 @@ mod tests {
583583
assert_arrays_eq!(arr.into_array(), expected, &mut ctx);
584584
}
585585

586+
#[test]
587+
fn test_runend_decimal() {
588+
let mut ctx = SESSION.create_execution_ctx();
589+
let decimal_dtype = DecimalDType::new(10, 2);
590+
let values = DecimalArray::from_iter([12345i64, 67890, -12300], decimal_dtype).into_array();
591+
let arr = RunEnd::new(buffer![2u32, 5, 10].into_array(), values, &mut ctx);
592+
assert_eq!(arr.len(), 10);
593+
assert_eq!(
594+
arr.dtype(),
595+
&DType::Decimal(decimal_dtype, Nullability::NonNullable)
596+
);
597+
598+
let expected = DecimalArray::from_iter(
599+
[
600+
12345i64, 12345, 67890, 67890, 67890, -12300, -12300, -12300, -12300, -12300,
601+
],
602+
decimal_dtype,
603+
)
604+
.into_array();
605+
assert_arrays_eq!(arr.into_array(), expected, &mut ctx);
606+
}
607+
608+
#[test]
609+
fn test_runend_nullable_decimal() {
610+
let mut ctx = SESSION.create_execution_ctx();
611+
let decimal_dtype = DecimalDType::new(10, 2);
612+
let values =
613+
DecimalArray::from_option_iter([Some(12345i64), None, Some(-12300)], decimal_dtype)
614+
.into_array();
615+
let arr = RunEnd::new(buffer![2u32, 5, 10].into_array(), values, &mut ctx);
616+
assert_eq!(arr.len(), 10);
617+
assert_eq!(
618+
arr.dtype(),
619+
&DType::Decimal(decimal_dtype, Nullability::Nullable)
620+
);
621+
622+
let expected = DecimalArray::from_option_iter(
623+
[
624+
Some(12345i64),
625+
Some(12345),
626+
None,
627+
None,
628+
None,
629+
Some(-12300),
630+
Some(-12300),
631+
Some(-12300),
632+
Some(-12300),
633+
Some(-12300),
634+
],
635+
decimal_dtype,
636+
)
637+
.into_array();
638+
assert_arrays_eq!(arr.into_array(), expected, &mut ctx);
639+
}
640+
586641
#[test]
587642
fn test_runend_dict() {
588643
let mut ctx = SESSION.create_execution_ctx();

0 commit comments

Comments
 (0)