red-arrow-format 23.0.0 → 24.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -2
  3. data/NOTICE.txt +1 -1
  4. data/Rakefile +23 -1
  5. data/lib/arrow-format/array.rb +486 -117
  6. data/lib/arrow-format/bitmap.rb +25 -6
  7. data/lib/arrow-format/buffer-alignable.rb +35 -0
  8. data/lib/arrow-format/dictionary.rb +29 -0
  9. data/lib/arrow-format/error.rb +1 -1
  10. data/lib/arrow-format/field.rb +24 -3
  11. data/lib/arrow-format/file-reader.rb +47 -25
  12. data/lib/arrow-format/file-writer.rb +56 -0
  13. data/lib/arrow-format/flatbuffers.rb +67 -0
  14. data/lib/arrow-format/org/apache/arrow/flatbuf/binary.rb +5 -1
  15. data/lib/arrow-format/org/apache/arrow/flatbuf/binary_view.rb +5 -1
  16. data/lib/arrow-format/org/apache/arrow/flatbuf/block.rb +10 -2
  17. data/lib/arrow-format/org/apache/arrow/flatbuf/body_compression.rb +8 -1
  18. data/lib/arrow-format/org/apache/arrow/flatbuf/body_compression_method.rb +3 -1
  19. data/lib/arrow-format/org/apache/arrow/flatbuf/bool.rb +5 -1
  20. data/lib/arrow-format/org/apache/arrow/flatbuf/buffer.rb +8 -1
  21. data/lib/arrow-format/org/apache/arrow/flatbuf/compression_type.rb +1 -1
  22. data/lib/arrow-format/org/apache/arrow/flatbuf/date.rb +7 -1
  23. data/lib/arrow-format/org/apache/arrow/flatbuf/date_unit.rb +1 -1
  24. data/lib/arrow-format/org/apache/arrow/flatbuf/decimal.rb +9 -1
  25. data/lib/arrow-format/org/apache/arrow/flatbuf/dictionary_batch.rb +9 -1
  26. data/lib/arrow-format/org/apache/arrow/flatbuf/dictionary_encoding.rb +11 -2
  27. data/lib/arrow-format/org/apache/arrow/flatbuf/dictionary_kind.rb +1 -1
  28. data/lib/arrow-format/org/apache/arrow/flatbuf/duration.rb +7 -1
  29. data/lib/arrow-format/org/apache/arrow/flatbuf/endianness.rb +1 -1
  30. data/lib/arrow-format/org/apache/arrow/flatbuf/feature.rb +1 -1
  31. data/lib/arrow-format/org/apache/arrow/flatbuf/field.rb +13 -1
  32. data/lib/arrow-format/org/apache/arrow/flatbuf/field_node.rb +8 -1
  33. data/lib/arrow-format/org/apache/arrow/flatbuf/fixed_size_binary.rb +7 -1
  34. data/lib/arrow-format/org/apache/arrow/flatbuf/fixed_size_list.rb +7 -1
  35. data/lib/arrow-format/org/apache/arrow/flatbuf/floating_point.rb +7 -1
  36. data/lib/arrow-format/org/apache/arrow/flatbuf/footer.rb +22 -2
  37. data/lib/arrow-format/org/apache/arrow/flatbuf/int.rb +8 -1
  38. data/lib/arrow-format/org/apache/arrow/flatbuf/interval.rb +7 -1
  39. data/lib/arrow-format/org/apache/arrow/flatbuf/interval_unit.rb +1 -1
  40. data/lib/arrow-format/org/apache/arrow/flatbuf/key_value.rb +8 -1
  41. data/lib/arrow-format/org/apache/arrow/flatbuf/large_binary.rb +5 -1
  42. data/lib/arrow-format/org/apache/arrow/flatbuf/large_list.rb +5 -1
  43. data/lib/arrow-format/org/apache/arrow/flatbuf/large_list_view.rb +5 -1
  44. data/lib/arrow-format/org/apache/arrow/flatbuf/large_utf8.rb +5 -1
  45. data/lib/arrow-format/org/apache/arrow/flatbuf/list.rb +5 -1
  46. data/lib/arrow-format/org/apache/arrow/flatbuf/list_view.rb +5 -1
  47. data/lib/arrow-format/org/apache/arrow/flatbuf/map.rb +8 -2
  48. data/lib/arrow-format/org/apache/arrow/flatbuf/message.rb +22 -2
  49. data/lib/arrow-format/org/apache/arrow/flatbuf/message_header.rb +1 -1
  50. data/lib/arrow-format/org/apache/arrow/flatbuf/metadata_version.rb +1 -1
  51. data/lib/arrow-format/org/apache/arrow/flatbuf/null.rb +5 -1
  52. data/lib/arrow-format/org/apache/arrow/flatbuf/precision.rb +1 -1
  53. data/lib/arrow-format/org/apache/arrow/flatbuf/record_batch.rb +12 -2
  54. data/lib/arrow-format/org/apache/arrow/flatbuf/run_end_encoded.rb +5 -1
  55. data/lib/arrow-format/org/apache/arrow/flatbuf/schema.rb +10 -1
  56. data/lib/arrow-format/org/apache/arrow/flatbuf/sparse_matrix_compressed_axis.rb +1 -1
  57. data/lib/arrow-format/org/apache/arrow/flatbuf/sparse_matrix_index_csx.rb +12 -2
  58. data/lib/arrow-format/org/apache/arrow/flatbuf/sparse_tensor.rb +13 -1
  59. data/lib/arrow-format/org/apache/arrow/flatbuf/sparse_tensor_index.rb +1 -1
  60. data/lib/arrow-format/org/apache/arrow/flatbuf/sparse_tensor_index_coo.rb +13 -4
  61. data/lib/arrow-format/org/apache/arrow/flatbuf/sparse_tensor_index_csf.rb +14 -4
  62. data/lib/arrow-format/org/apache/arrow/flatbuf/struct_.rb +5 -1
  63. data/lib/arrow-format/org/apache/arrow/flatbuf/tensor.rb +11 -1
  64. data/lib/arrow-format/org/apache/arrow/flatbuf/tensor_dim.rb +8 -1
  65. data/lib/arrow-format/org/apache/arrow/flatbuf/time.rb +8 -1
  66. data/lib/arrow-format/org/apache/arrow/flatbuf/time_unit.rb +1 -1
  67. data/lib/arrow-format/org/apache/arrow/flatbuf/timestamp.rb +8 -1
  68. data/lib/arrow-format/org/apache/arrow/flatbuf/type.rb +1 -1
  69. data/lib/arrow-format/org/apache/arrow/flatbuf/union.rb +8 -1
  70. data/lib/arrow-format/org/apache/arrow/flatbuf/union_mode.rb +1 -1
  71. data/lib/arrow-format/org/apache/arrow/flatbuf/utf8.rb +5 -1
  72. data/lib/arrow-format/org/apache/arrow/flatbuf/utf8view.rb +5 -1
  73. data/lib/arrow-format/readable.rb +151 -96
  74. data/lib/arrow-format/record-batch.rb +70 -1
  75. data/lib/arrow-format/schema.rb +14 -1
  76. data/lib/arrow-format/streaming-pull-reader.rb +49 -23
  77. data/lib/arrow-format/streaming-reader.rb +51 -14
  78. data/lib/arrow-format/streaming-writer.rb +156 -0
  79. data/lib/arrow-format/type.rb +397 -34
  80. data/lib/arrow-format/version.rb +1 -1
  81. data/lib/arrow-format.rb +2 -0
  82. data/red-arrow-format.gemspec +2 -1
  83. metadata +9 -4
