red-arrow 10.0.0 → 16.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/README.md +3 -3
  3. data/ext/arrow/arrow.cpp +31 -0
  4. data/ext/arrow/converters.hpp +45 -41
  5. data/ext/arrow/extconf.rb +16 -4
  6. data/ext/arrow/raw-records.cpp +155 -2
  7. data/ext/arrow/red-arrow.hpp +2 -0
  8. data/ext/arrow/values.cpp +1 -2
  9. data/lib/arrow/array-computable.rb +13 -0
  10. data/lib/arrow/array.rb +6 -1
  11. data/lib/arrow/chunked-array.rb +35 -1
  12. data/lib/arrow/column-containable.rb +9 -0
  13. data/lib/arrow/column.rb +1 -0
  14. data/lib/arrow/data-type.rb +9 -0
  15. data/lib/arrow/dense-union-array-builder.rb +49 -0
  16. data/lib/arrow/dense-union-array.rb +26 -0
  17. data/lib/arrow/expression.rb +6 -2
  18. data/lib/arrow/function.rb +0 -1
  19. data/lib/arrow/half-float-array-builder.rb +32 -0
  20. data/lib/arrow/half-float-array.rb +24 -0
  21. data/lib/arrow/half-float.rb +118 -0
  22. data/lib/arrow/input-referable.rb +29 -0
  23. data/lib/arrow/loader.rb +11 -0
  24. data/lib/arrow/raw-table-converter.rb +7 -5
  25. data/lib/arrow/record-batch-file-reader.rb +2 -0
  26. data/lib/arrow/record-batch-stream-reader.rb +2 -0
  27. data/lib/arrow/record-batch.rb +6 -2
  28. data/lib/arrow/scalar.rb +67 -0
  29. data/lib/arrow/slicer.rb +61 -0
  30. data/lib/arrow/sort-key.rb +3 -3
  31. data/lib/arrow/sparse-union-array-builder.rb +56 -0
  32. data/lib/arrow/sparse-union-array.rb +26 -0
  33. data/lib/arrow/struct-array-builder.rb +0 -5
  34. data/lib/arrow/table-loader.rb +11 -5
  35. data/lib/arrow/table-saver.rb +1 -0
  36. data/lib/arrow/table.rb +180 -33
  37. data/lib/arrow/tensor.rb +4 -0
  38. data/lib/arrow/timestamp-parser.rb +33 -0
  39. data/lib/arrow/union-array-builder.rb +59 -0
  40. data/lib/arrow/version.rb +1 -1
  41. data/red-arrow.gemspec +2 -1
  42. data/test/each-raw-record/test-basic-arrays.rb +411 -0
  43. data/test/each-raw-record/test-dense-union-array.rb +566 -0
  44. data/test/each-raw-record/test-dictionary-array.rb +341 -0
  45. data/test/each-raw-record/test-list-array.rb +628 -0
  46. data/test/each-raw-record/test-map-array.rb +507 -0
  47. data/test/each-raw-record/test-multiple-columns.rb +72 -0
  48. data/test/each-raw-record/test-sparse-union-array.rb +528 -0
  49. data/test/each-raw-record/test-struct-array.rb +529 -0
  50. data/test/each-raw-record/test-table.rb +47 -0
  51. data/test/helper/omittable.rb +13 -0
  52. data/test/helper.rb +1 -0
  53. data/test/raw-records/test-basic-arrays.rb +11 -1
  54. data/test/raw-records/test-dense-union-array.rb +90 -45
  55. data/test/raw-records/test-list-array.rb +28 -10
  56. data/test/raw-records/test-map-array.rb +39 -10
  57. data/test/raw-records/test-sparse-union-array.rb +86 -41
  58. data/test/raw-records/test-struct-array.rb +22 -8
  59. data/test/test-array.rb +7 -0
  60. data/test/test-chunked-array.rb +9 -0
  61. data/test/test-csv-loader.rb +39 -0
  62. data/test/test-data-type.rb +2 -1
  63. data/test/test-dense-union-array.rb +42 -0
  64. data/test/test-dense-union-data-type.rb +1 -1
  65. data/test/test-expression.rb +11 -0
  66. data/test/test-function.rb +7 -7
  67. data/test/test-group.rb +58 -58
  68. data/test/test-half-float-array.rb +43 -0
  69. data/test/test-half-float.rb +130 -0
  70. data/test/test-ractor.rb +34 -0
  71. data/test/test-record-batch-file-reader.rb +21 -0
  72. data/test/test-record-batch-stream-reader.rb +129 -0
  73. data/test/test-scalar.rb +65 -0
  74. data/test/test-slicer.rb +194 -129
  75. data/test/test-sparse-union-array.rb +38 -0
  76. data/test/test-table.rb +356 -40
  77. data/test/values/test-basic-arrays.rb +10 -0
  78. data/test/values/test-dense-union-array.rb +88 -45
  79. data/test/values/test-list-array.rb +26 -10
  80. data/test/values/test-map-array.rb +33 -10
  81. data/test/values/test-sparse-union-array.rb +84 -41
  82. data/test/values/test-struct-array.rb +20 -8
  83. metadata +62 -9
