diff --git a/ruby/red-arrow/lib/arrow/array-builder.rb b/ruby/red-arrow/lib/arrow/array-builder.rb index 876fd71120b..2ccf50f3c1b 100644 --- a/ruby/red-arrow/lib/arrow/array-builder.rb +++ b/ruby/red-arrow/lib/arrow/array-builder.rb @@ -155,12 +155,14 @@ def detect_builder_info(value, builder_info) sub_builder_info = detect_builder_info(sub_value, sub_builder_info) break if sub_builder_info and sub_builder_info[:detected] end - if sub_builder_info and sub_builder_info[:detected] - sub_value_data_type = sub_builder_info[:builder].value_data_type + if sub_builder_info + sub_builder = sub_builder_info[:builder] + return builder_info unless sub_builder + sub_value_data_type = sub_builder.value_data_type field = Field.new("item", sub_value_data_type) { builder: ListArrayBuilder.new(ListDataType.new(field)), - detected: true, + detected: sub_builder_info[:detected], } else builder_info diff --git a/ruby/red-arrow/test/test-array-builder.rb b/ruby/red-arrow/test/test-array-builder.rb index fb48aba8a42..7a2d42e54b3 100644 --- a/ruby/red-arrow/test/test-array-builder.rb +++ b/ruby/red-arrow/test/test-array-builder.rb @@ -146,6 +146,46 @@ def assert_build(builder_class, raw_array) ["Apache Arrow"], ]) end + + test("lists") do + values = [ + [0, 1, 2], + [3, 4], + ] + array = Arrow::Array.new(values) + data_type = Arrow::ListDataType.new(Arrow::UInt8DataType.new) + assert_equal({ + data_type: data_type, + values: [ + [0, 1, 2], + [3, 4], + ], + }, + { + data_type: array.value_data_type, + values: array.to_a, + }) + end + + test("lists") do + values = [ + [0, -1, 2], + [3, 4], + ] + array = Arrow::Array.new(values) + data_type = Arrow::ListDataType.new(Arrow::Int8DataType.new) + assert_equal({ + data_type: data_type, + values: [ + [0, -1, 2], + [3, 4], + ], + }, + { + data_type: array.value_data_type, + values: array.to_a, + }) + end end sub_test_case("specific builder") do