@@ -16,6 +16,9 @@
16
16
 
17
17
  module ArrowFormat
18
18
  class Type
19
+ def to_s
20
+ name
21
+ end
19
22
  end
20
23
 
21
24
  class NullType < Type
@@ -30,11 +33,18 @@ module ArrowFormat
30
33
  end
31
34
 
32
35
  def build_array(size)
33
- NullArray.new(self, size)
36
+ NullArray.new(size)
37
+ end
38
+
39
+ def to_flatbuffers
40
+ FB::Null::Data.new
34
41
  end
35
42
  end
36
43
 
37
- class BooleanType < Type
44
+ class PrimitiveType < Type
45
+ end
46
+
47
+ class BooleanType < PrimitiveType
38
48
  class << self
39
49
  def singleton
40
50
  @singleton ||= new
@@ -46,21 +56,35 @@ module ArrowFormat
46
56
  end
47
57
 
48
58
  def build_array(size, validity_buffer, values_buffer)
49
- BooleanArray.new(self, size, validity_buffer, values_buffer)
59
+ BooleanArray.new(size, validity_buffer, values_buffer)
60
+ end
61
+
62
+ def to_flatbuffers
63
+ FB::Bool::Data.new
50
64
  end
51
65
  end
52
66
 
53
- class NumberType < Type
67
+ class NumberType < PrimitiveType
54
68
  end
