This is an automated email from the ASF dual-hosted git repository.

shiro 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 03874ef  ARROW-7275: [Ruby] Add support for 
Arrow::ListDataType.new(data_type)
03874ef is described below

commit 03874ef5c66f49370218ae60d048e7bf33561c6a
Author: Sutou Kouhei <k...@clear-code.com>
AuthorDate: Sat Nov 30 08:33:25 2019 +0900

    ARROW-7275: [Ruby] Add support for Arrow::ListDataType.new(data_type)
    
    "item" is used as the default field name for this case.
    
    Closes #5924 from kou/ruby-list-data-type-new and squashes the following 
commits:
    
    0a4cfb7a8 <Sutou Kouhei>  Add support for Arrow::ListDataType.new(data_type)
    
    Authored-by: Sutou Kouhei <k...@clear-code.com>
    Signed-off-by: Yosuke Shiro <yosuke.shiro...@gmail.com>
---
 ruby/red-arrow/lib/arrow/list-data-type.rb | 66 ++++++++++++++++++++++++++----
 ruby/red-arrow/test/test-list-data-type.rb | 28 ++++++++++++-
 2 files changed, 85 insertions(+), 9 deletions(-)

diff --git a/ruby/red-arrow/lib/arrow/list-data-type.rb 
b/ruby/red-arrow/lib/arrow/list-data-type.rb
index c097da4..cfcdd2a 100644
--- a/ruby/red-arrow/lib/arrow/list-data-type.rb
+++ b/ruby/red-arrow/lib/arrow/list-data-type.rb
@@ -53,16 +53,66 @@ module Arrow
     #
     #   @example Create a list data type with field description
     #     Arrow::ListDataType.new(field: {name: "visible", type: :boolean})
-    def initialize(field)
-      if field.is_a?(Hash) and field.key?(:field)
-        description = field
-        field = description[:field]
-      end
-      if field.is_a?(Hash)
-        field_description = field
-        field = Field.new(field_description)
+    #
+    # @overload initialize(data_type)
+    #
+    #   @param data_type [Arrow::DataType, String, Symbol,
+    #     ::Array<String>, ::Array<Symbol>, Hash] The element data
+    #     type of the list data type. A field is created with the
+    #     default name `"item"` from the data type automatically.
+    #
+    #     See {Arrow::DataType.resolve} how to specify data type.
+    #
+    #   @example Create a list data type with {Arrow::DataType}
+    #     Arrow::ListDataType.new(Arrow::BooleanDataType.new)
+    #
+    #   @example Create a list data type with data type name as String
+    #     Arrow::ListDataType.new("boolean")
+    #
+    #   @example Create a list data type with data type name as Symbol
+    #     Arrow::ListDataType.new(:boolean)
+    #
+    #   @example Create a list data type with data type as Array
+    #     Arrow::ListDataType.new([:time32, :milli])
+    def initialize(arg)
+      data_type = resolve_data_type(arg)
+      if data_type
+        field = Field.new(default_field_name, data_type)
+      else
+        field = resolve_field(arg)
       end
       initialize_raw(field)
     end
+
+    private
+    def resolve_data_type(arg)
+      case arg
+      when DataType, String, Symbol, ::Array
+        DataType.resolve(arg)
+      when Hash
+        return nil if arg[:name]
+        return nil unless arg[:type]
+        DataType.resolve(arg)
+      else
+        nil
+      end
+    end
+
+    def default_field_name
+      "item"
+    end
+
+    def resolve_field(arg)
+      if arg.is_a?(Hash) and arg.key?(:field)
+        description = arg
+        arg = description[:field]
+      end
+      if arg.is_a?(Hash)
+        field_description = arg
+        Field.new(field_description)
+      else
+        arg
+      end
+    end
   end
 end
diff --git a/ruby/red-arrow/test/test-list-data-type.rb 
b/ruby/red-arrow/test/test-list-data-type.rb
index cca6ca3..ada4639 100644
--- a/ruby/red-arrow/test/test-list-data-type.rb
+++ b/ruby/red-arrow/test/test-list-data-type.rb
@@ -23,7 +23,7 @@ class ListDataTypeTest < Test::Unit::TestCase
                    Arrow::ListDataType.new(field).to_s)
     end
 
-    test("Hash") do
+    test("name: String") do
       assert_equal("list<tag: string>",
                    Arrow::ListDataType.new(name: "tag", type: :string).to_s)
     end
@@ -39,5 +39,31 @@ class ListDataTypeTest < Test::Unit::TestCase
       assert_equal("list<tag: string>",
                    Arrow::ListDataType.new(field: field_description).to_s)
     end
+
+    test("Arrow::DataType") do
+      data_type = Arrow::BooleanDataType.new
+      assert_equal("list<item: bool>",
+                   Arrow::ListDataType.new(data_type).to_s)
+    end
+
+    test("String") do
+      assert_equal("list<item: bool>",
+                   Arrow::ListDataType.new("boolean").to_s)
+    end
+
+    test("Symbol") do
+      assert_equal("list<item: bool>",
+                   Arrow::ListDataType.new(:boolean).to_s)
+    end
+
+    test("[data type name, additional information]") do
+      assert_equal("list<item: time32[ms]>",
+                   Arrow::ListDataType.new([:time32, :milli]).to_s)
+    end
+
+    test("type: Symbol") do
+      assert_equal("list<item: bool>",
+                   Arrow::ListDataType.new(type: :boolean).to_s)
+    end
   end
 end

Reply via email to