in datafusion/common/src/scalar/mod.rs [6086:6286]
fn test_lists_in_struct() {
let field_a = Arc::new(Field::new("A", DataType::Utf8, false));
let field_primitive_list = Arc::new(Field::new(
"primitive_list",
DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
false,
));
// Define primitive list scalars
let l0 =
ScalarValue::List(Arc::new(
ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
Some(1),
Some(2),
Some(3),
])]),
));
let l1 =
ScalarValue::List(Arc::new(
ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
Some(4),
Some(5),
])]),
));
let l2 = ScalarValue::List(Arc::new(ListArray::from_iter_primitive::<
Int32Type,
_,
_,
>(vec![Some(vec![Some(6)])])));
// Define struct scalars
let s0 = ScalarValue::from(vec![
("A", ScalarValue::from("First")),
("primitive_list", l0),
]);
let s1 = ScalarValue::from(vec![
("A", ScalarValue::from("Second")),
("primitive_list", l1),
]);
let s2 = ScalarValue::from(vec![
("A", ScalarValue::from("Third")),
("primitive_list", l2),
]);
// iter_to_array for struct scalars
let array =
ScalarValue::iter_to_array(vec![s0.clone(), s1.clone(), s2.clone()]).unwrap();
let array = as_struct_array(&array).unwrap();
let expected = StructArray::from(vec![
(
Arc::clone(&field_a),
Arc::new(StringArray::from(vec!["First", "Second", "Third"])) as ArrayRef,
),
(
Arc::clone(&field_primitive_list),
Arc::new(ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
Some(vec![Some(1), Some(2), Some(3)]),
Some(vec![Some(4), Some(5)]),
Some(vec![Some(6)]),
])),
),
]);
assert_eq!(array, &expected);
// Define list-of-structs scalars
let nl0_array = ScalarValue::iter_to_array(vec![s0, s1.clone()]).unwrap();
let nl0 = SingleRowListArrayBuilder::new(nl0_array).build_list_scalar();
let nl1_array = ScalarValue::iter_to_array(vec![s2]).unwrap();
let nl1 = SingleRowListArrayBuilder::new(nl1_array).build_list_scalar();
let nl2_array = ScalarValue::iter_to_array(vec![s1]).unwrap();
let nl2 = SingleRowListArrayBuilder::new(nl2_array).build_list_scalar();
// iter_to_array for list-of-struct
let array = ScalarValue::iter_to_array(vec![nl0, nl1, nl2]).unwrap();
let array = array.as_list::<i32>();
// Construct expected array with array builders
let field_a_builder = StringBuilder::with_capacity(4, 1024);
let primitive_value_builder = Int32Array::builder(8);
let field_primitive_list_builder = ListBuilder::new(primitive_value_builder);
let element_builder = StructBuilder::new(
vec![field_a, field_primitive_list],
vec![
Box::new(field_a_builder),
Box::new(field_primitive_list_builder),
],
);
let mut list_builder = ListBuilder::new(element_builder);
list_builder
.values()
.field_builder::<StringBuilder>(0)
.unwrap()
.append_value("First");
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(1);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(2);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(3);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.append(true);
list_builder.values().append(true);
list_builder
.values()
.field_builder::<StringBuilder>(0)
.unwrap()
.append_value("Second");
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(4);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(5);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.append(true);
list_builder.values().append(true);
list_builder.append(true);
list_builder
.values()
.field_builder::<StringBuilder>(0)
.unwrap()
.append_value("Third");
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(6);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.append(true);
list_builder.values().append(true);
list_builder.append(true);
list_builder
.values()
.field_builder::<StringBuilder>(0)
.unwrap()
.append_value("Second");
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(4);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.values()
.append_value(5);
list_builder
.values()
.field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
.unwrap()
.append(true);
list_builder.values().append(true);
list_builder.append(true);
let expected = list_builder.finish();
assert_eq!(array, &expected);
}