Skip to content

Commit 9c1a05c

Browse files
authored
GH-48412: [Ruby] Add support for reading date32 array (#48413)
### Rationale for this change It's a day variant of date array. ### What changes are included in this PR? * Add `ArrowFormat::Date32Type` * Add `ArrowFormat::Date32Array` * Add a missing test for float64 array (This is not related. Sorry.) ### Are these changes tested? Yes. ### Are there any user-facing changes? Yes. * GitHub Issue: #48412 Authored-by: Sutou Kouhei <[email protected]> Signed-off-by: Sutou Kouhei <[email protected]>
1 parent 1515197 commit 9c1a05c

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

ruby/red-arrow-format/lib/arrow-format/array.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ def to_a
110110
end
111111
end
112112

113+
class DateArray < Array
114+
def initialize(type, size, validity_buffer, values_buffer)
115+
super(type, size, validity_buffer)
116+
@values_buffer = values_buffer
117+
end
118+
end
119+
120+
class Date32Array < DateArray
121+
def to_a
122+
apply_validity(@values_buffer.values(:s32, 0, @size))
123+
end
124+
end
125+
113126
class VariableSizeBinaryLayoutArray < Array
114127
def initialize(type, size, validity_buffer, offsets_buffer, values_buffer)
115128
super(type, size, validity_buffer)

ruby/red-arrow-format/lib/arrow-format/file-reader.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
require_relative "org/apache/arrow/flatbuf/binary"
2626
require_relative "org/apache/arrow/flatbuf/bool"
27+
require_relative "org/apache/arrow/flatbuf/date"
28+
require_relative "org/apache/arrow/flatbuf/date_unit"
2729
require_relative "org/apache/arrow/flatbuf/floating_point"
2830
require_relative "org/apache/arrow/flatbuf/footer"
2931
require_relative "org/apache/arrow/flatbuf/int"
@@ -160,6 +162,11 @@ def read_field(fb_field)
160162
when Org::Apache::Arrow::Flatbuf::Precision::DOUBLE
161163
type = Float64Type.singleton
162164
end
165+
when Org::Apache::Arrow::Flatbuf::Date
166+
case fb_type.unit
167+
when Org::Apache::Arrow::Flatbuf::DateUnit::DAY
168+
type = Date32Type.singleton
169+
end
163170
when Org::Apache::Arrow::Flatbuf::List
164171
type = ListType.new(read_field(fb_field.children[0]))
165172
when Org::Apache::Arrow::Flatbuf::LargeList
@@ -201,7 +208,8 @@ def read_column(field, nodes, buffers, body)
201208

202209
case field.type
203210
when BooleanType,
204-
NumberType
211+
NumberType,
212+
DateType
205213
values_buffer = buffers.shift
206214
values = body.slice(values_buffer.offset, values_buffer.length)
207215
field.type.build_array(length, validity, values)

ruby/red-arrow-format/lib/arrow-format/type.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ def build_array(size, validity_buffer, values_buffer)
139139
end
140140
end
141141

142+
class DateType < Type
143+
end
144+
145+
class Date32Type < DateType
146+
class << self
147+
def singleton
148+
@singleton ||= new
149+
end
150+
end
151+
152+
def initialize
153+
super("Date32")
154+
end
155+
156+
def build_array(size, validity_buffer, values_buffer)
157+
Date32Array.new(self, size, validity_buffer, values_buffer)
158+
end
159+
end
160+
142161
class VariableSizeBinaryType < Type
143162
end
144163

ruby/red-arrow-format/test/test-file-reader.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,34 @@ def test_read
9595
end
9696
end
9797

98+
sub_test_case("Float64") do
99+
def build_array
100+
Arrow::DoubleArray.new([-0.5, nil, 0.5])
101+
end
102+
103+
def test_read
104+
assert_equal([{"value" => [-0.5, nil, 0.5]}],
105+
read)
106+
end
107+
end
108+
109+
sub_test_case("Date32") do
110+
def setup(&block)
111+
@date_2017_08_28 = 17406
112+
@date_2025_12_09 = 20431
113+
super(&block)
114+
end
115+
116+
def build_array
117+
Arrow::Date32Array.new([@date_2017_08_28, nil, @date_2025_12_09])
118+
end
119+
120+
def test_read
121+
assert_equal([{"value" => [@date_2017_08_28, nil, @date_2025_12_09]}],
122+
read)
123+
end
124+
end
125+
98126
sub_test_case("Binary") do
99127
def build_array
100128
Arrow::BinaryArray.new(["Hello".b, nil, "World".b])

0 commit comments

Comments
 (0)