data/test/test-table.rb CHANGED
@@ -41,8 +41,25 @@ class TableTest < Test::Unit::TestCase
41
41
  end
42
42
 
43
43
  sub_test_case(".new") do
44
+ test("{Symbol: Arrow::Array}") do
45
+ schema = Arrow::Schema.new(numbers: :int64)
46
+ assert_equal(Arrow::Table.new(schema,
47
+ [Arrow::Int64Array.new([1, 2, 3])]),
48
+ Arrow::Table.new(numbers: Arrow::Int64Array.new([1, 2, 3])))
49
+ end
50
+
51
+ test("{Symbol: Arrow::ChunkedArray}") do
52
+ chunked_array = Arrow::ChunkedArray.new([Arrow::Int64Array.new([1, 2, 3])])
53
+ schema = Arrow::Schema.new(numbers: :int64)
54
+ assert_equal(Arrow::Table.new(schema,
55
+ [Arrow::Int64Array.new([1, 2, 3])]),
56
+ Arrow::Table.new(numbers: chunked_array))
57
+ end
58
+
44
59
  test("{Symbol: Arrow::Tensor}") do
45
- assert_equal(Arrow::Table.new(numbers: Arrow::UInt8Array.new([1, 2, 3])),
60
+ schema = Arrow::Schema.new(numbers: :uint8)
61
+ assert_equal(Arrow::Table.new(schema,
62
+ [Arrow::UInt8Array.new([1, 2, 3])]),
46
63
  Arrow::Table.new(numbers: Arrow::Tensor.new([1, 2, 3])))
47
64
  end
48
65
 
@@ -51,7 +68,8 @@ class TableTest < Test::Unit::TestCase
51
68
  def array_like.to_ary
52
69
  [1, 2, 3]
53
70
  end
54
- assert_equal(Arrow::Table.new(numbers: Arrow::UInt8Array.new([1, 2, 3])),
71
+ schema = Arrow::Schema.new(numbers: :uint8)
72
+ assert_equal(Arrow::Table.new(schema, [Arrow::UInt8Array.new([1, 2, 3])]),
55
73
  Arrow::Table.new(numbers: array_like))
56
74
  end
57
75
  end
@@ -69,26 +87,24 @@ class TableTest < Test::Unit::TestCase
69
87
  target_rows_raw = [nil, true, true, false, true, false, true, true]
70
88
  target_rows = Arrow::BooleanArray.new(target_rows_raw)
71
89
  assert_equal(<<-TABLE, @table.slice(target_rows).to_s)
72
- count visible
73
- 0 (null) (null)
74
- 1 2 false
75
- 2 4 (null)
76
- 3 16 true
77
- 4 64 (null)
78
- 5 128 (null)
90
+ count visible
91
+ 0 2 false
92
+ 1 4 (null)
93
+ 2 16 true
94
+ 3 64 (null)
95
+ 4 128 (null)
79
96
  TABLE
80
97
  end
81
98
 
82
99
  test("Array: boolean") do
83
100
  target_rows_raw = [nil, true, true, false, true, false, true, true]
84
101
  assert_equal(<<-TABLE, @table.slice(target_rows_raw).to_s)
85
- count visible
86
- 0 (null) (null)
87
- 1 2 false
88
- 2 4 (null)
89
- 3 16 true
90
- 4 64 (null)
91
- 5 128 (null)
102
+ count visible
103
+ 0 2 false
104
+ 1 4 (null)
105
+ 2 16 true
106
+ 3 64 (null)
107
+ 4 128 (null)
92
108
  TABLE
93
109
  end
94
110
 
@@ -180,24 +196,18 @@ class TableTest < Test::Unit::TestCase
180
196
 
181
197
  test("{key: true}") do
182
198
  assert_equal(<<-TABLE, @table.slice(visible: true).to_s)
183
- count visible
184
- 0 1 true
185
- 1 (null) (null)
186
- 2 8 true
187
- 3 16 true
188
- 4 (null) (null)
189
- 5 (null) (null)
199
+ count visible
200
+ 0 1 true
201
+ 1 8 true
202
+ 2 16 true
190
203
  TABLE
191
204
  end
192
205
 
193
206
  test("{key: false}") do
194
207
  assert_equal(<<-TABLE, @table.slice(visible: false).to_s)
195
- count visible
196
- 0 2 false
197
- 1 (null) (null)
198
- 2 32 false
199
- 3 (null) (null)
200
- 4 (null) (null)
208
+ count visible
209
+ 0 2 false
210
+ 1 32 false
201
211
  TABLE
202
212
  end
203
213
 
@@ -268,11 +278,8 @@ class TableTest < Test::Unit::TestCase
268
278
 
269
279
  test("{key1: Range, key2: true}") do
270
280
  assert_equal(<<-TABLE, @table.slice(count: 0..8, visible: false).to_s)
271
- count visible
272
- 0 2 false
273
- 1 (null) (null)
274
- 2 (null) (null)
275
- 3 (null) (null)
281
+ count visible
282
+ 0 2 false
276
283
  TABLE
277
284
  end
278
285
 
@@ -582,6 +589,25 @@ class TableTest < Test::Unit::TestCase
582
589
  0 1
583
590
  TABLE
584
591
  end
592
+
593
+ test("empty result") do
594
+ selected_table = @table.filter([false] * @table.size).select_columns(:a)
595
+ assert_equal(<<-TABLE, selected_table.to_s)
596
+ a
597
+ TABLE
598
+ end
599
+ end
600
+
601
+ sub_test_case("#column_names") do
602
+ test("unique") do
603
+ table = Arrow::Table.new(a: [1], b: [2], c: [3])
604
+ assert_equal(%w[a b c], table.column_names)
605
+ end
606
+
607
+ test("duplicated") do
608
+ table = Arrow::Table.new([["a", [1, 2, 3]], ["a", [4, 5, 6]]])
609
+ assert_equal(%w[a a], table.column_names)
610
+ end
585
611
  end
586
612
 
587
613
  sub_test_case("#save and .load") do
@@ -651,6 +677,31 @@ class TableTest < Test::Unit::TestCase
651
677
  format: :tsv,
652
678
  schema: @table.schema))
