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

kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 5d3014ac40 GH-49027: [Ruby] Add support for writing time arrays 
(#49028)
5d3014ac40 is described below

commit 5d3014ac40379e061bfb04e627fc7e4ff8e79cee
Author: Sutou Kouhei <[email protected]>
AuthorDate: Thu Jan 29 07:23:38 2026 +0900

    GH-49027: [Ruby] Add support for writing time arrays (#49028)
    
    ### Rationale for this change
    
    There are 32/64 bit and second/millisecond/microsecond/nanosecond variants 
for time arrays.
    
    ### What changes are included in this PR?
    
    * Add `ArrowFormat::TimeType#to_flatbuffers`
    * Add bit width information to `ArrowFormat::TimeType`
    
    ### Are these changes tested?
    
    Yes.
    
    ### Are there any user-facing changes?
    
    Yes.
    
    * GitHub Issue: #49027
    
    Authored-by: Sutou Kouhei <[email protected]>
    Signed-off-by: Sutou Kouhei <[email protected]>
---
 ruby/red-arrow-format/lib/arrow-format/type.rb |  19 ++++-
 ruby/red-arrow-format/test/test-reader.rb      |   3 +-
 ruby/red-arrow-format/test/test-writer.rb      | 114 +++++++++++++++++++++++++
 3 files changed, 134 insertions(+), 2 deletions(-)

diff --git a/ruby/red-arrow-format/lib/arrow-format/type.rb 
b/ruby/red-arrow-format/lib/arrow-format/type.rb
index a114ef225b..4875cda27e 100644
--- a/ruby/red-arrow-format/lib/arrow-format/type.rb
+++ b/ruby/red-arrow-format/lib/arrow-format/type.rb
@@ -388,14 +388,27 @@ module ArrowFormat
   end
 
   class TimeType < TemporalType
+    attr_reader :bit_width
     attr_reader :unit
-    def initialize(unit)
+    def initialize(bit_width, unit)
       super()
+      @bit_width = bit_width
       @unit = unit
     end
+
+    def to_flatbuffers
+      fb_type = FB::Time::Data.new
+      fb_type.bit_width = @bit_width
+      fb_type.unit = FB::TimeUnit.try_convert(@unit.to_s.upcase)
+      fb_type
+    end
   end
 
   class Time32Type < TimeType
+    def initialize(unit)
+      super(32, unit)
+    end
+
     def name
       "Time32"
     end
@@ -406,6 +419,10 @@ module ArrowFormat
   end
 
   class Time64Type < TimeType
+    def initialize(unit)
+      super(64, unit)
+    end
+
     def name
       "Time64"
     end
diff --git a/ruby/red-arrow-format/test/test-reader.rb 
b/ruby/red-arrow-format/test/test-reader.rb
index d59ae9cb16..a5919c3fb9 100644
--- a/ruby/red-arrow-format/test/test-reader.rb
+++ b/ruby/red-arrow-format/test/test-reader.rb
@@ -225,7 +225,8 @@ module ReaderTests
           end
 
           def build_array
-            Arrow::Time32Array.new(:second, [@time_00_00_10, nil, 
@time_00_01_10])
+            Arrow::Time32Array.new(:second,
+                                   [@time_00_00_10, nil, @time_00_01_10])
           end
 
           def test_read
diff --git a/ruby/red-arrow-format/test/test-writer.rb 
b/ruby/red-arrow-format/test/test-writer.rb
index 6eb1273b7a..e65a60be1f 100644
--- a/ruby/red-arrow-format/test/test-writer.rb
+++ b/ruby/red-arrow-format/test/test-writer.rb
@@ -46,6 +46,20 @@ module WriterTests
       ArrowFormat::Date32Type.singleton
     when Arrow::Date64DataType
       ArrowFormat::Date64Type.singleton
+    when Arrow::Time32DataType
+      case red_arrow_type.unit.nick
+      when "second"
+        ArrowFormat::Time32Type.new(:second)
+      when "milli"
+        ArrowFormat::Time32Type.new(:millisecond)
+      end
+    when Arrow::Time64DataType
+      case red_arrow_type.unit.nick
+      when "micro"
+        ArrowFormat::Time64Type.new(:microsecond)
+      when "nano"
+        ArrowFormat::Time64Type.new(:nanosecond)
+      end
     when Arrow::BinaryDataType
       ArrowFormat::BinaryType.singleton
     when Arrow::LargeBinaryDataType
@@ -268,6 +282,106 @@ module WriterTests
           end
         end
 
+        sub_test_case("Time32(:second)") do
+          def setup(&block)
+            @time_00_00_10 = 10
+            @time_00_01_10 = 60 + 10
+            super(&block)
+          end
+
+          def build_array
+            Arrow::Time32Array.new(:second,
+                                   [@time_00_00_10, nil, @time_00_01_10])
+          end
+
+          def test_write
+            assert_equal([
+                           Arrow::Time.new(:second, @time_00_00_10),
+                           nil,
+                           Arrow::Time.new(:second, @time_00_01_10),
+                         ],
+                         @values)
+          end
+        end
+
+        sub_test_case("Time32(:millisecond)") do
+          def setup(&block)
+            @time_00_00_10_000 = 10 * 1000
+            @time_00_01_10_000 = (60 + 10) * 1000
+            super(&block)
+          end
+
+          def build_array
+            Arrow::Time32Array.new(:milli,
+                                   [
+                                     @time_00_00_10_000,
+                                     nil,
+                                     @time_00_01_10_000,
+                                   ])
+          end
+
+          def test_write
+            assert_equal([
+                           Arrow::Time.new(:milli, @time_00_00_10_000),
+                           nil,
+                           Arrow::Time.new(:milli, @time_00_01_10_000),
+                         ],
+                         @values)
+          end
+        end
+
+        sub_test_case("Time64(:microsecond)") do
+          def setup(&block)
+            @time_00_00_10_000_000 = 10 * 1_000_000
+            @time_00_01_10_000_000 = (60 + 10) * 1_000_000
+            super(&block)
+          end
+
+          def build_array
+            Arrow::Time64Array.new(:micro,
+                                   [
+                                     @time_00_00_10_000_000,
+                                     nil,
+                                     @time_00_01_10_000_000,
+                                   ])
+          end
+
+          def test_write
+            assert_equal([
+                           Arrow::Time.new(:micro, @time_00_00_10_000_000),
+                           nil,
+                           Arrow::Time.new(:micro, @time_00_01_10_000_000),
+                         ],
+                         @values)
+          end
+        end
+
+        sub_test_case("Time64(:nanosecond)") do
+          def setup(&block)
+            @time_00_00_10_000_000_000 = 10 * 1_000_000_000
+            @time_00_01_10_000_000_000 = (60 + 10) * 1_000_000_000
+            super(&block)
+          end
+
+          def build_array
+            Arrow::Time64Array.new(:nano,
+                                   [
+                                     @time_00_00_10_000_000_000,
+                                     nil,
+                                     @time_00_01_10_000_000_000,
+                                   ])
+          end
+
+          def test_write
+            assert_equal([
+                           Arrow::Time.new(:nano, @time_00_00_10_000_000_000),
+                           nil,
+                           Arrow::Time.new(:nano, @time_00_01_10_000_000_000),
+                         ],
+                         @values)
+          end
+        end
+
         sub_test_case("Binary") do
           def build_array
             Arrow::BinaryArray.new(["Hello".b, nil, "World".b])

Reply via email to