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,

Reply via email to