653
679
  end
680
+
681
+ def test_json
682
+ output = create_output(".json")
683
+ # TODO: Implement this.
684
+ # @table.save(output, format: :json)
685
+ columns = ""
686
+ @table.each_record.each do |record|
687
+ column = {
688
+ "count" => record.count,
689
+ "visible" => record.visible,
690
+ }
691
+ columns << column.to_json
692
+ columns << "\n"
693
+ end
694
+ if output.is_a?(String)
695
+ File.write(output, columns)
696
+ else
697
+ output.resize(columns.bytesize)
698
+ output.set_data(0, columns)
699
+ end
700
+ assert_equal(@table,
701
+ Arrow::Table.load(output,
702
+ format: :json,
703
+ schema: @table.schema))
704
+ end
654
705
  end
655
706
 
656
707
  sub_test_case("path") do
@@ -690,6 +741,11 @@ class TableTest < Test::Unit::TestCase
690
741
  schema: @table.schema))
691
742
  end
692
743
 
744
+ test("csv, return value") do
745
+ output = create_output(".csv")
746
+ assert_equal(@table, @table.save(output))
747
+ end
748
+
693
749
  test("csv.gz") do
694
750
  output = create_output(".csv.gz")
695
751
  @table.save(output)
@@ -830,6 +886,76 @@ chris\t-1
830
886
  end
831
887
  end
832
888
  end
