This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 859c30d ARROW-9336: [Ruby] Add support for missing keys in
StructArrayBuilder
859c30d is described below
commit 859c30d85505ba7698621c9672f97498b0397f1d
Author: Sutou Kouhei <[email protected]>
AuthorDate: Wed Jul 8 05:18:34 2020 +0900
ARROW-9336: [Ruby] Add support for missing keys in StructArrayBuilder
Closes #7649 from kou/ruby-struct-array-builder-missing-fields
Authored-by: Sutou Kouhei <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
ruby/red-arrow/lib/arrow/struct-array-builder.rb | 17 +++++++++++++----
ruby/red-arrow/test/test-struct-array-builder.rb | 12 ++++++++----
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/ruby/red-arrow/lib/arrow/struct-array-builder.rb
b/ruby/red-arrow/lib/arrow/struct-array-builder.rb
index 85d27a4..ce88316 100644
--- a/ruby/red-arrow/lib/arrow/struct-array-builder.rb
+++ b/ruby/red-arrow/lib/arrow/struct-array-builder.rb
@@ -32,7 +32,7 @@ module Arrow
case index_or_name
when String, Symbol
name = index_or_name
- (@name_to_builder ||= build_name_to_builder)[name.to_s]
+ cached_name_to_builder[name.to_s]
else
index = index_or_name
cached_field_builders[index]
@@ -70,13 +70,18 @@ module Arrow
append_null
when ::Array
append_value_raw
- value.each_with_index do |sub_value, i|
- self[i].append(sub_value)
+ cached_field_builders.zip(value) do |builder, sub_value|
+ builder.append(sub_value)
end
when Hash
append_value_raw
+ local_name_to_builder = cached_name_to_builder.dup
value.each do |name, sub_value|
- self[name].append(sub_value)
+ builder = local_name_to_builder.delete(name.to_s)
+ builder.append(sub_value)
+ end
+ local_name_to_builder.each do |_, builder|
+ builder.append_null
end
else
message =
@@ -133,5 +138,9 @@ module Arrow
end
name_to_builder
end
+
+ def cached_name_to_builder
+ @name_to_builder ||= build_name_to_builder
+ end
end
end
diff --git a/ruby/red-arrow/test/test-struct-array-builder.rb
b/ruby/red-arrow/test/test-struct-array-builder.rb
index c65cf99..0101719 100644
--- a/ruby/red-arrow/test/test-struct-array-builder.rb
+++ b/ruby/red-arrow/test/test-struct-array-builder.rb
@@ -38,10 +38,12 @@ class StructArrayBuilderTest < Test::Unit::TestCase
test("Array") do
@builder.append_value([true, 1])
+ @builder.append_value([])
+ @builder.append_value([false])
array = @builder.finish
assert_equal([
- [true],
- [1],
+ [true, nil, false],
+ [1, nil, nil],
],
[
array.find_field(0).to_a,
@@ -66,10 +68,12 @@ class StructArrayBuilderTest < Test::Unit::TestCase
test("Hash") do
@builder.append_value(count: 1, visible: true)
+ @builder.append_value(visible: false)
+ @builder.append_value(count: 2)
array = @builder.finish
assert_equal([
- [true],
- [1],
+ [true, false, nil],
+ [1, nil, 2],
],
[
array.find_field(0).to_a,