55
69
 
56
70
  class IntType < NumberType
57
71
  attr_reader :bit_width
58
- attr_reader :signed
59
72
  def initialize(bit_width, signed)
60
73
  super()
61
74
  @bit_width = bit_width
62
75
  @signed = signed
63
76
  end
77
+
78
+ def signed?
79
+ @signed
80
+ end
81
+
82
+ def to_flatbuffers
83
+ fb_type = FB::Int::Data.new
84
+ fb_type.bit_width = @bit_width
85
+ fb_type.signed = @signed
86
+ fb_type
87
+ end
64
88
  end
65
89
 
66
90
  class Int8Type < IntType
@@ -83,7 +107,7 @@ module ArrowFormat
83
107
  end
84
108
 
85
109
  def build_array(size, validity_buffer, values_buffer)
86
- Int8Array.new(self, size, validity_buffer, values_buffer)
110
+ Int8Array.new(size, validity_buffer, values_buffer)
87
111
  end
88
112
  end
89
113
 
@@ -107,7 +131,7 @@ module ArrowFormat
107
131
  end
108
132
 
109
133
  def build_array(size, validity_buffer, values_buffer)
110
- UInt8Array.new(self, size, validity_buffer, values_buffer)
134
+ UInt8Array.new(size, validity_buffer, values_buffer)
111
135
  end
112
136
  end
113
137
 
@@ -131,7 +155,7 @@ module ArrowFormat
131
155
  end
132
156
 
133
157
  def build_array(size, validity_buffer, values_buffer)
134
- Int16Array.new(self, size, validity_buffer, values_buffer)
158
+ Int16Array.new(size, validity_buffer, values_buffer)
135
159
  end
136
160
  end
137
161
 
@@ -155,7 +179,7 @@ module ArrowFormat
155
179
  end
156
180
 
157
181
  def build_array(size, validity_buffer, values_buffer)
158
- UInt16Array.new(self, size, validity_buffer, values_buffer)
182
+ UInt16Array.new(size, validity_buffer, values_buffer)
159
183
  end
160
184
  end
161
185
 
@@ -179,7 +203,7 @@ module ArrowFormat
179
203
  end
180
204
 
181
205
  def build_array(size, validity_buffer, values_buffer)
182
- Int32Array.new(self, size, validity_buffer, values_buffer)
206
+ Int32Array.new(size, validity_buffer, values_buffer)
183
207
  end
184
208
  end
185
209
 
@@ -203,7 +227,7 @@ module ArrowFormat
203
227
  end
204
228
 
205
229
  def build_array(size, validity_buffer, values_buffer)
206
- UInt32Array.new(self, size, validity_buffer, values_buffer)
230
+ UInt32Array.new(size, validity_buffer, values_buffer)
207
231
  end
208
232
  end
209
233
 
@@ -227,7 +251,7 @@ module ArrowFormat
227
251
  end
228
252
 
229
253
  def build_array(size, validity_buffer, values_buffer)
230
- Int64Array.new(self, size, validity_buffer, values_buffer)
254
+ Int64Array.new(size, validity_buffer, values_buffer)
231
255
  end
232
256
  end
233
257
 
@@ -251,7 +275,7 @@ module ArrowFormat
251
275
  end
252
276
 
253
277
  def build_array(size, validity_buffer, values_buffer)
254
- UInt64Array.new(self, size, validity_buffer, values_buffer)
278
+ UInt64Array.new(size, validity_buffer, values_buffer)
255
279
  end
256
280
  end
257
281
 
@@ -261,6 +285,12 @@ module ArrowFormat
261
285
  super()
262
286
  @precision = precision
263
287
  end
