Skip to content

Commit b90d010

Browse files
committed
tests
Signed-off-by: Robert Kruszewski <[email protected]>
1 parent 9ab108c commit b90d010

File tree

1 file changed

+93
-10
lines changed

1 file changed

+93
-10
lines changed

vortex-duckdb/src/convert/vector.rs

Lines changed: 93 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,21 @@ use arrow_array::types::{
1111
};
1212
use arrow_array::{
1313
Array, BooleanArray, Date32Array, Decimal128Array, FixedSizeListArray, GenericListViewArray,
14-
PrimitiveArray, StringArray, StructArray, Time64MicrosecondArray, Time64NanosecondArray,
14+
PrimitiveArray, StringArray, Time64MicrosecondArray, Time64NanosecondArray,
1515
TimestampMicrosecondArray, TimestampMillisecondArray, TimestampNanosecondArray,
1616
TimestampSecondArray,
1717
};
1818
use arrow_buffer::buffer::BooleanBuffer;
19+
use arrow_schema::Field;
1920
use num_traits::AsPrimitive;
2021
use vortex::ArrayRef;
22+
use vortex::arrays::StructArray;
2123
use vortex::arrow::FromArrowArray;
2224
use vortex::buffer::BufferMut;
2325
use vortex::dtype::{DType, DecimalDType, FieldNames, Nullability};
2426
use vortex::error::{VortexExpect, VortexResult, vortex_err};
2527
use vortex::scalar::DecimalType;
28+
use vortex::validity::Validity;
2629