889
+
890
+ sub_test_case("GC") do
891
+ def setup
892
+ table = Arrow::Table.new(integer: [1, 2, 3],
893
+ string: ["a", "b", "c"])
894
+ @buffer = Arrow::ResizableBuffer.new(1024)
895
+ table.save(@buffer, format: :arrow)
896
+ @loaded_table = Arrow::Table.load(@buffer)
897
+ end
898
+
899
+ def test_chunked_array
900
+ chunked_array = @loaded_table[0].data
901
+ assert_equal(@buffer,
902
+ chunked_array.instance_variable_get(:@input).buffer)
903
+ end
904
+
905
+ def test_array
906
+ array = @loaded_table[0].data.chunks[0]
907
+ assert_equal(@buffer,
908
+ array.instance_variable_get(:@input).buffer)
909
+ end
910
+
911
+ def test_record_batch
912
+ record_batch = @loaded_table.each_record_batch.first
913
+ assert_equal(@buffer,
914
+ record_batch.instance_variable_get(:@input).buffer)
915
+ end
916
+
917
+ def test_record_batch_array
918
+ array = @loaded_table.each_record_batch.first[0].data
919
+ assert_equal(@buffer,
920
+ array.instance_variable_get(:@input).buffer)
921
+ end
922
+
923
+ def test_record_batch_table
924
+ table = @loaded_table.each_record_batch.first.to_table
925
+ assert_equal(@buffer,
926
+ table.instance_variable_get(:@input).buffer)
927
+ end
928
+
929
+ def test_slice
930
+ table = @loaded_table.slice(0..-1)
931
+ assert_equal(@buffer,
932
+ table.instance_variable_get(:@input).buffer)
933
+ end
934
+
935
+ def test_merge
936
+ table = @loaded_table.merge({})
937
+ assert_equal(@buffer,
938
+ table.instance_variable_get(:@input).buffer)
939
+ end
940
+
941
+ def test_remove_column
942
+ table = @loaded_table.remove_column(0)
943
+ assert_equal(@buffer,
944
+ table.instance_variable_get(:@input).buffer)
945
+ end
946
+
947
+ def test_pack
948
+ table = @loaded_table.pack
949
+ assert_equal(@buffer,
950
+ table.instance_variable_get(:@input).buffer)
951
+ end
952
+
953
+ def test_join
954
+ table = @loaded_table.join(@loaded_table, :integer)
955
+ assert_equal(@buffer,
956
+ table.instance_variable_get(:@input).buffer)
957
+ end
958
+ end
833
959
  end
834
960
 
835
961
  test("#pack") do
@@ -1026,7 +1152,7 @@ visible: false
1026
1152
  end
1027
1153
 
1028
1154
  sub_test_case("#join") do
1029
- test("keys: String") do
1155
+ test("keys: nil (natural join)") do
1030
1156
  table1 = Arrow::Table.new(key: [1, 2, 3],
1031
1157
  number: [10, 20, 30])
1032
1158
  table2 = Arrow::Table.new(key: [3, 1],
@@ -1034,7 +1160,19 @@ visible: false
1034
1160
  assert_equal(Arrow::Table.new([
1035
1161
  ["key", [1, 3]],
1036
1162
  ["number", [10, 30]],
1163
+ ["string", ["one", "three"]],
1164
+ ]),
1165
+ table1.join(table2))
1166
+ end
1167
+
1168
+ test("keys: String") do
1169
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1170
+ number: [10, 20, 30])
1171
+ table2 = Arrow::Table.new(key: [3, 1],
1172
+ string: ["three", "one"])
1173
+ assert_equal(Arrow::Table.new([
1037
1174
  ["key", [1, 3]],
1175
+ ["number", [10, 30]],
1038
1176
  ["string", ["one", "three"]],
1039
1177
  ]),
1040
1178
  table1.join(table2, "key"))
@@ -1048,12 +1186,25 @@ visible: false
1048
1186
  assert_equal(Arrow::Table.new([
1049
1187
  ["key", [1, 3]],
1050
1188
  ["number", [10, 30]],
1051
- ["key", [1, 3]],
1052
1189
  ["string", ["one", "three"]],
1053
1190
  ]),
1054
1191
  table1.join(table2, :key))
1055
1192
  end
1056
1193
 
1194
+ test("keys: [String]") do
1195
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1196
+ number: [10, 20, 30])
1197
+ table2 = Arrow::Table.new(key: [3, 1],
1198
+ string: ["three", "one"])
1199
+ assert_equal(Arrow::Table.new([
1200
+ ["key", [1, 3]],
1201
+ ["number", [10, 30]],
1202
+ ["key", [1, 3]],
1203
+ ["string", ["one", "three"]],
1204
+ ]),
1205
+ table1.join(table2, ["key"]))
1206
+ end
1207
+
1057
1208
  test("keys: [String, Symbol]") do
1058
1209
  table1 = Arrow::Table.new(key1: [1, 1, 2, 2],
1059
1210
  key2: [10, 100, 20, 200],
@@ -1083,7 +1234,9 @@ visible: false
1083
1234
  ["right_key", [1, 3]],
1084
1235
  ["string", ["one", "three"]],
1085
1236
  ]),
