From be56f11ff34ecaed8894e7393a19e85fd584d65d Mon Sep 17 00:00:00 2001 From: Kevin Lim Date: Sun, 20 Oct 2024 03:08:24 -0700 Subject: [PATCH 1/3] Add support for building FixedSizeListBuilder in struct_builder's make_builders --- arrow-array/src/builder/struct_builder.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arrow-array/src/builder/struct_builder.rs b/arrow-array/src/builder/struct_builder.rs index c0e49b939f2c..06457fd30cbe 100644 --- a/arrow-array/src/builder/struct_builder.rs +++ b/arrow-array/src/builder/struct_builder.rs @@ -252,7 +252,11 @@ pub fn make_builder(datatype: &DataType, capacity: usize) -> Box { let builder = make_builder(field.data_type(), capacity); Box::new(LargeListBuilder::with_capacity(builder, capacity).with_field(field.clone())) - } + }, + DataType::FixedSizeList(field, size) => { + let builder = make_builder(field.data_type(), 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 { From b9539e2ddad23f60352de64dac92be7fe9a9e0ee Mon Sep 17 00:00:00 2001 From: Kevin Lim Date: Sun, 20 Oct 2024 03:26:23 -0700 Subject: [PATCH 2/3] Fix formatting --- arrow-array/src/builder/struct_builder.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/arrow-array/src/builder/struct_builder.rs b/arrow-array/src/builder/struct_builder.rs index 06457fd30cbe..595d51f23151 100644 --- a/arrow-array/src/builder/struct_builder.rs +++ b/arrow-array/src/builder/struct_builder.rs @@ -252,11 +252,14 @@ pub fn make_builder(datatype: &DataType, capacity: usize) -> Box { let builder = make_builder(field.data_type(), capacity); Box::new(LargeListBuilder::with_capacity(builder, capacity).with_field(field.clone())) - }, + } DataType::FixedSizeList(field, size) => { let builder = make_builder(field.data_type(), capacity); - Box::new(FixedSizeListBuilder::with_capacity(builder, *size, capacity).with_field(field.clone())) - }, + 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 { From b03161ada4522789c46effb6d4d380dac2838f0e Mon Sep 17 00:00:00 2001 From: Kevin Lim Date: Mon, 21 Oct 2024 10:28:26 -0700 Subject: [PATCH 3/3] Make suggested fixes + add test --- arrow-array/src/builder/struct_builder.rs | 31 +++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/arrow-array/src/builder/struct_builder.rs b/arrow-array/src/builder/struct_builder.rs index 595d51f23151..4561e052581c 100644 --- a/arrow-array/src/builder/struct_builder.rs +++ b/arrow-array/src/builder/struct_builder.rs @@ -254,9 +254,14 @@ pub fn make_builder(datatype: &DataType, capacity: usize) -> Box { - let builder = make_builder(field.data_type(), capacity); + 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) + FixedSizeListBuilder::with_capacity(builder, size, capacity) .with_field(field.clone()), ) } @@ -527,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();