red-arrow 6.0.0 → 8.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -0
- data/ext/arrow/arrow.cpp +12 -0
- data/ext/arrow/converters.hpp +46 -10
- data/ext/arrow/extconf.rb +1 -1
- data/ext/arrow/raw-records.cpp +3 -2
- data/ext/arrow/red-arrow.hpp +7 -0
- data/ext/arrow/values.cpp +3 -2
- data/lib/arrow/datum.rb +2 -0
- data/lib/arrow/day-time-interval-array-builder.rb +29 -0
- data/lib/arrow/function.rb +52 -0
- data/lib/arrow/loader.rb +16 -0
- data/lib/arrow/month-day-nano-interval-array-builder.rb +29 -0
- data/lib/arrow/s3-global-options.rb +38 -0
- data/lib/arrow/sort-key.rb +61 -55
- data/lib/arrow/sort-options.rb +8 -8
- data/lib/arrow/table-loader.rb +99 -62
- data/lib/arrow/table-saver.rb +7 -2
- data/lib/arrow/table.rb +78 -0
- data/lib/arrow/version.rb +1 -1
- data/red-arrow.gemspec +1 -10
- data/test/helper.rb +2 -0
- data/test/raw-records/test-basic-arrays.rb +30 -0
- data/test/raw-records/test-dense-union-array.rb +27 -0
- data/test/raw-records/test-list-array.rb +39 -0
- data/test/raw-records/test-map-array.rb +37 -0
- data/test/raw-records/test-sparse-union-array.rb +27 -0
- data/test/raw-records/test-struct-array.rb +30 -0
- data/test/test-function.rb +48 -14
- data/test/test-table.rb +204 -6
- data/test/values/test-basic-arrays.rb +30 -0
- data/test/values/test-dense-union-array.rb +27 -0
- data/test/values/test-dictionary-array.rb +295 -0
- data/test/values/test-list-array.rb +39 -0
- data/test/values/test-map-array.rb +33 -0
- data/test/values/test-sparse-union-array.rb +27 -0
- data/test/values/test-struct-array.rb +30 -0
- metadata +88 -194
data/lib/arrow/table-loader.rb
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# specific language governing permissions and limitations
|
16
16
|
# under the License.
|
17
17
|
|
18
|
-
require "uri"
|
18
|
+
require "open-uri"
|
19
19
|
|
20
20
|
module Arrow
|
21
21
|
class TableLoader
|
@@ -34,30 +34,47 @@ module Arrow
|
|
34
34
|
|
35
35
|
def load
|
36
36
|
if @input.is_a?(URI)
|
37
|
-
|
37
|
+
custom_load_method_candidates = []
|
38
|
+
if @input.scheme
|
39
|
+
custom_load_method_candidates << "load_from_uri_#{@input.scheme}"
|
40
|
+
end
|
41
|
+
custom_load_method_candidates << "load_from_uri"
|
38
42
|
elsif @input.is_a?(String) and ::File.directory?(@input)
|
39
|
-
|
43
|
+
custom_load_method_candidates = ["load_from_directory"]
|
40
44
|
else
|
41
|
-
|
45
|
+
custom_load_method_candidates = ["load_from_file"]
|
42
46
|
end
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
custom_load_method_candidates.each do |custom_load_method|
|
48
|
+
next unless respond_to?(custom_load_method, true)
|
49
|
+
return __send__(custom_load_method)
|
50
|
+
end
|
51
|
+
available_schemes = []
|
52
|
+
(methods(true) | private_methods(true)).each do |name|
|
53
|
+
match_data = /\Aload_from_/.match(name.to_s)
|
54
|
+
if match_data
|
55
|
+
available_schemes << match_data.post_match
|
50
56
|
end
|
51
|
-
message = "Arrow::Table load source must be one of ["
|
52
|
-
message << available_schemes.join(", ")
|
53
|
-
message << "]: #{@input.inspect}"
|
54
|
-
raise ArgumentError, message
|
55
57
|
end
|
56
|
-
|
58
|
+
message = "Arrow::Table load source must be one of ["
|
59
|
+
message << available_schemes.join(", ")
|
60
|
+
message << "]: #{@input.inspect}"
|
61
|
+
raise ArgumentError, message
|
57
62
|
end
|
58
63
|
|
59
64
|
private
|
65
|
+
def load_from_uri_http
|
66
|
+
load_by_reader
|
67
|
+
end
|
68
|
+
|
69
|
+
def load_from_uri_https
|
70
|
+
load_by_reader
|
71
|
+
end
|
72
|
+
|
60
73
|
def load_from_file
|
74
|
+
load_by_reader
|
75
|
+
end
|
76
|
+
|
77
|
+
def load_by_reader
|
61
78
|
format = @options[:format]
|
62
79
|
custom_load_method = "load_as_#{format}"
|
63
80
|
unless respond_to?(custom_load_method, true)
|
@@ -111,10 +128,29 @@ module Arrow
|
|
111
128
|
end
|
112
129
|
|
113
130
|
def open_input_stream
|
114
|
-
|
115
|
-
|
131
|
+
case @input
|
132
|
+
when Buffer
|
133
|
+
yield(BufferInputStream.new(@input))
|
134
|
+
when URI
|
135
|
+
@input.open do |ruby_input|
|
136
|
+
case @options[:format]
|
137
|
+
when :stream, :arrow_streaming
|
138
|
+
Gio::RubyInputStream.open(ruby_input) do |gio_input|
|
139
|
+
GIOInputStream.open(gio_input) do |input|
|
140
|
+
yield(input)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
else
|
144
|
+
# TODO: We need to consider Ruby's GVL carefully to use
|
145
|
+
# Ruby object directly for input with other formats. We
|
146
|
+
# read data and use it as Buffer for now.
|
147
|
+
data = GLib::Bytes.new(ruby_input.read.freeze)
|
148
|
+
buffer = Buffer.new(data)
|
149
|
+
yield(BufferInputStream.new(buffer))
|
150
|
+
end
|
151
|
+
end
|
116
152
|
else
|
117
|
-
MemoryMappedInputStream.new(@input)
|
153
|
+
yield(MemoryMappedInputStream.new(@input))
|
118
154
|
end
|
119
155
|
end
|
120
156
|
|
@@ -130,32 +166,19 @@ module Arrow
|
|
130
166
|
end
|
131
167
|
|
132
168
|
def load_as_arrow
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
RecordBatchFileReader,
|
138
|
-
RecordBatchStreamReader,
|
139
|
-
]
|
140
|
-
reader_class_candidates.each do |reader_class_candidate|
|
141
|
-
input = open_input_stream
|
142
|
-
begin
|
143
|
-
reader = reader_class_candidate.new(input)
|
144
|
-
rescue Arrow::Error
|
145
|
-
error = $!
|
146
|
-
else
|
147
|
-
break
|
148
|
-
end
|
169
|
+
begin
|
170
|
+
load_as_arrow_file
|
171
|
+
rescue
|
172
|
+
load_as_arrows
|
149
173
|
end
|
150
|
-
raise error if reader.nil?
|
151
|
-
load_raw(input, reader)
|
152
174
|
end
|
153
175
|
|
154
176
|
# @since 1.0.0
|
155
177
|
def load_as_arrow_file
|
156
|
-
|
157
|
-
|
158
|
-
|
178
|
+
open_input_stream do |input|
|
179
|
+
reader = RecordBatchFileReader.new(input)
|
180
|
+
load_raw(input, reader)
|
181
|
+
end
|
159
182
|
end
|
160
183
|
|
161
184
|
# @deprecated Use `format: :arrow_file` instead.
|
@@ -163,34 +186,46 @@ module Arrow
|
|
163
186
|
load_as_arrow_file
|
164
187
|
end
|
165
188
|
|
189
|
+
# @since 7.0.0
|
190
|
+
def load_as_arrows
|
191
|
+
open_input_stream do |input|
|
192
|
+
reader = RecordBatchStreamReader.new(input)
|
193
|
+
load_raw(input, reader)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
166
197
|
# @since 1.0.0
|
167
198
|
def load_as_arrow_streaming
|
168
|
-
|
169
|
-
reader = RecordBatchStreamReader.new(input)
|
170
|
-
load_raw(input, reader)
|
199
|
+
load_as_arrows
|
171
200
|
end
|
172
201
|
|
173
202
|
# @deprecated Use `format: :arrow_streaming` instead.
|
174
203
|
def load_as_stream
|
175
|
-
|
204
|
+
load_as_arrows
|
176
205
|
end
|
177
206
|
|
178
207
|
if Arrow.const_defined?(:ORCFileReader)
|
179
208
|
def load_as_orc
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
209
|
+
open_input_stream do |input|
|
210
|
+
reader = ORCFileReader.new(input)
|
211
|
+
field_indexes = @options[:field_indexes]
|
212
|
+
reader.set_field_indexes(field_indexes) if field_indexes
|
213
|
+
table = reader.read_stripes
|
214
|
+
table.instance_variable_set(:@input, input)
|
215
|
+
table
|
216
|
+
end
|
187
217
|
end
|
188
218
|
end
|
189
219
|
|
190
220
|
def csv_load(options)
|
191
221
|
options.delete(:format)
|
192
|
-
|
222
|
+
case @input
|
223
|
+
when Buffer
|
193
224
|
CSVLoader.load(@input.data.to_s, **options)
|
225
|
+
when URI
|
226
|
+
@input.open do |input|
|
227
|
+
CSVLoader.load(input.read, **options)
|
228
|
+
end
|
194
229
|
else
|
195
230
|
CSVLoader.load(Pathname.new(@input), **options)
|
196
231
|
end
|
@@ -207,19 +242,21 @@ module Arrow
|
|
207
242
|
end
|
208
243
|
|
209
244
|
def load_as_feather
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
245
|
+
open_input_stream do |input|
|
246
|
+
reader = FeatherFileReader.new(input)
|
247
|
+
table = reader.read
|
248
|
+
table.instance_variable_set(:@input, input)
|
249
|
+
table
|
250
|
+
end
|
215
251
|
end
|
216
252
|
|
217
253
|
def load_as_json
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
254
|
+
open_input_stream do |input|
|
255
|
+
reader = JSONReader.new(input)
|
256
|
+
table = reader.read
|
257
|
+
table.instance_variable_set(:@input, input)
|
258
|
+
table
|
259
|
+
end
|
223
260
|
end
|
224
261
|
end
|
225
262
|
end
|
data/lib/arrow/table-saver.rb
CHANGED
@@ -151,14 +151,19 @@ module Arrow
|
|
151
151
|
save_as_arrow_file
|
152
152
|
end
|
153
153
|
|
154
|
+
# @since 7.0.0
|
155
|
+
def save_as_arrows
|
156
|
+
save_raw(RecordBatchStreamWriter)
|
157
|
+
end
|
158
|
+
|
154
159
|
# @since 1.0.0
|
155
160
|
def save_as_arrow_streaming
|
156
|
-
|
161
|
+
save_as_arrows
|
157
162
|
end
|
158
163
|
|
159
164
|
# @deprecated Use `format: :arrow_streaming` instead.
|
160
165
|
def save_as_stream
|
161
|
-
|
166
|
+
save_as_arrows
|
162
167
|
end
|
163
168
|
|
164
169
|
def csv_save(**options)
|
data/lib/arrow/table.rb
CHANGED
@@ -448,6 +448,84 @@ module Arrow
|
|
448
448
|
self.class.new(schema, packed_arrays)
|
449
449
|
end
|
450
450
|
|
451
|
+
# @overload join(right, key, type: :inner, left_outputs: nil, right_outputs: nil)
|
452
|
+
# @!macro join_common_before
|
453
|
+
# @param right [Arrow::Table] The right table.
|
454
|
+
#
|
455
|
+
# Join columns with `right` on join key columns.
|
456
|
+
#
|
457
|
+
# @!macro join_common_after
|
458
|
+
# @param type [Arrow::JoinType] How to join.
|
459
|
+
# @param left_outputs [::Array<String, Symbol>] Output columns in
|
460
|
+
# `self`.
|
461
|
+
#
|
462
|
+
# If both of `left_outputs` and `right_outputs` aren't
|
463
|
+
# specified, all columns in `self` and `right` are
|
464
|
+
# outputted.
|
465
|
+
# @param right_outputs [::Array<String, Symbol>] Output columns in
|
466
|
+
# `right`.
|
467
|
+
#
|
468
|
+
# If both of `left_outputs` and `right_outputs` aren't
|
469
|
+
# specified, all columns in `self` and `right` are
|
470
|
+
# outputted.
|
471
|
+
# @return [Arrow::Table]
|
472
|
+
# The joined `Arrow::Table`.
|
473
|
+
#
|
474
|
+
# @macro join_common_before
|
475
|
+
# @param key [String, Symbol] A join key.
|
476
|
+
# @macro join_common_after
|
477
|
+
#
|
478
|
+
# @overload join(right, keys, type: :inner, left_outputs: nil, right_outputs: nil)
|
479
|
+
#
|
480
|
+
# @macro join_common_before
|
481
|
+
# @param keys [::Array<String, Symbol>] Join keys.
|
482
|
+
# @macro join_common_after
|
483
|
+
#
|
484
|
+
# @overload join(right, keys, type: :inner, left_outputs: nil, right_outputs: nil)
|
485
|
+
#
|
486
|
+
# @macro join_common_before
|
487
|
+
# @param keys [Hash] Specify join keys in `self` and `right` separately.
|
488
|
+
# @option keys [String, Symbol, ::Array<String, Symbol>] :left
|
489
|
+
# Join keys in `self`.
|
490
|
+
# @option keys [String, Symbol, ::Array<String, Symbol>] :right
|
491
|
+
# Join keys in `right`.
|
492
|
+
# @macro join_common_after
|
493
|
+
#
|
494
|
+
# @since 7.0.0
|
495
|
+
def join(right, keys, type: :inner, left_outputs: nil, right_outputs: nil)
|
496
|
+
plan = ExecutePlan.new
|
497
|
+
left_node = plan.build_source_node(self)
|
498
|
+
right_node = plan.build_source_node(right)
|
499
|
+
if keys.is_a?(Hash)
|
500
|
+
left_keys = keys[:left]
|
501
|
+
right_keys = keys[:right]
|
502
|
+
else
|
503
|
+
left_keys = keys
|
504
|
+
right_keys = keys
|
505
|
+
end
|
506
|
+
left_keys = Array(left_keys)
|
507
|
+
right_keys = Array(right_keys)
|
508
|
+
hash_join_node_options = HashJoinNodeOptions.new(type,
|
509
|
+
left_keys,
|
510
|
+
right_keys)
|
511
|
+
unless left_outputs.nil?
|
512
|
+
hash_join_node_options.left_outputs = left_outputs
|
513
|
+
end
|
514
|
+
unless right_outputs.nil?
|
515
|
+
hash_join_node_options.right_outputs = right_outputs
|
516
|
+
end
|
517
|
+
hash_join_node = plan.build_hash_join_node(left_node,
|
518
|
+
right_node,
|
519
|
+
hash_join_node_options)
|
520
|
+
sink_node_options = SinkNodeOptions.new
|
521
|
+
plan.build_sink_node(hash_join_node, sink_node_options)
|
522
|
+
plan.validate
|
523
|
+
plan.start
|
524
|
+
plan.wait
|
525
|
+
reader = sink_node_options.get_reader(hash_join_node.output_schema)
|
526
|
+
reader.read_all
|
527
|
+
end
|
528
|
+
|
451
529
|
alias_method :to_s_raw, :to_s
|
452
530
|
def to_s(options={})
|
453
531
|
format = options[:format]
|
data/lib/arrow/version.rb
CHANGED
data/red-arrow.gemspec
CHANGED
@@ -48,19 +48,10 @@ Gem::Specification.new do |spec|
|
|
48
48
|
|
49
49
|
spec.add_runtime_dependency("bigdecimal", ">= 2.0.3")
|
50
50
|
spec.add_runtime_dependency("extpp", ">= 0.0.7")
|
51
|
-
spec.add_runtime_dependency("gio2", ">= 3.
|
51
|
+
spec.add_runtime_dependency("gio2", ">= 3.5.0")
|
52
52
|
spec.add_runtime_dependency("native-package-installer")
|
53
53
|
spec.add_runtime_dependency("pkg-config")
|
54
54
|
|
55
|
-
spec.add_development_dependency("benchmark-driver")
|
56
|
-
spec.add_development_dependency("bundler")
|
57
|
-
spec.add_development_dependency("faker")
|
58
|
-
spec.add_development_dependency("fiddle", ">= 1.0.9")
|
59
|
-
spec.add_development_dependency("rake")
|
60
|
-
spec.add_development_dependency("redcarpet")
|
61
|
-
spec.add_development_dependency("test-unit")
|
62
|
-
spec.add_development_dependency("yard")
|
63
|
-
|
64
55
|
required_msys2_package_version = version_components[0, 3].join(".")
|
65
56
|
spec.metadata["msys2_mingw_dependencies"] =
|
66
57
|
"arrow>=#{required_msys2_package_version}"
|
data/test/helper.rb
CHANGED
@@ -346,6 +346,36 @@ module RawRecordsBasicArraysTests
|
|
346
346
|
records)
|
347
347
|
assert_equal(records, target.raw_records)
|
348
348
|
end
|
349
|
+
|
350
|
+
def test_month_interval
|
351
|
+
records = [
|
352
|
+
[1],
|
353
|
+
[nil],
|
354
|
+
[12],
|
355
|
+
]
|
356
|
+
target = build({column: :month_interval}, records)
|
357
|
+
assert_equal(records, target.raw_records)
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_day_time_interval
|
361
|
+
records = [
|
362
|
+
[{day: 1, millisecond: 100}],
|
363
|
+
[nil],
|
364
|
+
[{day: 2, millisecond: 300}],
|
365
|
+
]
|
366
|
+
target = build({column: :day_time_interval}, records)
|
367
|
+
assert_equal(records, target.raw_records)
|
368
|
+
end
|
369
|
+
|
370
|
+
def test_month_day_nano_interval
|
371
|
+
records = [
|
372
|
+
[{month: 1, day: 1, nanosecond: 100}],
|
373
|
+
[nil],
|
374
|
+
[{month: 2, day: 3, nanosecond: 400}],
|
375
|
+
]
|
376
|
+
target = build({column: :month_day_nano_interval}, records)
|
377
|
+
assert_equal(records, target.raw_records)
|
378
|
+
end
|
349
379
|
end
|
350
380
|
|
351
381
|
class RawRecordsRecordBatchBasicArraysTest < Test::Unit::TestCase
|
@@ -359,6 +359,33 @@ module RawRecordsDenseUnionArrayTests
|
|
359
359
|
assert_equal(records, target.raw_records)
|
360
360
|
end
|
361
361
|
|
362
|
+
def test_month_interval
|
363
|
+
records = [
|
364
|
+
[{"0" => 1}],
|
365
|
+
[{"1" => nil}],
|
366
|
+
]
|
367
|
+
target = build(:month_interval, records)
|
368
|
+
assert_equal(records, target.raw_records)
|
369
|
+
end
|
370
|
+
|
371
|
+
def test_day_time_interval
|
372
|
+
records = [
|
373
|
+
[{"0" => {day: 1, millisecond: 100}}],
|
374
|
+
[{"1" => nil}],
|
375
|
+
]
|
376
|
+
target = build(:day_time_interval, records)
|
377
|
+
assert_equal(records, target.raw_records)
|
378
|
+
end
|
379
|
+
|
380
|
+
def test_month_day_nano_interval
|
381
|
+
records = [
|
382
|
+
[{"0" => {month: 1, day: 1, nanosecond: 100}}],
|
383
|
+
[{"1" => nil}],
|
384
|
+
]
|
385
|
+
target = build(:month_day_nano_interval, records)
|
386
|
+
assert_equal(records, target.raw_records)
|
387
|
+
end
|
388
|
+
|
362
389
|
def test_list
|
363
390
|
records = [
|
364
391
|
[{"0" => [true, nil, false]}],
|
@@ -399,6 +399,45 @@ module RawRecordsListArrayTests
|
|
399
399
|
assert_equal(records, target.raw_records)
|
400
400
|
end
|
401
401
|
|
402
|
+
def test_month_interval
|
403
|
+
records = [
|
404
|
+
[[1, nil, 12]],
|
405
|
+
[nil],
|
406
|
+
]
|
407
|
+
target = build(:month_interval, records)
|
408
|
+
assert_equal(records, target.raw_records)
|
409
|
+
end
|
410
|
+
|
411
|
+
def test_day_time_interval
|
412
|
+
records = [
|
413
|
+
[
|
414
|
+
[
|
415
|
+
{day: 1, millisecond: 100},
|
416
|
+
nil,
|
417
|
+
{day: 2, millisecond: 300},
|
418
|
+
]
|
419
|
+
],
|
420
|
+
[nil],
|
421
|
+
]
|
422
|
+
target = build(:day_time_interval, records)
|
423
|
+
assert_equal(records, target.raw_records)
|
424
|
+
end
|
425
|
+
|
426
|
+
def test_month_day_nano_interval
|
427
|
+
records = [
|
428
|
+
[
|
429
|
+
[
|
430
|
+
{month: 1, day: 1, nanosecond: 100},
|
431
|
+
nil,
|
432
|
+
{month: 2, day: 3, nanosecond: 400},
|
433
|
+
]
|
434
|
+
],
|
435
|
+
[nil],
|
436
|
+
]
|
437
|
+
target = build(:month_day_nano_interval, records)
|
438
|
+
assert_equal(records, target.raw_records)
|
439
|
+
end
|
440
|
+
|
402
441
|
def test_list
|
403
442
|
records = [
|
404
443
|
[
|
@@ -310,6 +310,43 @@ module RawRecordsMapArrayTests
|
|
310
310
|
assert_equal(records, target.raw_records)
|
311
311
|
end
|
312
312
|
|
313
|
+
def test_month_interval
|
314
|
+
records = [
|
315
|
+
[{"key1" => 1, "key2" => nil}],
|
316
|
+
[nil],
|
317
|
+
]
|
318
|
+
target = build(:month_interval, records)
|
319
|
+
assert_equal(records, target.raw_records)
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_day_time_interval
|
323
|
+
records = [
|
324
|
+
[
|
325
|
+
{
|
326
|
+
"key1" => {day: 1, millisecond: 100},
|
327
|
+
"key2" => nil,
|
328
|
+
},
|
329
|
+
],
|
330
|
+
[nil],
|
331
|
+
]
|
332
|
+
target = build(:day_time_interval, records)
|
333
|
+
assert_equal(records, target.raw_records)
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_month_day_nano_interval
|
337
|
+
records = [
|
338
|
+
[
|
339
|
+
{
|
340
|
+
"key1" => {month: 1, day: 1, nanosecond: 100},
|
341
|
+
"key2" => nil,
|
342
|
+
},
|
343
|
+
],
|
344
|
+
[nil],
|
345
|
+
]
|
346
|
+
target = build(:month_day_nano_interval, records)
|
347
|
+
assert_equal(records, target.raw_records)
|
348
|
+
end
|
349
|
+
|
313
350
|
def test_list
|
314
351
|
records = [
|
315
352
|
[{"key1" => [true, nil, false], "key2" => nil}],
|
@@ -349,6 +349,33 @@ module RawRecordsSparseUnionArrayTests
|
|
349
349
|
assert_equal(records, target.raw_records)
|
350
350
|
end
|
351
351
|
|
352
|
+
def test_month_interval
|
353
|
+
records = [
|
354
|
+
[{"0" => 1}],
|
355
|
+
[{"1" => nil}],
|
356
|
+
]
|
357
|
+
target = build(:month_interval, records)
|
358
|
+
assert_equal(records, target.raw_records)
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_day_time_interval
|
362
|
+
records = [
|
363
|
+
[{"0" => {day: 1, millisecond: 100}}],
|
364
|
+
[{"1" => nil}],
|
365
|
+
]
|
366
|
+
target = build(:day_time_interval, records)
|
367
|
+
assert_equal(records, target.raw_records)
|
368
|
+
end
|
369
|
+
|
370
|
+
def test_month_day_nano_interval
|
371
|
+
records = [
|
372
|
+
[{"0" => {month: 1, day: 1, nanosecond: 100}}],
|
373
|
+
[{"1" => nil}],
|
374
|
+
]
|
375
|
+
target = build(:month_day_nano_interval, records)
|
376
|
+
assert_equal(records, target.raw_records)
|
377
|
+
end
|
378
|
+
|
352
379
|
def test_list
|
353
380
|
records = [
|
354
381
|
[{"0" => [true, nil, false]}],
|
@@ -344,6 +344,36 @@ module RawRecordsStructArrayTests
|
|
344
344
|
assert_equal(records, target.raw_records)
|
345
345
|
end
|
346
346
|
|
347
|
+
def test_month_interval
|
348
|
+
records = [
|
349
|
+
[{"field" => 1}],
|
350
|
+
[nil],
|
351
|
+
[{"field" => nil}],
|
352
|
+
]
|
353
|
+
target = build(:month_interval, records)
|
354
|
+
assert_equal(records, target.raw_records)
|
355
|
+
end
|
356
|
+
|
357
|
+
def test_day_time_interval
|
358
|
+
records = [
|
359
|
+
[{"field" => {day: 1, millisecond: 100}}],
|
360
|
+
[nil],
|
361
|
+
[{"field" => nil}],
|
362
|
+
]
|
363
|
+
target = build(:day_time_interval, records)
|
364
|
+
assert_equal(records, target.raw_records)
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_month_day_nano_interval
|
368
|
+
records = [
|
369
|
+
[{"field" => {month: 1, day: 1, nanosecond: 100}}],
|
370
|
+
[nil],
|
371
|
+
[{"field" => nil}],
|
372
|
+
]
|
373
|
+
target = build(:month_day_nano_interval, records)
|
374
|
+
assert_equal(records, target.raw_records)
|
375
|
+
end
|
376
|
+
|
347
377
|
def test_list
|
348
378
|
records = [
|
349
379
|
[{"field" => [true, nil, false]}],
|