Skip to content

Commit 156d0be

Browse files
authored
GH-48330: [Ruby] Add support for reading null array (#48331)
### Rationale for this change It's the simplest array. ### What changes are included in this PR? * Add `ArrowFormat::NullType` * Add `ArrowFormat::NullArray` ### Are these changes tested? Yes. ### Are there any user-facing changes? Yes. * GitHub Issue: #48330 Authored-by: Sutou Kouhei <[email protected]> Signed-off-by: Sutou Kouhei <[email protected]>
1 parent 7efd1d1 commit 156d0be

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ def apply_validity(array)
5454
end
5555
end
5656

57+
class NullArray < Array
58+
def initialize(type, size)
59+
super(type, size, nil)
60+
end
61+
62+
def to_a
63+
[nil] * @size
64+
end
65+
end
66+
5767
class IntArray < Array
5868
def initialize(type, size, validity_buffer, values_buffer)
5969
super(type, size, validity_buffer)

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424

2525
require_relative "org/apache/arrow/flatbuf/footer"
2626
require_relative "org/apache/arrow/flatbuf/message"
27+
require_relative "org/apache/arrow/flatbuf/binary"
28+
require_relative "org/apache/arrow/flatbuf/int"
29+
require_relative "org/apache/arrow/flatbuf/null"
30+
require_relative "org/apache/arrow/flatbuf/utf8"
2731
require_relative "org/apache/arrow/flatbuf/schema"
2832

2933
module ArrowFormat
@@ -128,6 +132,8 @@ def read_schema(fb_schema)
128132
fields = fb_schema.fields.collect do |fb_field|
129133
fb_type = fb_field.type
130134
case fb_type
135+
when Org::Apache::Arrow::Flatbuf::Null
136+
type = NullType.singleton
131137
when Org::Apache::Arrow::Flatbuf::Int
132138
case fb_type.bit_width
133139
when 8
@@ -148,6 +154,8 @@ def read_schema(fb_schema)
148154
end
149155

150156
def read_column(field, n_rows, buffers, body)
157+
return field.type.build_array(n_rows) if field.type.is_a?(NullType)
158+
151159
validity_buffer = buffers.shift
152160
if validity_buffer.length.zero?
153161
validity = nil

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,22 @@ def initialize(name)
2222
end
2323
end
2424

25+
class NullType < Type
26+
class << self
27+
def singleton
28+
@singleton ||= new
29+
end
30+
end
31+
32+
def initialize
33+
super("Null")
34+
end
35+
36+
def build_array(size)
37+
NullArray.new(self, size)
38+
end
39+
end
40+
2541
class IntType < Type
2642
attr_reader :bit_width
2743
attr_reader :signed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,17 @@ def read
4040
end
4141
end
4242

43+
sub_test_case("Null") do
44+
def build_array
45+
Arrow::NullArray.new(3)
46+
end
47+
48+
def test_read
49+
assert_equal([{"value" => [nil, nil, nil]}],
50+
read)
51+
end
52+
end
53+
4354
sub_test_case("Int8") do
4455
def build_array
4556
Arrow::Int8Array.new([-128, nil, 127])

0 commit comments

Comments
 (0)