Skip to content

Commit 2a4ed78

Browse files
authored
GH-48440: [Ruby] Add support for reading time32 array (#48441)
### Rationale for this change It's a 32 bits variant for time array. ### What changes are included in this PR? * Add `ArrowFormat::Time32Type` * Add `ArrowFormat::Time32Array` ### Are these changes tested? Yes. ### Are there any user-facing changes? Yes. * GitHub Issue: #48440 Authored-by: Sutou Kouhei <[email protected]> Signed-off-by: Sutou Kouhei <[email protected]>
1 parent 8f90970 commit 2a4ed78

File tree

4 files changed

+79
-3
lines changed

4 files changed

+79
-3
lines changed

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,16 @@ def to_a
122122
end
123123
end
124124

125-
class DateArray < Array
125+
class TemporalArray < Array
126126
def initialize(type, size, validity_buffer, values_buffer)
127127
super(type, size, validity_buffer)
128128
@values_buffer = values_buffer
129129
end
130130
end
131131

132+
class DateArray < TemporalArray
133+
end
134+
132135
class Date32Array < DateArray
133136
def to_a
134137
apply_validity(@values_buffer.values(:s32, 0, @size))
@@ -141,6 +144,15 @@ def to_a
141144
end
142145
end
143146

147+
class TimeArray < TemporalArray
148+
end
149+
150+
class Time32Array < TimeArray
151+
def to_a
152+
apply_validity(@values_buffer.values(:s32, 0, @size))
153+
end
154+
end
155+
144156
class VariableSizeBinaryLayoutArray < Array
145157
def initialize(type, size, validity_buffer, offsets_buffer, values_buffer)
146158
super(type, size, validity_buffer)

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
require_relative "org/apache/arrow/flatbuf/precision"
3939
require_relative "org/apache/arrow/flatbuf/schema"
4040
require_relative "org/apache/arrow/flatbuf/struct_"
41+
require_relative "org/apache/arrow/flatbuf/time"
42+
require_relative "org/apache/arrow/flatbuf/time_unit"
4143
require_relative "org/apache/arrow/flatbuf/union"
4244
require_relative "org/apache/arrow/flatbuf/union_mode"
4345
require_relative "org/apache/arrow/flatbuf/utf8"
@@ -177,6 +179,16 @@ def read_field(fb_field)
177179
when Org::Apache::Arrow::Flatbuf::DateUnit::MILLISECOND
178180
type = Date64Type.singleton
179181
end
182+
when Org::Apache::Arrow::Flatbuf::Time
183+
case fb_type.bit_width
184+
when 32
185+
case fb_type.unit
186+
when Org::Apache::Arrow::Flatbuf::TimeUnit::SECOND
187+
type = Time32Type.new(:second)
188+
when Org::Apache::Arrow::Flatbuf::TimeUnit::MILLISECOND
189+
type = Time32Type.new(:millisecond)
190+
end
191+
end
180192
when Org::Apache::Arrow::Flatbuf::List
181193
type = ListType.new(read_field(fb_field.children[0]))
182194
when Org::Apache::Arrow::Flatbuf::LargeList
@@ -228,7 +240,7 @@ def read_column(field, nodes, buffers, body)
228240
case field.type
229241
when BooleanType,
230242
NumberType,
231-
DateType
243+
TemporalType
232244
values_buffer = buffers.shift
233245
values = body.slice(values_buffer.offset, values_buffer.length)
234246
field.type.build_array(length, validity, values)

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ def build_array(size, validity_buffer, values_buffer)
171171
end
172172
end
173173

174-
class DateType < Type
174+
class TemporalType < Type
175+
end
176+
177+
class DateType < TemporalType
175178
end
176179

177180
class Date32Type < DateType
@@ -206,6 +209,20 @@ def build_array(size, validity_buffer, values_buffer)
206209
end
207210
end
208211

212+
class TimeType < TemporalType
213+
end
214+
215+
class Time32Type < TimeType
216+
def initialize(unit)
217+
super("Time32")
218+
@unit = unit
219+
end
220+
221+
def build_array(size, validity_buffer, values_buffer)
222+
Time32Array.new(self, size, validity_buffer, values_buffer)
223+
end
224+
end
225+
209226
class VariableSizeBinaryType < Type
210227
end
211228

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,41 @@ def test_read
174174
end
175175
end
176176

177+
sub_test_case("Time32(:second)") do
178+
def setup(&block)
179+
@time_00_00_10 = 10
180+
@time_00_01_10 = 60 + 10
181+
super(&block)
182+
end
183+
184+
def build_array
185+
Arrow::Time32Array.new(:second, [@time_00_00_10, nil, @time_00_01_10])
186+
end
187+
188+
def test_read
189+
assert_equal([{"value" => [@time_00_00_10, nil, @time_00_01_10]}],
190+
read)
191+
end
192+
end
193+
194+
sub_test_case("Time32(:millisecond)") do
195+
def setup(&block)
196+
@time_00_00_10_000 = 10 * 1000
197+
@time_00_01_10_000 = (60 + 10) * 1000
198+
super(&block)
199+
end
200+
201+
def build_array
202+
Arrow::Time32Array.new(:milli,
203+
[@time_00_00_10_000, nil, @time_00_01_10_000])
204+
end
205+
206+
def test_read
207+
assert_equal([{"value" => [@time_00_00_10_000, nil, @time_00_01_10_000]}],
208+
read)
209+
end
210+
end
211+
177212
sub_test_case("Binary") do
178213
def build_array
179214
Arrow::BinaryArray.new(["Hello".b, nil, "World".b])

0 commit comments

Comments
 (0)