1717
1818require "bigdecimal"
1919
20+ require_relative "array-builder"
2021require_relative "bitmap"
2122require_relative "bitmap-builder"
2223
@@ -26,6 +27,12 @@ module ArrowFormat
2627 class Array
2728 include Enumerable
2829
30+ class << self
31+ def build ( values )
32+ ArrayBuilder . new ( values ) . build
33+ end
34+ end
35+
2936 attr_reader :type
3037 attr_reader :size
3138 alias_method :length , :size
@@ -271,9 +278,9 @@ def build_data(data, type)
271278 if value . nil?
272279 validity_buffer_builder ||= SparseBitmapBuilder . new
273280 validity_buffer_builder . unset ( i )
274- buffer . append_as_bytes ( pack_value ( nil , pack_template ) )
281+ buffer . append_as_bytes ( pack_value ( nil , pack_template , type ) )
275282 else
276- buffer . append_as_bytes ( pack_value ( value , pack_template ) )
283+ buffer . append_as_bytes ( pack_value ( value , pack_template , type ) )
277284 end
278285 n += 1
279286 end
@@ -283,7 +290,7 @@ def build_data(data, type)
283290 return n , validity_buffer , IO ::Buffer . for ( buffer )
284291 end
285292
286- def pack_value ( value , template )
293+ def pack_value ( value , template , type )
287294 value = 0 if value . nil?
288295 [ value ] . pack ( template )
289296 end
@@ -455,6 +462,17 @@ def type
455462 Date32Type . singleton
456463 end
457464 end
465+
466+ private
467+ def pack_value ( value , template , type )
468+ if value . nil?
469+ [ 0 ] . pack ( template )
470+ elsif value . is_a? ( Date )
471+ [ value . day ] . pack ( template )
472+ else
473+ [ value ] . pack ( template )
474+ end
475+ end
458476 end
459477
460478 class Date64Array < DateArray
@@ -490,6 +508,27 @@ def type_class
490508 TimestampType
491509 end
492510 end
511+
512+ private
513+ def pack_value ( value , template , type )
514+ if value . nil?
515+ [ 0 , 0 ] . pack ( template )
516+ elsif value . is_a? ( Time )
517+ case type . unit
518+ when :second
519+ value = value . to_i
520+ when :millisecond
521+ value = ( value . to_i * 1_000 ) + ( value . nsec / 1_000_000 )
522+ when :microsecond
523+ value = ( value . to_i * 1_000_000 ) + ( value . nsec / 1_000 )
524+ when :nanosecond
525+ value = ( value . to_i * 1_000_000_000 ) + value . nsec
526+ end
527+ [ value ] . pack ( template )
528+ else
529+ value . pack ( template )
530+ end
531+ end
493532 end
494533
495534 class IntervalArray < TemporalArray
@@ -552,7 +591,7 @@ def element_size
552591 super * 2
553592 end
554593
555- def pack_value ( value , template )
594+ def pack_value ( value , template , type )
556595 if value . nil?
557596 [ 0 , 0 ] . pack ( template )
558597 elsif value . is_a? ( Hash )
@@ -613,7 +652,7 @@ def element_size
613652 IO ::Buffer . size_of ( @type . buffer_types )
614653 end
615654
616- def pack_value ( value , template )
655+ def pack_value ( value , template , type )
617656 if value . nil?
618657 [ 0 , 0 , 0 ] . pack ( template )
619658 elsif value . is_a? ( Hash )
0 commit comments