From a6cffea588670333e27a58617712a05d7aa6f556 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 26 Jan 2026 23:52:56 +0900 Subject: [PATCH] GH-48990: [Ruby] Add support for writing date arrays --- .../red-arrow-format/lib/arrow-format/type.rb | 21 ++++++++- ruby/red-arrow-format/test/test-reader.rb | 6 +-- ruby/red-arrow-format/test/test-writer.rb | 46 +++++++++++++++++++ 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/ruby/red-arrow-format/lib/arrow-format/type.rb b/ruby/red-arrow-format/lib/arrow-format/type.rb index c648e5b63137..b3b5bf7aba9b 100644 --- a/ruby/red-arrow-format/lib/arrow-format/type.rb +++ b/ruby/red-arrow-format/lib/arrow-format/type.rb @@ -330,10 +330,21 @@ def build_array(size, validity_buffer, values_buffer) end end - class TemporalType < Type + class TemporalType < PrimitiveType end class DateType < TemporalType + attr_reader :unit + def initialize(unit) + super() + @unit = unit + end + + def to_flatbuffers + fb_type = FB::Date::Data.new + fb_type.unit = FB::DateUnit.try_convert(@unit.to_s.upcase) + fb_type + end end class Date32Type < DateType @@ -343,6 +354,10 @@ def singleton end end + def initialize + super(:day) + end + def name "Date32" end @@ -359,6 +374,10 @@ def singleton end end + def initialize + super(:millisecond) + end + def name "Date64" end diff --git a/ruby/red-arrow-format/test/test-reader.rb b/ruby/red-arrow-format/test/test-reader.rb index e00489673760..d59ae9cb1685 100644 --- a/ruby/red-arrow-format/test/test-reader.rb +++ b/ruby/red-arrow-format/test/test-reader.rb @@ -191,7 +191,7 @@ def test_read sub_test_case("Date64") do def setup(&block) @date_2017_08_28_00_00_00 = 1503878400000 - @date_2025_12_09_00_00_00 = 1765324800000 + @date_2025_12_10_00_00_00 = 1765324800000 super(&block) end @@ -199,7 +199,7 @@ def build_array Arrow::Date64Array.new([ @date_2017_08_28_00_00_00, nil, - @date_2025_12_09_00_00_00, + @date_2025_12_10_00_00_00, ]) end @@ -209,7 +209,7 @@ def test_read "value" => [ @date_2017_08_28_00_00_00, nil, - @date_2025_12_09_00_00_00, + @date_2025_12_10_00_00_00, ], }, ], diff --git a/ruby/red-arrow-format/test/test-writer.rb b/ruby/red-arrow-format/test/test-writer.rb index 24a49b3777f3..31c2bef299ae 100644 --- a/ruby/red-arrow-format/test/test-writer.rb +++ b/ruby/red-arrow-format/test/test-writer.rb @@ -42,6 +42,10 @@ def convert_type(red_arrow_type) ArrowFormat::Float32Type.singleton when Arrow::DoubleDataType ArrowFormat::Float64Type.singleton + when Arrow::Date32DataType + ArrowFormat::Date32Type.singleton + when Arrow::Date64DataType + ArrowFormat::Date64Type.singleton when Arrow::BinaryDataType ArrowFormat::BinaryType.singleton when Arrow::LargeBinaryDataType @@ -220,6 +224,48 @@ def test_write end end + sub_test_case("Date32") do + def setup(&block) + @date_2017_08_28 = 17406 + @date_2025_12_09 = 20431 + super(&block) + end + + def build_array + Arrow::Date32Array.new([@date_2017_08_28, nil, @date_2025_12_09]) + end + + def test_write + assert_equal([Date.new(2017, 8, 28), nil, Date.new(2025, 12, 9)], + @values) + end + end + + sub_test_case("Date64") do + def setup(&block) + @date_2017_08_28_00_00_00 = 1503878400000 + @date_2025_12_10_00_00_00 = 1765324800000 + super(&block) + end + + def build_array + Arrow::Date64Array.new([ + @date_2017_08_28_00_00_00, + nil, + @date_2025_12_10_00_00_00, + ]) + end + + def test_write + assert_equal([ + DateTime.new(2017, 8, 28, 0, 0, 0), + nil, + DateTime.new(2025, 12, 10, 0, 0, 0), + ], + @values) + end + end + sub_test_case("Binary") do def build_array Arrow::BinaryArray.new(["Hello".b, nil, "World".b])