Skip to content

Commit 5e55456

Browse files
Into canonical (for list) should use dtype of elements, not inferred type of elements. (#1726)
1 parent 5b6a968 commit 5e55456

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

vortex-array/src/canonical.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::sync::Arc;
44

55
use arrow_array::types::*;
66
use arrow_array::{
7-
ArrayRef, ArrowPrimitiveType, BooleanArray as ArrowBoolArray, Date32Array, Date64Array,
7+
Array, ArrayRef, ArrowPrimitiveType, BooleanArray as ArrowBoolArray, Date32Array, Date64Array,
88
NullArray as ArrowNullArray, PrimitiveArray as ArrowPrimitiveArray,
99
StructArray as ArrowStructArray, Time32MillisecondArray, Time32SecondArray,
1010
Time64MicrosecondArray, Time64NanosecondArray, TimestampMicrosecondArray,
@@ -253,12 +253,13 @@ fn list_to_arrow(list: ListArray) -> VortexResult<ArrayRef> {
253253
.map_err(|err| err.with_context("Failed to cast offsets to PrimitiveArray of i32"))?,
254254
};
255255

256+
let values = list.elements().into_arrow()?;
257+
256258
let field_ref = FieldRef::new(Field::new_list_field(
257-
infer_data_type(list.elements().dtype())?,
259+
values.data_type().clone(),
258260
list.validity().nullability().into(),
259261
));
260262

261-
let values = list.elements().into_arrow()?;
262263
let nulls = list.logical_validity().to_null_buffer()?;
263264

264265
Ok(match offsets.ptype() {
@@ -526,9 +527,10 @@ mod test {
526527
use arrow_array::cast::AsArray;
527528
use arrow_array::types::{Int32Type, Int64Type, UInt64Type};
528529
use arrow_array::{
529-
PrimitiveArray as ArrowPrimitiveArray, StringViewArray, StructArray as ArrowStructArray,
530+
ListArray as ArrowListArray, PrimitiveArray as ArrowPrimitiveArray, StringArray,
531+
StringViewArray, StructArray as ArrowStructArray,
530532
};
531-
use arrow_buffer::NullBufferBuilder;
533+
use arrow_buffer::{NullBufferBuilder, OffsetBuffer};
532534
use arrow_schema::{DataType, Field};
533535

534536
use crate::array::{PrimitiveArray, SparseArray, StructArray};
@@ -641,4 +643,24 @@ mod test {
641643
vortex_struct.into_arrow().unwrap().as_struct()
642644
);
643645
}
646+
647+
#[test]
648+
fn roundtrip_list() {
649+
let names = Arc::new(StringArray::from_iter(vec![
650+
Some("Joseph"),
651+
Some("Angela"),
652+
Some("Mikhail"),
653+
]));
654+
655+
let arrow_list = ArrowListArray::new(
656+
Arc::new(Field::new_list_field(DataType::Utf8, true)),
657+
OffsetBuffer::from_lengths(vec![0, 2, 1]),
658+
names,
659+
None,
660+
);
661+
662+
let vortex_list = ArrayData::from_arrow(&arrow_list, true);
663+
664+
assert_eq!(&arrow_list, vortex_list.into_arrow().unwrap().as_list());
665+
}
644666
}

0 commit comments

Comments
 (0)