Skip to content

Commit 1f6ac32

Browse files
committed
some fixes
Signed-off-by: Adam Gutglick <adam@spiraldb.com>
1 parent 35cff5b commit 1f6ac32

3 files changed

Lines changed: 91 additions & 0 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

encodings/parquet-variant/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ vortex-session = { workspace = true }
2929

3030
[dev-dependencies]
3131
arrow-array = { workspace = true }
32+
arrow-buffer = { workspace = true }
3233
arrow-schema = { workspace = true }
3334
parquet-variant = { workspace = true }
3435
rstest = { workspace = true }

encodings/parquet-variant/src/lib.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,11 +460,13 @@ impl ValidityVTable<ParquetVariantVTable> for ParquetVariantVTable {
460460
mod tests {
461461
use std::sync::Arc;
462462

463+
use arrow_array::Array;
463464
use arrow_array::ArrayRef as ArrowArrayRef;
464465
use arrow_array::Int32Array;
465466
use arrow_array::StructArray;
466467
use arrow_array::builder::BinaryViewBuilder;
467468
use arrow_array::cast::AsArray;
469+
use arrow_buffer::NullBuffer;
468470
use arrow_schema::DataType;
469471
use arrow_schema::Field;
470472
use arrow_schema::Fields;
@@ -619,6 +621,25 @@ mod tests {
619621
.unwrap()
620622
}
621623

624+
fn assert_arrow_variant_storage_roundtrip(struct_array: StructArray) -> VortexResult<()> {
625+
let arrow_variant = ArrowVariantArray::try_new(&struct_array).unwrap();
626+
let vortex_arr = ParquetVariantArray::from_arrow_variant(&arrow_variant)?;
627+
628+
let mut ctx = LEGACY_SESSION.create_execution_ctx();
629+
let roundtripped = vortex_arr.execute_arrow(None, &mut ctx)?;
630+
631+
assert_eq!(struct_array.to_data(), roundtripped.as_struct().to_data());
632+
Ok(())
633+
}
634+
635+
fn binary_view_array<const N: usize>(values: [&[u8]; N]) -> ArrowArrayRef {
636+
let mut builder = BinaryViewBuilder::new();
637+
for value in values {
638+
builder.append_value(value);
639+
}
640+
Arc::new(builder.finish())
641+
}
642+
622643
#[test]
623644
fn test_serde_roundtrip_typed_value_variant() {
624645
let outer_metadata =
@@ -697,4 +718,72 @@ mod tests {
697718

698719
Ok(())
699720
}
721+
722+
#[test]
723+
fn test_arrow_variant_roundtrip_unshredded_storage() -> VortexResult<()> {
724+
let mut builder = VariantArrayBuilder::new(3);
725+
builder.append_variant(Variant::from(42i32));
726+
builder.append_variant(Variant::from("hello"));
727+
builder.append_variant(Variant::from(true));
728+
729+
assert_arrow_variant_storage_roundtrip(builder.build().into_inner().clone())
730+
}
731+
732+
#[test]
733+
fn test_arrow_variant_roundtrip_typed_value_only_storage() -> VortexResult<()> {
734+
let metadata = binary_view_array([b"\x01\x00", b"\x01\x00", b"\x01\x00"]);
735+
let typed_value: ArrowArrayRef = Arc::new(Int32Array::from(vec![10, 20, 30]));
736+
737+
let struct_array = StructArray::try_new(
738+
vec![
739+
Arc::new(Field::new("metadata", DataType::BinaryView, false)),
740+
Arc::new(Field::new("typed_value", DataType::Int32, false)),
741+
]
742+
.into(),
743+
vec![metadata, typed_value],
744+
None,
745+
)
746+
.unwrap();
747+
748+
assert_arrow_variant_storage_roundtrip(struct_array)
749+
}
750+
751+
#[test]
752+
fn test_arrow_variant_roundtrip_value_and_typed_value_storage() -> VortexResult<()> {
753+
let metadata = binary_view_array([b"\x01\x00", b"\x01\x00"]);
754+
let value = binary_view_array([b"\x10", b"\x11"]);
755+
let typed_value: ArrowArrayRef = Arc::new(Int32Array::from(vec![1, 2]));
756+
757+
let struct_array = StructArray::try_new(
758+
vec![
759+
Arc::new(Field::new("metadata", DataType::BinaryView, false)),
760+
Arc::new(Field::new("value", DataType::BinaryView, true)),
761+
Arc::new(Field::new("typed_value", DataType::Int32, false)),
762+
]
763+
.into(),
764+
vec![metadata, value, typed_value],
765+
None,
766+
)
767+
.unwrap();
768+
769+
assert_arrow_variant_storage_roundtrip(struct_array)
770+
}
771+
772+
#[test]
773+
fn test_arrow_variant_roundtrip_with_outer_nulls() -> VortexResult<()> {
774+
let metadata = binary_view_array([b"\x01\x00", b"\x01\x00", b"\x01\x00"]);
775+
let value = binary_view_array([b"\x10", b"\x00", b"\x11"]);
776+
let struct_array = StructArray::try_new(
777+
vec![
778+
Arc::new(Field::new("metadata", DataType::BinaryView, false)),
779+
Arc::new(Field::new("value", DataType::BinaryView, true)),
780+
]
781+
.into(),
782+
vec![metadata, value],
783+
Some(NullBuffer::from(vec![true, false, true])),
784+
)
785+
.unwrap();
786+
787+
assert_arrow_variant_storage_roundtrip(struct_array)
788+
}
700789
}

0 commit comments

Comments
 (0)