Skip to content

Commit 323c251

Browse files
authored
GH-48535: [Ruby] Add support for reading time64 array (#48536)
### Rationale for this change It's a 64 bits variant of time array. ### What changes are included in this PR? * Add `ArrowFormat::Time64Type` * Add `ArrowFormat::Time64Array` ### Are these changes tested? Yes. ### Are there any user-facing changes? Yes. * GitHub Issue: #48535 Authored-by: Sutou Kouhei <[email protected]> Signed-off-by: Sutou Kouhei <[email protected]>
1 parent 4fc9f9e commit 323c251

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ def to_a
177177
end
178178
end
179179

180+
class Time64Array < TimeArray
181+
def to_a
182+
apply_validity(@values_buffer.values(:s64, 0, @size))
183+
end
184+
end
185+
180186
class VariableSizeBinaryLayoutArray < Array
181187
def initialize(type, size, validity_buffer, offsets_buffer, values_buffer)
182188
super(type, size, validity_buffer)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,13 @@ def read_field(fb_field)
200200
when Org::Apache::Arrow::Flatbuf::TimeUnit::MILLISECOND
201201
type = Time32Type.new(:millisecond)
202202
end
203+
when 64
204+
case fb_type.unit
205+
when Org::Apache::Arrow::Flatbuf::TimeUnit::MICROSECOND
206+
type = Time64Type.new(:microsecond)
207+
when Org::Apache::Arrow::Flatbuf::TimeUnit::NANOSECOND
208+
type = Time64Type.new(:nanosecond)
209+
end
203210
end
204211
when Org::Apache::Arrow::Flatbuf::List
205212
type = ListType.new(read_field(fb_field.children[0]))

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,17 @@ def build_array(size, validity_buffer, values_buffer)
287287
end
288288
end
289289

290+
class Time64Type < TimeType
291+
def initialize(unit)
292+
super("Time64")
293+
@unit = unit
294+
end
295+
296+
def build_array(size, validity_buffer, values_buffer)
297+
Time64Array.new(self, size, validity_buffer, values_buffer)
298+
end
299+
end
300+
290301
class VariableSizeBinaryType < Type
291302
end
292303

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,66 @@ def test_read
265265
end
266266
end
267267

268+
sub_test_case("Time64(:microsecond)") do
269+
def setup(&block)
270+
@time_00_00_10_000_000 = 10 * 1_000_000
271+
@time_00_01_10_000_000 = (60 + 10) * 1_000_000
272+
super(&block)
273+
end
274+
275+
def build_array
276+
Arrow::Time64Array.new(:micro,
277+
[
278+
@time_00_00_10_000_000,
279+
nil,
280+
@time_00_01_10_000_000,
281+
])
282+
end
283+
284+
def test_read
285+
assert_equal([
286+
{
287+
"value" => [
288+
@time_00_00_10_000_000,
289+
nil,
290+
@time_00_01_10_000_000,
291+
],
292+
},
293+
],
294+
read)
295+
end
296+
end
297+
298+
sub_test_case("Time64(:nanosecond)") do
299+
def setup(&block)
300+
@time_00_00_10_000_000_000 = 10 * 1_000_000_000
301+
@time_00_01_10_000_000_000 = (60 + 10) * 1_000_000_000
302+
super(&block)
303+
end
304+
305+
def build_array
306+
Arrow::Time64Array.new(:nano,
307+
[
308+
@time_00_00_10_000_000_000,
309+
nil,
310+
@time_00_01_10_000_000_000,
311+
])
312+
end
313+
314+
def test_read
315+
assert_equal([
316+
{
317+
"value" => [
318+
@time_00_00_10_000_000_000,
319+
nil,
320+
@time_00_01_10_000_000_000,
321+
],
322+
},
323+
],
324+
read)
325+
end
326+
end
327+
268328
sub_test_case("Binary") do
269329
def build_array
270330
Arrow::BinaryArray.new(["Hello".b, nil, "World".b])

0 commit comments

Comments
 (0)