288
+
289
+ def to_flatbuffers
290
+ fb_type = FB::FloatingPoint::Data.new
291
+ fb_type.precision = FB::Precision.try_convert(@precision.to_s.upcase)
292
+ fb_type
293
+ end
264
294
  end
265
295
 
266
296
  class Float32Type < FloatingPointType
@@ -278,8 +308,12 @@ module ArrowFormat
278
308
  "Float32"
279
309
  end
280
310
 
311
+ def buffer_type
312
+ :f32
313
+ end
314
+
281
315
  def build_array(size, validity_buffer, values_buffer)
282
- Float32Array.new(self, size, validity_buffer, values_buffer)
316
+ Float32Array.new(size, validity_buffer, values_buffer)
283
317
  end
284
318
  end
285
319
 
@@ -298,15 +332,30 @@ module ArrowFormat
298
332
  "Float64"
299
333
  end
300
334
 
335
+ def buffer_type
336
+ :f64
337
+ end
338
+
301
339
  def build_array(size, validity_buffer, values_buffer)
302
- Float64Array.new(self, size, validity_buffer, values_buffer)
340
+ Float64Array.new(size, validity_buffer, values_buffer)
303
341
  end
304
342
  end
305
343
 
306
- class TemporalType < Type
344
+ class TemporalType < PrimitiveType
307
345
  end
308
346
 
309
347
  class DateType < TemporalType
348
+ attr_reader :unit
349
+ def initialize(unit)
350
+ super()
351
+ @unit = unit
352
+ end
353
+
354
+ def to_flatbuffers
355
+ fb_type = FB::Date::Data.new
356
+ fb_type.unit = FB::DateUnit.try_convert(@unit.to_s.upcase)
357
+ fb_type
358
+ end
310
359
  end
311
360
 
312
361
  class Date32Type < DateType
@@ -316,12 +365,20 @@ module ArrowFormat
316
365
  end
317
366
  end
318
367
 
368
+ def initialize
369
+ super(:day)
370
+ end
371
+
319
372
  def name
320
373
  "Date32"
321
374
  end
322
375
 
376
+ def buffer_type
377
+ :s32
378
+ end
379
+
323
380
  def build_array(size, validity_buffer, values_buffer)
324
- Date32Array.new(self, size, validity_buffer, values_buffer)
381
+ Date32Array.new(size, validity_buffer, values_buffer)
325
382
  end
326
383
  end
327
384
 
@@ -332,38 +389,75 @@ module ArrowFormat
332
389
  end
333
390
  end
334
391
 
392
+ def initialize
393
+ super(:millisecond)
394
+ end
395
+
335
396
  def name
336
397
  "Date64"
337
398
  end
338
399
 
400
+ def buffer_type
401
+ :s64
402
+ end
403
+
339
404
  def build_array(size, validity_buffer, values_buffer)
340
- Date64Array.new(self, size, validity_buffer, values_buffer)
405
+ Date64Array.new(size, validity_buffer, values_buffer)
341
406
  end
342
407
  end
343
408
 
344
409
  class TimeType < TemporalType
410
+ attr_reader :bit_width
345
411
  attr_reader :unit
346
- def initialize(unit)
412
+ def initialize(bit_width, unit)
347
413
  super()
414
+ @bit_width = bit_width
348
415
  @unit = unit
349
416
  end
417
+
418
+ def to_s
419
+ "#{super}(#{unit})"
420
+ end
421
+
422
+ def to_flatbuffers
423
+ fb_type = FB::Time::Data.new
424
+ fb_type.bit_width = @bit_width
425
+ fb_type.unit = FB::TimeUnit.try_convert(@unit.to_s.upcase)
426
+ fb_type
427
+ end
350
428
  end
351
429
 
352
430
  class Time32Type < TimeType
431
+ def initialize(unit)
432
+ super(32, unit)
433
+ end
434
+
353
435
  def name
354
436
  "Time32"
355
437
  end
356
438
 
439
+ def buffer_type
440
+ :s32
441
+ end
442
+
357
443
  def build_array(size, validity_buffer, values_buffer)
358
444
  Time32Array.new(self, size, validity_buffer, values_buffer)
359
445
  end
360
446
  end
361
447
 
362
448
  class Time64Type < TimeType
449
+ def initialize(unit)
450
+ super(64, unit)
451
+ end
452
+
363
453
  def name