1086
- table1.join(table2, {left: "left_key", right: :right_key}))
1237
+ table1.join(table2,
1238
+ {left: "left_key", right: :right_key},
1239
+ type: :inner))
1087
1240
  end
1088
1241
 
1089
1242
  test("keys: {left: [String, Symbol], right: [Symbol, String]}") do
@@ -1105,10 +1258,11 @@ visible: false
1105
1258
  {
1106
1259
  left: ["left_key1", :left_key2],
1107
1260
  right: [:right_key1, "right_key2"],
1108
- }))
1261
+ },
1262
+ type: :inner))
1109
1263
  end
1110
1264
 
1111
- test("type:") do
1265
+ test("type: :left_outer") do
1112
1266
  table1 = Arrow::Table.new(key: [1, 2, 3],
1113
1267
  number: [10, 20, 30])
1114
1268
  table2 = Arrow::Table.new(key: [3, 1],
@@ -1116,12 +1270,85 @@ visible: false
1116
1270
  assert_equal(Arrow::Table.new([
1117
1271
  ["key", [1, 3, 2]],
1118
1272
  ["number", [10, 30, 20]],
1119
- ["key", [1, 3, nil]],
1120
1273
  ["string", ["one", "three", nil]],
1121
1274
  ]),
1122
1275
  table1.join(table2, "key", type: :left_outer))
1123
1276
  end
1124
1277
 
1278
+ test("type: :right_outer") do
1279
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1280
+ number: [10, 20, 30])
1281
+ table2 = Arrow::Table.new(key: [3, 1],
1282
+ string: ["three", "one"])
1283
+ assert_equal(Arrow::Table.new([
1284
+ ["key", [1, 3]],
1285
+ ["number", [10, 30]],
1286
+ ["string", ["one", "three"]],
1287
+ ]),
1288
+ table1.join(table2, "key", type: :right_outer))
1289
+ end
1290
+
1291
+ test("type: :full_outer") do
1292
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1293
+ number: [10, 20, 30])
1294
+ table2 = Arrow::Table.new(key: [3, 1],
1295
+ string: ["three", "one"])
1296
+ assert_equal(Arrow::Table.new([
1297
+ ["key", [1, 3, 2]],
1298
+ ["number", [10, 30, 20]],
1299
+ ["string", ["one", "three", nil]],
1300
+ ]),
1301
+ table1.join(table2, "key", type: :full_outer))
1302
+ end
1303
+
1304
+ test("type: :left_semi") do
1305
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1306
+ number: [10, 20, 30])
1307
+ table2 = Arrow::Table.new(key: [3, 1],
1308
+ string: ["three", "one"])
1309
+ assert_equal(Arrow::Table.new([
1310
+ ["key", [1, 3]],
1311
+ ["number", [10, 30]],
1312
+ ]),
1313
+ table1.join(table2, "key", type: :left_semi))
1314
+ end
1315
+
1316
+ test("type: :right_semi") do
1317
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1318
+ number: [10, 20, 30])
1319
+ table2 = Arrow::Table.new(key: [3, 1],
1320
+ string: ["three", "one"])
1321
+ assert_equal(Arrow::Table.new([
1322
+ ["key", [3, 1]],
1323
+ ["string", ["three", "one"]],
1324
+ ]),
1325
+ table1.join(table2, "key", type: :right_semi))
1326
+ end
1327
+
1328
+ test("type: :left_anti") do
1329
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1330
+ number: [10, 20, 30])
1331
+ table2 = Arrow::Table.new(key: [3, 1],
1332
+ string: ["three", "one"])
1333
+ assert_equal(Arrow::Table.new([
1334
+ ["key", [2]],
1335
+ ["number", [20]],
1336
+ ]),
1337
+ table1.join(table2, "key", type: :left_anti))
1338
+ end
1339
+
1340
+ test("type: :right_anti") do
1341
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1342
+ number: [10, 20, 30])
1343
+ table2 = Arrow::Table.new(key: [3, 1],
1344
+ string: ["three", "one"])
1345
+ assert_equal(Arrow::Table.new([
1346
+ ["key", Arrow::ChunkedArray.new(:uint8)],
1347
+ ["string", Arrow::ChunkedArray.new(:string)],
1348
+ ]),
1349
+ table1.join(table2, "key", type: :right_anti))
1350
+ end
1351
+
1125
1352
  test("left_outputs: & right_outputs:") do
1126
1353
  table1 = Arrow::Table.new(key: [1, 2, 3],
1127
1354
  number: [10, 20, 30])
