diff --git a/arrow-array/src/builder/struct_builder.rs b/arrow-array/src/builder/struct_builder.rs index c0e49b939f2..4561e052581 100644 --- a/arrow-array/src/builder/struct_builder.rs +++ b/arrow-array/src/builder/struct_builder.rs @@ -253,6 +253,18 @@ pub fn make_builder(datatype: &DataType, capacity: usize) -> Box { + let size = *size; + let values_builder_capacity = { + let size: usize = size.try_into().unwrap(); + capacity * size + }; + let builder = make_builder(field.data_type(), values_builder_capacity); + Box::new( + FixedSizeListBuilder::with_capacity(builder, size, capacity) + .with_field(field.clone()), + ) + } DataType::Map(field, _) => match field.data_type() { DataType::Struct(fields) => { let map_field_names = MapFieldNames { @@ -520,6 +532,28 @@ mod tests { assert_eq!(0, builder.len()); } + #[test] + fn test_build_fixed_size_list() { + const LIST_LENGTH: i32 = 4; + let fixed_size_list_dtype = + DataType::new_fixed_size_list(DataType::Int32, LIST_LENGTH, false); + let mut builder = make_builder(&fixed_size_list_dtype, 10); + let builder = builder + .as_any_mut() + .downcast_mut::>>(); + match builder { + Some(builder) => { + assert_eq!(builder.value_length(), LIST_LENGTH); + assert!(builder + .values() + .as_any_mut() + .downcast_mut::() + .is_some()); + } + None => panic!("expected FixedSizeListBuilder, got a different builder type"), + } + } + #[test] fn test_struct_array_builder_finish_cloned() { let int_builder = Int32Builder::new();