2730
use crate::convert::dtype::FromLogicalType;
2831
use crate::cpp::{
@@ -332,7 +335,7 @@ pub fn flat_vector_to_arrow_array(
332335
len * array_elem_size as usize,
333336
)?;
334337
Ok(Arc::new(FixedSizeListArray::try_new(
335-
Arc::new(arrow_schema::Field::new(
338+
Arc::new(Field::new(
336339
"element",
337340
DType::from_logical_type(array_child_type, Nullability::Nullable)?
338341
.to_arrow_dtype()?,
@@ -363,7 +366,7 @@ pub fn flat_vector_to_arrow_array(
363366
}
364367

365368
Ok(Arc::new(GenericListViewArray::try_new(
366-
Arc::new(arrow_schema::Field::new(
369+
Arc::new(Field::new(
367370
"element",
368371
DType::from_logical_type(array_child_type, Nullability::Nullable)?
369372
.to_arrow_dtype()?,
@@ -381,8 +384,8 @@ pub fn flat_vector_to_arrow_array(
381384
flat_vector_to_arrow_array(&mut vector.struct_vector_get_child(idx), len)
382385
})
383386
.collect::<Result<Vec<_>, _>>()?;
384-
Ok(Arc::new(StructArray::try_new(
385-
DType::from_logical_type(vector.logical_type(), Nullability::Nullable)?
387+
Ok(Arc::new(arrow_array::StructArray::try_new(
388+
DType::from_logical_type(vector.logical_type(), Nullability::NonNullable)?
386389
.to_arrow_schema()?
387390
.fields,
388391
children,
@@ -397,28 +400,37 @@ pub fn data_chunk_to_arrow(field_names: &FieldNames, chunk: &DataChunk) -> Vorte
397400
let len = chunk.len();
398401

399402
let columns = (0..chunk.column_count())
400-
.zip(field_names.iter())
401-
.map(|(i, name)| {
403+
.map(|i| {
402404
let mut vector = chunk.get_vector(i);
403405
vector.flatten(len);
404406
flat_vector_to_arrow_array(&mut vector, len.as_())
405407
.map(|array_data| {
406408
let chunk_len: usize = chunk.len().as_();
407409
assert_eq!(array_data.len(), chunk_len);
408-
(name, ArrayRef::from_arrow(array_data.as_ref(), true))
410+
ArrayRef::from_arrow(array_data.as_ref(), true)
409411
})
410412
.map_err(|e| vortex_err!("duckdb to arrow conversion failure {e}"))
411413
})
412-
.collect::<VortexResult<Vec<_>>>()?;
413-
vortex::arrays::StructArray::try_from_iter(columns).map(|a| a.to_array())
414+
.collect::<VortexResult<Arc<_>>>()?;
415+
StructArray::try_new(
416+
field_names.clone(),
417+
columns,
418+
len.as_(),
419+
Validity::NonNullable,
420+
)
421+
.map(|a| a.to_array())
414422
}
415423

416424
#[cfg(test)]
417425
mod tests {
426+
use std::ffi::CString;
427+
428+
use arrow_array::cast::AsArray;
418429
use arrow_array::{
419430
BooleanArray, Int32Array, TimestampMicrosecondArray, TimestampMillisecondArray,
420431
TimestampSecondArray,
421432
};
433+
use vortex::error::VortexUnwrap;
422434

423435
use super::*;
424436
use crate::cpp::DUCKDB_TYPE;
@@ -676,4 +688,75 @@ mod tests {
676688
assert_eq!(arrow_array.value(0), 1);
677689
assert_eq!(arrow_array.value(2), 3);
678690
}
691+
692+
#[test]
693+
fn test_fixed_sized_list() {
694+
let values = vec![1i32, 2, 3, 4];
695+
let len = values.len();
696+
697+
let logical_type =
698+
LogicalType::array_type(LogicalType::new(DUCKDB_TYPE::DUCKDB_TYPE_INTEGER), 4)
699+
.vortex_unwrap();
700+
let mut vector = Vector::with_capacity(logical_type, len);
701+
702+
// Populate with data
703+
unsafe {
704+
let mut child = vector.array_vector_get_child();
705+
let slice = child.as_slice_mut::<i32>(len);
706+
slice.copy_from_slice(&values);
707+
}
708+
709+
// Test conversion
710+
let result = flat_vector_to_arrow_array(&mut vector, len).unwrap();
711+
let arrow_array = result.as_fixed_size_list();
712+
713+
assert_eq!(arrow_array.len(), len);
714+
assert_eq!(
715+
arrow_array.value(0).as_primitive::<Int32Type>(),
716+
&Int32Array::from_iter([1, 2, 3, 4])
717+
);
718+
}
719+
720+
#[test]
721+
fn test_struct() {
722+
let values1 = vec![1i32, 2, 3, 4];
723+
let values2 = vec![5i32, 6, 7, 8];
724+
let len = values1.len();
725+
726+
let logical_type = LogicalType::struct_type(
727+
[
728+
LogicalType::new(DUCKDB_TYPE::DUCKDB_TYPE_INTEGER),
729+
LogicalType::new(DUCKDB_TYPE::DUCKDB_TYPE_INTEGER),
730+
],
731+
[CString::new("a").unwrap(), CString::new("b").unwrap()],
732+
)
733+
.vortex_unwrap();
734+
let mut vector = Vector::with_capacity(logical_type, len);
735+
736+
// Populate with data
737+
for (i, values) in
738+
(0..vector.logical_type().struct_type_child_count()).zip([values1, values2])
739+
{
740+
unsafe {
741+
let mut child = vector.struct_vector_get_child(i);
742+
let slice = child.as_slice_mut::<i32>(len);
743+
slice.copy_from_slice(&values);
744+
}
745+
}
746+
747+
// Test conversion
748+
let result = flat_vector_to_arrow_array(&mut vector, len).unwrap();
749+
let arrow_array = result.as_struct();
750+
751+
assert_eq!(arrow_array.len(), len);
752+
assert_eq!(arrow_array.fields().len(), 2);
753+
assert_eq!(
754+
arrow_array.column(0).as_primitive::<Int32Type>(),
755+
&Int32Array::from_iter([1, 2, 3, 4])
756+
);
757+
assert_eq!(
758+
arrow_array.column(1).as_primitive::<Int32Type>(),
759+
&Int32Array::from_iter([5, 6, 7, 8])
760+
);
761+
}
679762
}

0 commit comments

Comments
 (0)