364
454
  "Time64"
365
455
  end
366
456
 
457
+ def buffer_type
458
+ :s64
459
+ end
460
+
367
461
  def build_array(size, validity_buffer, values_buffer)
368
462
  Time64Array.new(self, size, validity_buffer, values_buffer)
369
463
  end
@@ -371,50 +465,108 @@ module ArrowFormat
371
465
 
372
466
  class TimestampType < TemporalType
373
467
  attr_reader :unit
374
- attr_reader :timezone
375
- def initialize(unit, timezone)
468
+ attr_reader :time_zone
469
+ def initialize(unit, time_zone)
376
470
  super()
377
471
  @unit = unit
378
- @timezone = timezone
472
+ @time_zone = time_zone
379
473
  end
380
474
 
381
475
  def name
382
476
  "Timestamp"
383
477
  end
384
478
 
479
+ def buffer_type
480
+ :s64
481
+ end
482
+
385
483
  def build_array(size, validity_buffer, values_buffer)
386
484
  TimestampArray.new(self, size, validity_buffer, values_buffer)
387
485
  end
486
+
487
+ def to_s
488
+ options = [@unit]
489
+ options << @time_zone if @time_zone
490
+ "#{super}(#{options.join(", ")})"
491
+ end
492
+
493
+ def to_flatbuffers
494
+ fb_type = FB::Timestamp::Data.new
495
+ fb_type.unit = FB::TimeUnit.try_convert(@unit.to_s.upcase)
496
+ fb_type.timezone = @time_zone
497
+ fb_type
498
+ end
388
499
  end
389
500
 
390
501
  class IntervalType < TemporalType
502
+ class << self
503
+ def singleton
504
+ @singleton ||= new
505
+ end
506
+ end
507
+
508
+ attr_reader :unit
509
+ def initialize(unit)
510
+ super()
511
+ @unit = unit
512
+ end
513
+
514
+ def to_flatbuffers
515
+ fb_type = FB::Interval::Data.new
516
+ fb_type.unit = FB::IntervalUnit.try_convert(@unit.to_s.upcase)
517
+ fb_type
518
+ end
391
519
  end
392
520
 
393
521
  class YearMonthIntervalType < IntervalType
522
+ def initialize
523
+ super(:year_month)
524
+ end
525
+
394
526
  def name
395
527
  "YearMonthInterval"
396
528
  end
397
529
 
530
+ def buffer_type
531
+ :s32
532
+ end
533
+
398
534
  def build_array(size, validity_buffer, values_buffer)
399
535
  YearMonthIntervalArray.new(self, size, validity_buffer, values_buffer)
400
536
  end
401
537
  end
402
538
 
403
539
  class DayTimeIntervalType < IntervalType
540
+ def initialize
541
+ super(:day_time)
542
+ end
543
+
404
544
  def name
405
545
  "DayTimeInterval"
406
546
  end
407
547
 
548
+ def buffer_type
549
+ :s32
550
+ end
551
+
408
552
  def build_array(size, validity_buffer, values_buffer)
409
553
  DayTimeIntervalArray.new(self, size, validity_buffer, values_buffer)
410
554
  end
411
555
  end
412
556
 
413
557
  class MonthDayNanoIntervalType < IntervalType
558
+ def initialize
559
+ super(:month_day_nano)
560
+ end
561
+
414
562
  def name
415
563
  "MonthDayNanoInterval"
416
564
  end
417
565
 
566
+ def buffer_types
567
+ @buffer_types ||= [:s32, :s32, :s64]
568
+ end
569
+
418
570
  def build_array(size, validity_buffer, values_buffer)