@@ -1135,5 +1362,94 @@ visible: false
1135
1362
  left_outputs: ["key", "number"],
1136
1363
  right_outputs: ["string"]))
1137
1364
  end
1365
+
1366
+ test("left_outputs: & type: :inner") do
1367
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1368
+ number: [10, 20, 30])
1369
+ table2 = Arrow::Table.new(key: [3, 1],
1370
+ string: ["three", "one"])
1371
+ assert_equal(Arrow::Table.new([
1372
+ ["key", [1, 3]],
1373
+ ["number", [10, 30]],
1374
+ ["key", [1, 3]],
1375
+ ["string", ["one", "three"]]
1376
+ ]),
1377
+ table1.join(table2,
1378
+ type: :inner,
1379
+ left_outputs: table1.column_names,
1380
+ right_outputs: table2.column_names))
1381
+ end
1382
+
1383
+ test("left_outputs: & type: :left_outer") do
1384
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1385
+ number: [10, 20, 30])
1386
+ table2 = Arrow::Table.new(key: [3, 1],
1387
+ string: ["three", "one"])
1388
+ assert_equal(Arrow::Table.new([
1389
+ ["key", [1, 3, 2]],
1390
+ ["number", [10, 30, 20]],
1391
+ ["key", [1, 3, nil]],
1392
+ ["string", ["one", "three", nil]],
1393
+ ]),
1394
+ table1.join(table2,
1395
+ type: :left_outer,
1396
+ left_outputs: table1.column_names,
1397
+ right_outputs: table2.column_names))
1398
+ end
1399
+
1400
+ test("left_outputs: & type: :right_outer") do
1401
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1402
+ number: [10, 20, 30])
1403
+ table2 = Arrow::Table.new(key: [3, 1],
1404
+ string: ["three", "one"])
1405
+ assert_equal(Arrow::Table.new([
1406
+ ["key", [1, 3]],
1407
+ ["number", [10, 30]],
1408
+ ["key", [1, 3]],
1409
+ ["string", ["one", "three"]],
1410
+ ]),
1411
+ table1.join(table2,
1412
+ type: :right_outer,
1413
+ left_outputs: table1.column_names,
1414
+ right_outputs: table2.column_names))
1415
+ end
1416
+
1417
+ test("left_outputs: & type: :full_outer") do
1418
+ table1 = Arrow::Table.new(key: [1, 2, 3],
1419
+ number: [10, 20, 30])
1420
+ table2 = Arrow::Table.new(key: [3, 1],
1421
+ string: ["three", "one"])
1422
+ assert_equal(Arrow::Table.new([
1423
+ ["key", [1, 3, 2]],
1424
+ ["number", [10, 30, 20]],
1425
+ ["key", [1, 3, nil]],
1426
+ ["string", ["one", "three", nil]],
1427
+ ]),
1428
+ table1.join(table2,
1429
+ type: :full_outer,
1430
+ left_outputs: table1.column_names,
1431
+ right_outputs: table2.column_names))
1432
+ end
1433
+
1434
+ test("left_suffix: & keys: [String]") do
1435
+ table1 = Arrow::Table.new(key1: [1, 1, 2, 2],
1436
+ key2: [10, 100, 20, 200],
1437
+ number: [1010, 1100, 2020, 2200])
1438
+ table2 = Arrow::Table.new(key1: [1, 2, 2],
1439
+ key2: [100, 20, 50],
1440
+ string: ["1-100", "2-20", "2-50"])
1441
+ assert_equal(Arrow::Table.new([
1442
+ ["key1_left", [1, 2]],
1443
+ ["key2_left", [100, 20]],
1444
+ ["number", [1100, 2020]],
1445
+ ["key1_right", [1, 2]],
1446
+ ["key2_right", [100, 20]],
1447
+ ["string", ["1-100", "2-20"]],
1448
+ ]),
1449
+ table1.join(table2,
1450
+ ["key1", "key2"],
1451
+ left_suffix: "_left",
1452
+ right_suffix: "_right"))
1453
+ end
1138
1454
  end
1139
1455
  end
@@ -107,6 +107,16 @@ module ValuesBasicArraysTests
107
107
  assert_equal(values, target.values)
108
108
  end
109
109
 
110
+ def test_half_float
111
+ values = [
112
+ -1.5,
113
+ nil,
114
+ 1.5,
115
+ ]
116
+ target = build(Arrow::HalfFloatArray.new(values))
117
+ assert_equal(values, target.values)
118
+ end
119
+
110
120
  def test_float
111
121
  values = [
112
122
  -1.0,