@@ -24,6 +24,8 @@ module ArrowFormat
2424 using FlatBuffers ::AppendAsBytes if FlatBuffers . const_defined? ( :AppendAsBytes )
2525
2626 class Array
27+ include Enumerable
28+
2729 attr_reader :type
2830 attr_reader :size
2931 alias_method :length , :size
@@ -64,18 +66,28 @@ def empty?
6466 @size . zero?
6567 end
6668
69+ def ==( other )
70+ return false unless other . is_a? ( self . class )
71+ return false unless @size == other . size
72+ return true if @validity_buffer . nil? and other . validity_buffer . nil?
73+ if @offset == other . offset and @validity_buffer == other . validity_buffer
74+ return true
75+ end
76+ validity_bitmap == other . validity_bitmap
77+ end
78+
6779 protected
6880 def slice! ( offset , size )
6981 @offset = offset
7082 @size = size
7183 clear_cache
7284 end
7385
74- private
7586 def validity_bitmap
7687 @validity_bitmap ||= Bitmap . new ( @validity_buffer , @offset , @size )
7788 end
7889
90+ private
7991 def apply_validity ( array )
8092 return array if @validity_buffer . nil?
8193 validity_bitmap . each_with_index do |is_valid , i |
@@ -159,11 +171,20 @@ def n_nulls
159171 def to_a
160172 [ nil ] * @size
161173 end
174+
175+ def each
176+ return to_enum ( __method__ ) unless block_given?
177+
178+ @size . times do
179+ yield ( nil )
180+ end
181+ end
162182 end
163183
164184 class PrimitiveArray < Array
165185 include BufferAlignable
166186
187+ attr_reader :values_buffer
167188 def initialize ( *args )
168189 n_args = args . size
169190 if self . class . respond_to? ( :type )
@@ -192,15 +213,47 @@ def to_a
192213 apply_validity ( @values_buffer . values ( @type . buffer_type , offset , @size ) )
193214 end
194215
216+ def each ( &block )
217+ return to_enum ( __method__ ) { @size } unless block_given?
218+
219+ each_value = Enumerator . new ( @size ) do |yielder |
220+ offset = element_size * @offset
221+ @values_buffer . each ( @type . buffer_type , offset , @size ) do |_ , value |
222+ yielder << value
223+ end
224+ end
225+ if @validity_buffer . nil?
226+ each_value . each ( &block )
227+ else
228+ validity_bitmap . zip ( each_value ) do |is_valid , value |
229+ if is_valid
230+ yield ( value )
231+ else
232+ yield ( nil )
233+ end
234+ end
235+ end
236+ end
237+
195238 def each_buffer
196- return to_enum ( __method__ ) unless block_given?
239+ return to_enum ( __method__ ) { 2 } unless block_given?
197240
198241 yield ( slice_bitmap_buffer ( :validity , @validity_buffer ) )
199242 yield ( slice_fixed_element_size_buffer ( :values ,
200243 @values_buffer ,
201244 element_size ) )
202245 end
203246
247+ def ==( other )
248+ return false unless super ( other )
249+ if @offset == other . offset and @values_buffer == other . values_buffer
250+ return true
251+ end
252+ lazy . zip ( other ) . all? do |value , other_value |
253+ value == other_value
254+ end
255+ end
256+
204257 private
205258 def element_size
206259 IO ::Buffer . size_of ( @type . buffer_type )
@@ -238,19 +291,38 @@ def type
238291 def to_a
239292 return [ ] if empty?
240293
241- @values_bitmap ||= Bitmap . new ( @values_buffer , @offset , @size )
242- values = @values_bitmap . to_a
294+ values = values_bitmap . to_a
243295 apply_validity ( values )
244296 end
245297
298+ def each ( &block )
299+ return to_enum ( __method__ ) { @size } unless block_given?
300+
301+ if @validity_buffer . nil?
302+ values_bitmap . each ( &block )
303+ else
304+ validity_bitmap . zip ( values_bitmap ) do |is_valid , value |
305+ if is_valid
306+ yield ( value )
307+ else
308+ yield ( nil )
309+ end
310+ end
311+ end
312+ end
313+
246314 def each_buffer
247- return to_enum ( __method__ ) unless block_given?
315+ return to_enum ( __method__ ) { 2 } unless block_given?
248316
249317 yield ( slice_bitmap_buffer ( :validity , @validity_buffer ) )
250318 yield ( slice_bitmap_buffer ( :values , @values_buffer ) )
251319 end
252320
253321 private
322+ def values_bitmap
323+ @values_bitmap ||= Bitmap . new ( @values_buffer , @offset , @size )
324+ end
325+
254326 def clear_cache
255327 super
256328 @values_bitmap = nil
0 commit comments