419
571
  MonthDayNanoIntervalArray.new(self,
420
572
  size,
@@ -434,9 +586,23 @@ module ArrowFormat
434
586
  "Duration"
435
587
  end
436
588
 
589
+ def buffer_type
590
+ :s64
591
+ end
592
+
437
593
  def build_array(size, validity_buffer, values_buffer)
438
594
  DurationArray.new(self, size, validity_buffer, values_buffer)
439
595
  end
596
+
597
+ def to_s
598
+ "#{super}(#{@unit})"
599
+ end
600
+
601
+ def to_flatbuffers
602
+ fb_type = FB::Duration::Data.new
603
+ fb_type.unit = FB::TimeUnit.try_convert(@unit.to_s.upcase)
604
+ fb_type
605
+ end
440
606
  end
441
607
 
442
608
  class VariableSizeBinaryType < Type
@@ -453,8 +619,23 @@ module ArrowFormat
453
619
  "Binary"
454
620
  end
455
621
 
622
+ def offset_buffer_type
623
+ :s32 # TODO: big endian support
624
+ end
625
+
626
+ def encoding
627
+ Encoding::ASCII_8BIT
628
+ end
629
+
456
630
  def build_array(size, validity_buffer, offsets_buffer, values_buffer)
457
- BinaryArray.new(self, size, validity_buffer, offsets_buffer, values_buffer)
631
+ BinaryArray.new(size,
632
+ validity_buffer,
633
+ offsets_buffer,
634
+ values_buffer)
635
+ end
636
+
637
+ def to_flatbuffers
638
+ FB::Binary::Data.new
458
639
  end
459
640
  end
460
641
 
@@ -469,13 +650,24 @@ module ArrowFormat
469
650
  "LargeBinary"
470
651
  end
471
652
 
653
+ def offset_buffer_type
654
+ :s64 # TODO: big endian support
655
+ end
656
+
657
+ def encoding
658
+ Encoding::ASCII_8BIT
659
+ end
660
+
472
661
  def build_array(size, validity_buffer, offsets_buffer, values_buffer)
473
- LargeBinaryArray.new(self,
474
- size,
662
+ LargeBinaryArray.new(size,
475
663
  validity_buffer,
476
664
  offsets_buffer,
477
665
  values_buffer)
478
666
  end
667
+
668
+ def to_flatbuffers
669
+ FB::LargeBinary::Data.new
670
+ end
479
671
  end
480
672
 
481
673
  class UTF8Type < VariableSizeBinaryType
@@ -489,8 +681,20 @@ module ArrowFormat
489
681
  "UTF8"
490
682
  end
491
683
 
684
+ def offset_buffer_type
685
+ :s32 # TODO: big endian support
686
+ end
687
+
688
+ def encoding
689
+ Encoding::UTF_8
690
+ end
691
+
492
692
  def build_array(size, validity_buffer, offsets_buffer, values_buffer)
493
- UTF8Array.new(self, size, validity_buffer, offsets_buffer, values_buffer)
693
+ UTF8Array.new(size, validity_buffer, offsets_buffer, values_buffer)
694
+ end
695
+
696
+ def to_flatbuffers
697
+ FB::Utf8::Data.new
494
698
  end
495
699
  end
496
700
 
@@ -505,13 +709,24 @@ module ArrowFormat
505
709
  "LargeUTF8"
506
710
  end
507
711
 
712
+ def offset_buffer_type
713
+ :s64 # TODO: big endian support
714
+ end
715
+
716
+ def encoding
717
+ Encoding::UTF_8
718
+ end
719
+
508
720
  def build_array(size, validity_buffer, offsets_buffer, values_buffer)
509
- LargeUTF8Array.new(self,
510
- size,
721
+ LargeUTF8Array.new(size,
511
722
  validity_buffer,
512
723
  offsets_buffer,
513
724
  values_buffer)
514
725
  end
726
+
727
+ def to_flatbuffers
728
+ FB::LargeUtf8::Data.new
729
+ end
515
730
  end
516
731
 
517
732
  class FixedSizeBinaryType < Type
@@ -528,6 +743,16 @@ module ArrowFormat
528
743
  def build_array(size, validity_buffer, values_buffer)
529
744
  FixedSizeBinaryArray.new(self, size, validity_buffer, values_buffer)
530
745
  end
746
+
747
+ def to_s
748
+ "#{super}(#{@byte_width})"
749
+ end
750
+
751
+ def to_flatbuffers
752
+ fb_type = FB::FixedSizeBinary::Data.new
753
+ fb_type.byte_width = @byte_width
754
+ fb_type
755
+ end
531
756
  end
532
757
 
533
758
  class DecimalType < FixedSizeBinaryType
@@ -538,6 +763,18 @@ module ArrowFormat
538
763
  @precision = precision
539
764
  @scale = scale
540
765
  end
766
+
767
+ def to_s
768
+ "#{name}(#{@precision}, #{@scale})"
769
+ end
770
+
771
+ def to_flatbuffers
772
+ fb_type = FB::Decimal::Data.new
773
+ fb_type.bit_width = @byte_width * 8
774
+ fb_type.precision = @precision
775
+ fb_type.scale = @scale
776
+ fb_type
777
+ end
541
778
  end
542
779
 
543
780
  class Decimal128Type < DecimalType
@@ -575,6 +812,9 @@ module ArrowFormat
575
812
  @child = child
576
813
  end
577
814
 
815
+ def to_s
816
+ "#{super}<#{child.name}: #{child.type}>"
817
+ end
578
818
  end
579
819
 
580
820
  class ListType < VariableSizeListType
@@ -582,9 +822,17 @@ module ArrowFormat
582
822
  "List"
583
823
  end
584
824
 
825
+ def offset_buffer_type
826
+ :s32 # TODO: big endian support
827
+ end
828
+
585
829
  def build_array(size, validity_buffer, offsets_buffer, child)
586
830
  ListArray.new(self, size, validity_buffer, offsets_buffer, child)
587
831
  end
832
+
833
+ def to_flatbuffers
834
+ FB::List::Data.new
835
+ end
588
836
  end
589
837
 
590
838
  class LargeListType < VariableSizeListType
@@ -592,9 +840,45 @@ module ArrowFormat
592
840
  "LargeList"
593
841
  end
594
842
 
843
+ def offset_buffer_type
844
+ :s64 # TODO: big endian support
845
+ end
846
+
595
847
  def build_array(size, validity_buffer, offsets_buffer, child)
596
848
  LargeListArray.new(self, size, validity_buffer, offsets_buffer, child)
597
849
  end
850
+
851
+ def to_flatbuffers
852
+ FB::LargeList::Data.new
853
+ end
854
+ end
855
+
856
+ class FixedSizeListType < Type
857
+ attr_reader :child
858
+ attr_reader :size
859
+ def initialize(child, size)
860
+ super()
861
+ @child = child
862
+ @size = size
863
+ end
864
+
865
+ def name
866
+ "FixedSizeList"
867
+ end
868
+
869
+ def to_s
870
+ "#{super}<#{child.name}: #{child.type}>(#{@size})"
871
+ end
872
+
873
+ def build_array(size, validity_buffer, child)
874
+ FixedSizeListArray.new(self, size, validity_buffer, child)
875
+ end
876
+
877
+ def to_flatbuffers
878
+ fb_type = FB::FixedSizeList::Data.new
879
+ fb_type.list_size = @size
880
+ fb_type
881
+ end
598
882
  end
599
883
 
600
884
  class StructType < Type
@@ -611,10 +895,21 @@ module ArrowFormat
611
895
  def build_array(size, validity_buffer, children)
612
896
  StructArray.new(self, size, validity_buffer, children)
613
897
  end
898
+
899
+ def to_s
900
+ fields = children.collect do |child|
901
+ "#{child.name}: #{child.type}"
902
+ end
903
+ "#{super}<#{fields.join(", ")}>"
904
+ end
905
+
906
+ def to_flatbuffers
907
+ FB::Struct::Data.new
908
+ end
614
909
  end
615
910
 
616
911
  class MapType < VariableSizeListType
617
- def initialize(child)
912
+ def initialize(child, keys_sorted)
618
913
  if child.nullable?
619
914
  raise TypeError.new("Map entry field must not be nullable: " +
620
915
  child.inspect)
@@ -632,22 +927,41 @@ module ArrowFormat
632
927
  type.children[0].inspect)
633
928
  end
634
929
  super(child)
930
+ @keys_sorted = keys_sorted
635
931
  end
636
932
 
637
933
  def name
638
934
  "Map"
639
935
  end
640
936
 
937
+ def keys_sorted?
938
+ @keys_sorted
939
+ end
940
+
941
+ def offset_buffer_type
942
+ :s32 # TODO: big endian support
943
+ end
944
+
641
945
  def build_array(size, validity_buffer, offsets_buffer, child)
642
946
  MapArray.new(self, size, validity_buffer, offsets_buffer, child)
643
947
  end
948
+
949
+ def to_s
950
+ key, value, = child.type.children
951
+ "#{name}<#{key.type}, #{value.type}>"
952
+ end
953
+
954
+ def to_flatbuffers
955
+ FB::Map::Data.new
956
+ end
644
957
  end
645
958
 
646
959
  class UnionType < Type
647
960
  attr_reader :children
648
961
  attr_reader :type_ids
649
- def initialize(children, type_ids)
962
+ def initialize(mode, children, type_ids)
650
963
  super()
964
+ @mode = mode
651
965
  @children = children
652
966
  @type_ids = type_ids
653
967
  @type_indexes = {}
@@ -656,19 +970,45 @@ module ArrowFormat
656
970
  def resolve_type_index(type)
657
971
  @type_indexes[type] ||= @type_ids.index(type)
658
972
  end
973
+
974
+ def to_s
975
+ children = @children.collect.with_index do |child, i|
976
+ "#{child.name}: #{child.type}=#{@type_ids[i]}"
977
+ end
978
+ "#{super}<#{children.join(", ")}>"
979
+ end
980
+
981
+ def to_flatbuffers
982
+ fb_type = FB::Union::Data.new
983
+ fb_type.mode = FB::UnionMode.try_convert(@mode.to_s.capitalize)
984
+ fb_type.type_ids = @type_ids
985
+ fb_type
986
+ end
659
987
  end
660
988
 
661
989
  class DenseUnionType < UnionType
990
+ def initialize(children, type_ids)
991
+ super(:dense, children, type_ids)
992
+ end
993
+
662
994
  def name
663
995
  "DenseUnion"
664
996
  end
665
997
 
998
+ def offset_buffer_type
999
+ :s32
1000
+ end
1001
+
666
1002
  def build_array(size, types_buffer, offsets_buffer, children)
667
1003
  DenseUnionArray.new(self, size, types_buffer, offsets_buffer, children)
668
1004
  end
669
1005
  end
670
1006
 
671
1007
  class SparseUnionType < UnionType
1008
+ def initialize(children, type_ids)
1009
+ super(:sparse, children, type_ids)
1010
+ end
1011
+
672
1012
  def name
673
1013
  "SparseUnion"
674
1014
  end
@@ -679,26 +1019,49 @@ module ArrowFormat
679
1019
  end
680
1020
 
681
1021
  class DictionaryType < Type
1022
+ attr_reader :id
682
1023
  attr_reader :index_type
683
1024
  attr_reader :value_type
684
- attr_reader :ordered
685
- def initialize(index_type, value_type, ordered)
1025
+ def initialize(id, index_type, value_type, ordered)
686
1026
  super()
1027
+ @id = id
687
1028
  @index_type = index_type
688
1029
  @value_type = value_type
689
1030
  @ordered = ordered
690
1031
  end
691
1032
 
1033
+ def ordered?
1034
+ @ordered
1035
+ end
1036
+
692
1037
  def name
693
1038
  "Dictionary"
694
1039
  end
695
1040
 
696
- def build_array(size, validity_buffer, indices_buffer, dictionary)
1041
+ def build_array(size, validity_buffer, indices_buffer, dictionaries)
697
1042
  DictionaryArray.new(self,
698
1043
  size,
699
1044
  validity_buffer,
700
1045
  indices_buffer,
701
- dictionary)
1046
+ dictionaries)
1047
+ end
1048
+
1049
+ def build_fb_field(fb_field)
1050
+ fb_dictionary_encoding = FB::DictionaryEncoding::Data.new
1051
+ fb_dictionary_encoding.id = @id
1052
+ fb_int = FB::Int::Data.new
1053
+ fb_int.bit_width = @index_type.bit_width
1054
+ fb_int.signed = @index_type.signed?
1055
+ fb_dictionary_encoding.index_type = fb_int
1056
+ fb_dictionary_encoding.ordered = @ordered
1057
+ fb_dictionary_encoding.dictionary_kind = FB::DictionaryKind::DENSE_ARRAY
1058
+ fb_field.type = @value_type.to_flatbuffers
1059
+ fb_field.dictionary = fb_dictionary_encoding
1060
+ end
1061
+
1062
+ def to_s
1063
+ "#{super}<id=#{@id}, index=#{@index_type}, value=#{@value_type}, " +
1064
+ "ordered=#{@ordered}>"
702
1065
  end
703
1066
  end
704
1067
  end