red-arrow 8.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.
- checksums.yaml +4 -4
- data/README.md +15 -7
- data/ext/arrow/arrow.cpp +67 -0
- data/ext/arrow/converters.cpp +10 -0
- data/ext/arrow/converters.hpp +310 -46
- data/ext/arrow/extconf.rb +41 -22
- data/ext/arrow/raw-records.cpp +165 -2
- data/ext/arrow/red-arrow.hpp +2 -0
- data/ext/arrow/values.cpp +6 -2
- data/lib/arrow/array-builder.rb +89 -14
- data/{test/test-time32-data-type.rb → lib/arrow/array-computable.rb} +24 -16
- data/{test/test-buffer.rb → lib/arrow/array-statistics.rb} +19 -24
- data/lib/arrow/array.rb +40 -4
- data/lib/arrow/chunked-array.rb +56 -1
- data/lib/arrow/column-containable.rb +9 -0
- data/lib/arrow/column.rb +49 -4
- data/{test/test-tensor.rb → lib/arrow/csv-write-options.rb} +28 -31
- data/lib/arrow/data-type.rb +17 -3
- data/lib/arrow/decimal128-array-builder.rb +16 -6
- data/lib/arrow/decimal128.rb +14 -0
- data/lib/arrow/decimal256-array-builder.rb +16 -6
- data/lib/arrow/decimal256.rb +14 -0
- data/{test/test-float-scalar.rb → lib/arrow/dense-union-array-builder.rb} +27 -24
- data/{test/test-boolean-scalar.rb → lib/arrow/dense-union-array.rb} +7 -7
- data/lib/arrow/duration-array-builder.rb +27 -0
- data/lib/arrow/duration-array.rb +24 -0
- data/lib/arrow/duration-data-type.rb +32 -0
- data/lib/arrow/expression.rb +6 -2
- data/lib/arrow/field-containable.rb +1 -1
- data/lib/arrow/field.rb +44 -3
- data/lib/arrow/fixed-size-list-array-builder.rb +29 -0
- data/lib/arrow/fixed-size-list-data-type.rb +118 -0
- data/lib/arrow/function.rb +0 -1
- data/lib/arrow/half-float-array-builder.rb +32 -0
- data/lib/arrow/half-float-array.rb +24 -0
- data/lib/arrow/half-float.rb +118 -0
- data/{test/helper/fixture.rb → lib/arrow/input-referable.rb} +7 -6
- data/lib/arrow/jruby/array-builder.rb +114 -0
- data/lib/arrow/jruby/array.rb +109 -0
- data/lib/arrow/jruby/chunked-array.rb +36 -0
- data/lib/arrow/jruby/compression-type.rb +26 -0
- data/lib/arrow/jruby/csv-read-options.rb +32 -0
- data/{test/test-map-data-type.rb → lib/arrow/jruby/data-type.rb} +24 -12
- data/lib/arrow/jruby/decimal128.rb +28 -0
- data/lib/arrow/jruby/decimal256.rb +28 -0
- data/{test/fixture/float-integer.csv → lib/arrow/jruby/error.rb} +7 -4
- data/lib/arrow/jruby/file-system.rb +24 -0
- data/{test/test-null-array.rb → lib/arrow/jruby/function.rb} +5 -4
- data/lib/arrow/jruby/record-batch-iterator.rb +24 -0
- data/{test/fixture/null-with-double-quote.csv → lib/arrow/jruby/record-batch.rb} +8 -4
- data/{test/fixture/integer-float.csv → lib/arrow/jruby/sort-key.rb} +8 -4
- data/lib/arrow/jruby/sort-options.rb +24 -0
- data/lib/arrow/jruby/stream-listener-raw.rb +25 -0
- data/{test/test-rolling-window.rb → lib/arrow/jruby/table.rb} +19 -19
- data/lib/arrow/jruby/writable.rb +24 -0
- data/lib/arrow/jruby.rb +52 -0
- data/{test/test-date32-array.rb → lib/arrow/large-list-array-builder.rb} +10 -5
- data/lib/arrow/large-list-data-type.rb +83 -0
- data/lib/arrow/libraries.rb +140 -0
- data/lib/arrow/list-array-builder.rb +1 -68
- data/lib/arrow/list-data-type.rb +3 -38
- data/{test/test-dictionary-array.rb → lib/arrow/list-field-resolvable.rb} +26 -17
- data/lib/arrow/list-slice-options.rb +76 -0
- data/lib/arrow/list-values-appendable.rb +88 -0
- data/lib/arrow/loader.rb +15 -96
- data/{test/test-decimal128-array.rb → lib/arrow/make-struct-options.rb} +18 -18
- data/lib/arrow/raw-table-converter.rb +10 -3
- data/lib/arrow/raw-tensor-converter.rb +89 -0
- data/lib/arrow/record-batch-file-reader.rb +2 -0
- data/lib/arrow/record-batch-stream-reader.rb +2 -0
- data/lib/arrow/record-batch.rb +6 -2
- data/{test/fixture/null-without-double-quote.csv → lib/arrow/ruby.rb} +5 -4
- data/lib/arrow/scalar.rb +67 -0
- data/lib/arrow/slicer.rb +61 -0
- data/lib/arrow/sort-key.rb +3 -3
- data/lib/arrow/sparse-union-array-builder.rb +56 -0
- data/lib/arrow/sparse-union-array.rb +26 -0
- data/lib/arrow/stream-decoder.rb +29 -0
- data/{test/test-decimal256-data-type.rb → lib/arrow/stream-listener.rb} +25 -9
- data/lib/arrow/string-array-builder.rb +30 -0
- data/lib/arrow/struct-array-builder.rb +0 -5
- data/lib/arrow/table-formatter.rb +38 -8
- data/lib/arrow/table-list-formatter.rb +3 -3
- data/lib/arrow/table-loader.rb +11 -5
- data/lib/arrow/table-saver.rb +4 -3
- data/lib/arrow/table-table-formatter.rb +7 -0
- data/lib/arrow/table.rb +180 -33
- data/lib/arrow/tensor.rb +144 -0
- data/lib/arrow/time-unit.rb +31 -0
- data/lib/arrow/time32-array-builder.rb +2 -14
- data/lib/arrow/time32-data-type.rb +9 -38
- data/lib/arrow/time64-array-builder.rb +2 -14
- data/lib/arrow/time64-data-type.rb +9 -38
- data/lib/arrow/timestamp-array-builder.rb +3 -15
- data/lib/arrow/timestamp-data-type.rb +9 -34
- data/{test/test-date64-array.rb → lib/arrow/timestamp-parser.rb} +14 -6
- data/lib/arrow/union-array-builder.rb +59 -0
- data/lib/arrow/union-array.rb +26 -0
- data/lib/arrow/version.rb +1 -1
- data/lib/arrow.rb +2 -7
- data/red-arrow.gemspec +74 -11
- metadata +85 -210
- data/test/fixture/TestOrcFile.test1.orc +0 -0
- data/test/fixture/with-header-float.csv +0 -20
- data/test/fixture/with-header.csv +0 -20
- data/test/fixture/without-header-float.csv +0 -19
- data/test/fixture/without-header.csv +0 -19
- data/test/helper/omittable.rb +0 -36
- data/test/helper.rb +0 -30
- data/test/raw-records/test-basic-arrays.rb +0 -395
- data/test/raw-records/test-dense-union-array.rb +0 -521
- data/test/raw-records/test-list-array.rb +0 -610
- data/test/raw-records/test-map-array.rb +0 -478
- data/test/raw-records/test-multiple-columns.rb +0 -65
- data/test/raw-records/test-sparse-union-array.rb +0 -511
- data/test/raw-records/test-struct-array.rb +0 -515
- data/test/raw-records/test-table.rb +0 -47
- data/test/run-test.rb +0 -71
- data/test/test-array-builder.rb +0 -136
- data/test/test-array.rb +0 -325
- data/test/test-bigdecimal.rb +0 -40
- data/test/test-binary-dictionary-array-builder.rb +0 -103
- data/test/test-chunked-array.rb +0 -183
- data/test/test-column.rb +0 -92
- data/test/test-csv-loader.rb +0 -250
- data/test/test-data-type.rb +0 -83
- data/test/test-decimal128-array-builder.rb +0 -112
- data/test/test-decimal128-data-type.rb +0 -31
- data/test/test-decimal128.rb +0 -102
- data/test/test-decimal256-array-builder.rb +0 -112
- data/test/test-decimal256-array.rb +0 -38
- data/test/test-decimal256.rb +0 -102
- data/test/test-dense-union-data-type.rb +0 -41
- data/test/test-dictionary-data-type.rb +0 -40
- data/test/test-expression.rb +0 -40
- data/test/test-feather.rb +0 -49
- data/test/test-field.rb +0 -91
- data/test/test-file-output-stream.rb +0 -54
- data/test/test-fixed-size-binary-array-builder.rb +0 -92
- data/test/test-fixed-size-binary-array.rb +0 -36
- data/test/test-function.rb +0 -210
- data/test/test-group.rb +0 -180
- data/test/test-list-array-builder.rb +0 -79
- data/test/test-list-array.rb +0 -32
- data/test/test-list-data-type.rb +0 -69
- data/test/test-map-array-builder.rb +0 -110
- data/test/test-map-array.rb +0 -33
- data/test/test-memory-view.rb +0 -434
- data/test/test-orc.rb +0 -173
- data/test/test-record-batch-builder.rb +0 -125
- data/test/test-record-batch-file-reader.rb +0 -115
- data/test/test-record-batch-iterator.rb +0 -37
- data/test/test-record-batch-reader.rb +0 -46
- data/test/test-record-batch.rb +0 -182
- data/test/test-schema.rb +0 -134
- data/test/test-slicer.rb +0 -487
- data/test/test-sort-indices.rb +0 -40
- data/test/test-sort-key.rb +0 -81
- data/test/test-sort-options.rb +0 -58
- data/test/test-sparse-union-data-type.rb +0 -41
- data/test/test-string-dictionary-array-builder.rb +0 -103
- data/test/test-struct-array-builder.rb +0 -184
- data/test/test-struct-array.rb +0 -94
- data/test/test-struct-data-type.rb +0 -112
- data/test/test-table.rb +0 -1123
- data/test/test-time.rb +0 -288
- data/test/test-time32-array.rb +0 -81
- data/test/test-time64-array.rb +0 -81
- data/test/test-time64-data-type.rb +0 -42
- data/test/test-timestamp-array.rb +0 -45
- data/test/test-timestamp-data-type.rb +0 -42
- data/test/values/test-basic-arrays.rb +0 -325
- data/test/values/test-dense-union-array.rb +0 -509
- data/test/values/test-dictionary-array.rb +0 -295
- data/test/values/test-list-array.rb +0 -571
- data/test/values/test-map-array.rb +0 -466
- data/test/values/test-sparse-union-array.rb +0 -500
- data/test/values/test-struct-array.rb +0 -512
data/lib/arrow/column.rb
CHANGED
|
@@ -27,6 +27,23 @@ module Arrow
|
|
|
27
27
|
@index = index
|
|
28
28
|
@field = @container.schema[@index]
|
|
29
29
|
@data = @container.get_column_data(@index)
|
|
30
|
+
@container.share_input(@data)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def to_arrow
|
|
34
|
+
@data
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def to_arrow_array
|
|
38
|
+
@data.to_arrow_array
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def to_arrow_chunked_array
|
|
42
|
+
@data.to_arrow_chunked_array
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def values
|
|
46
|
+
@data.values
|
|
30
47
|
end
|
|
31
48
|
|
|
32
49
|
def name
|
|
@@ -57,11 +74,11 @@ module Arrow
|
|
|
57
74
|
@data.reverse_each(&block)
|
|
58
75
|
end
|
|
59
76
|
|
|
60
|
-
def
|
|
61
|
-
@data.
|
|
77
|
+
def size
|
|
78
|
+
@data.size
|
|
62
79
|
end
|
|
63
|
-
alias_method :
|
|
64
|
-
alias_method :
|
|
80
|
+
alias_method :length, :size
|
|
81
|
+
alias_method :n_rows, :size
|
|
65
82
|
|
|
66
83
|
def n_nulls
|
|
67
84
|
@data.n_nulls
|
|
@@ -72,5 +89,33 @@ module Arrow
|
|
|
72
89
|
@field == other.field and
|
|
73
90
|
@data == other.data
|
|
74
91
|
end
|
|
92
|
+
|
|
93
|
+
def count(options: nil)
|
|
94
|
+
@data.count(options: options)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def sum(options: nil)
|
|
98
|
+
@data.sum(options: options)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def min(options: nil)
|
|
102
|
+
@data.min(options: options)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def max(options: nil)
|
|
106
|
+
@data.max(options: options)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def unique
|
|
110
|
+
@data.unique
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def uniq
|
|
114
|
+
@data.uniq
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def cast(target_data_type, options: nil)
|
|
118
|
+
@data.cast(target_data_type, options: options)
|
|
119
|
+
end
|
|
75
120
|
end
|
|
76
121
|
end
|
|
@@ -15,42 +15,39 @@
|
|
|
15
15
|
# specific language governing permissions and limitations
|
|
16
16
|
# under the License.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
data = Arrow::Buffer.new(raw_data.pack("c*"))
|
|
32
|
-
shape = [3, 2, 2]
|
|
33
|
-
strides = []
|
|
34
|
-
names = ["a", "b", "c"]
|
|
35
|
-
@tensor = Arrow::Tensor.new(Arrow::Int8DataType.new,
|
|
36
|
-
data,
|
|
37
|
-
shape,
|
|
38
|
-
strides,
|
|
39
|
-
names)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
sub_test_case("#==") do
|
|
43
|
-
test("Arrow::Tensor") do
|
|
44
|
-
assert do
|
|
45
|
-
@tensor == @tensor
|
|
18
|
+
module Arrow
|
|
19
|
+
class CSVWriteOptions
|
|
20
|
+
class << self
|
|
21
|
+
def try_convert(value)
|
|
22
|
+
case value
|
|
23
|
+
when Hash
|
|
24
|
+
options = new
|
|
25
|
+
value.each do |k, v|
|
|
26
|
+
options.public_send("#{k}=", v)
|
|
27
|
+
end
|
|
28
|
+
options
|
|
29
|
+
else
|
|
30
|
+
nil
|
|
46
31
|
end
|
|
47
32
|
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
alias_method :delimiter_raw, :delimiter
|
|
36
|
+
def delimiter
|
|
37
|
+
delimiter_raw.chr
|
|
38
|
+
end
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
40
|
+
alias_method :delimiter_raw=, :delimiter=
|
|
41
|
+
def delimiter=(delimiter)
|
|
42
|
+
case delimiter
|
|
43
|
+
when String
|
|
44
|
+
if delimiter.bytesize != 1
|
|
45
|
+
message = "delimiter must be 1 byte character: #{delimiter.inspect}"
|
|
46
|
+
raise ArgumentError, message
|
|
52
47
|
end
|
|
48
|
+
delimiter = delimiter.ord
|
|
53
49
|
end
|
|
50
|
+
self.delimiter_raw = delimiter
|
|
54
51
|
end
|
|
55
52
|
end
|
|
56
53
|
end
|
data/lib/arrow/data-type.rb
CHANGED
|
@@ -110,7 +110,7 @@ module Arrow
|
|
|
110
110
|
description[key] = value
|
|
111
111
|
end
|
|
112
112
|
end
|
|
113
|
-
if type.nil?
|
|
113
|
+
if type.nil? and self == DataType
|
|
114
114
|
message =
|
|
115
115
|
"data type description must have :type value: #{data_type.inspect}"
|
|
116
116
|
raise ArgumentError, message
|
|
@@ -152,6 +152,7 @@ module Arrow
|
|
|
152
152
|
|
|
153
153
|
private
|
|
154
154
|
def resolve_class(data_type)
|
|
155
|
+
return self if data_type.nil?
|
|
155
156
|
components = data_type.to_s.split("_").collect(&:capitalize)
|
|
156
157
|
data_type_name = components.join.gsub(/\AUint/, "UInt")
|
|
157
158
|
data_type_class_name = "#{data_type_name}DataType"
|
|
@@ -187,12 +188,25 @@ module Arrow
|
|
|
187
188
|
end
|
|
188
189
|
end
|
|
189
190
|
|
|
190
|
-
def
|
|
191
|
+
def array_class
|
|
191
192
|
base_name = self.class.name.gsub(/DataType\z/, "")
|
|
192
|
-
|
|
193
|
+
::Arrow.const_get("#{base_name}Array")
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def build_array(values)
|
|
197
|
+
builder_class = array_class.builder_class
|
|
193
198
|
args = [values]
|
|
194
199
|
args.unshift(self) unless builder_class.buildable?(args)
|
|
195
200
|
builder_class.build(*args)
|
|
196
201
|
end
|
|
202
|
+
|
|
203
|
+
# @return [Arrow::Scalar} A corresponding {Arrow::Scalar} class
|
|
204
|
+
# for this data type.
|
|
205
|
+
#
|
|
206
|
+
# @since 12.0.0
|
|
207
|
+
def scalar_class
|
|
208
|
+
base_name = self.class.name.gsub(/DataType\z/, "")
|
|
209
|
+
::Arrow.const_get("#{base_name}Scalar")
|
|
210
|
+
end
|
|
197
211
|
end
|
|
198
212
|
end
|
|
@@ -42,16 +42,26 @@ module Arrow
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
private
|
|
45
|
+
def precision
|
|
46
|
+
@precision ||= value_data_type.precision
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def scale
|
|
50
|
+
@scale ||= value_data_type.scale
|
|
51
|
+
end
|
|
52
|
+
|
|
45
53
|
def normalize_value(value)
|
|
46
54
|
case value
|
|
47
|
-
when String
|
|
48
|
-
Decimal128.new(value)
|
|
49
|
-
when Float
|
|
50
|
-
Decimal128.new(value.to_s)
|
|
51
55
|
when BigDecimal
|
|
52
|
-
|
|
56
|
+
if value.nan? or value.infinite?
|
|
57
|
+
message = "can't use #{value} as an Arrow::Decimal128Array value"
|
|
58
|
+
raise FloatDomainError, message
|
|
59
|
+
end
|
|
60
|
+
integer, decimal = value.to_s("f").split(".", 2)
|
|
61
|
+
decimal = decimal[0, scale].ljust(scale, "0")
|
|
62
|
+
Decimal128.new("#{integer}.#{decimal}")
|
|
53
63
|
else
|
|
54
|
-
value
|
|
64
|
+
Decimal128.try_convert(value) || value
|
|
55
65
|
end
|
|
56
66
|
end
|
|
57
67
|
end
|
data/lib/arrow/decimal128.rb
CHANGED
|
@@ -17,6 +17,20 @@
|
|
|
17
17
|
|
|
18
18
|
module Arrow
|
|
19
19
|
class Decimal128
|
|
20
|
+
class << self
|
|
21
|
+
# @api private
|
|
22
|
+
def try_convert(value)
|
|
23
|
+
case value
|
|
24
|
+
when String
|
|
25
|
+
new(value)
|
|
26
|
+
when Float
|
|
27
|
+
new(value.to_s)
|
|
28
|
+
else
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
20
34
|
alias_method :to_s_raw, :to_s
|
|
21
35
|
|
|
22
36
|
# @overload to_s
|
|
@@ -45,16 +45,26 @@ module Arrow
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
private
|
|
48
|
+
def precision
|
|
49
|
+
@precision ||= value_data_type.precision
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def scale
|
|
53
|
+
@scale ||= value_data_type.scale
|
|
54
|
+
end
|
|
55
|
+
|
|
48
56
|
def normalize_value(value)
|
|
49
57
|
case value
|
|
50
|
-
when String
|
|
51
|
-
Decimal256.new(value)
|
|
52
|
-
when Float
|
|
53
|
-
Decimal256.new(value.to_s)
|
|
54
58
|
when BigDecimal
|
|
55
|
-
|
|
59
|
+
if value.nan? or value.infinite?
|
|
60
|
+
message = "can't use #{value} as an Arrow::Decimal256Array value"
|
|
61
|
+
raise FloatDomainError, message
|
|
62
|
+
end
|
|
63
|
+
integer, decimal = value.to_s("f").split(".", 2)
|
|
64
|
+
decimal = decimal[0, scale].ljust(scale, "0")
|
|
65
|
+
Decimal256.new("#{integer}.#{decimal}")
|
|
56
66
|
else
|
|
57
|
-
value
|
|
67
|
+
Decimal256.try_convert(value) || value
|
|
58
68
|
end
|
|
59
69
|
end
|
|
60
70
|
end
|
data/lib/arrow/decimal256.rb
CHANGED
|
@@ -17,6 +17,20 @@
|
|
|
17
17
|
|
|
18
18
|
module Arrow
|
|
19
19
|
class Decimal256
|
|
20
|
+
class << self
|
|
21
|
+
# @api private
|
|
22
|
+
def try_convert(value)
|
|
23
|
+
case value
|
|
24
|
+
when String
|
|
25
|
+
new(value)
|
|
26
|
+
when Float
|
|
27
|
+
new(value.to_s)
|
|
28
|
+
else
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
20
34
|
alias_method :to_s_raw, :to_s
|
|
21
35
|
|
|
22
36
|
# @overload to_s
|
|
@@ -15,31 +15,34 @@
|
|
|
15
15
|
# specific language governing permissions and limitations
|
|
16
16
|
# under the License.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
scalar1 = Arrow::FloatScalar.new(1.1)
|
|
22
|
-
scalar2 = Arrow::FloatScalar.new(1.1000001)
|
|
23
|
-
assert do
|
|
24
|
-
not scalar1.equal_scalar?(scalar2)
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
test(":approx") do
|
|
29
|
-
scalar1 = Arrow::FloatScalar.new(1.1)
|
|
30
|
-
scalar2 = Arrow::FloatScalar.new(1.1000001)
|
|
31
|
-
assert do
|
|
32
|
-
scalar1.equal_scalar?(scalar2, approx: true)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
18
|
+
module Arrow
|
|
19
|
+
class DenseUnionArrayBuilder
|
|
20
|
+
alias_method :append_value_raw, :append_value
|
|
35
21
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
22
|
+
# @overload append_value
|
|
23
|
+
#
|
|
24
|
+
# Starts appending an union record. You need to append values of
|
|
25
|
+
# fields.
|
|
26
|
+
#
|
|
27
|
+
# @overload append_value(value)
|
|
28
|
+
#
|
|
29
|
+
# Appends an union record including values of fields.
|
|
30
|
+
#
|
|
31
|
+
# @param value [nil, Hash] The union record value.
|
|
32
|
+
#
|
|
33
|
+
# If this is `nil`, the union record is null.
|
|
34
|
+
#
|
|
35
|
+
# If this is `Hash`, it's values of fields.
|
|
36
|
+
#
|
|
37
|
+
# @since 12.0.0
|
|
38
|
+
def append_value(value)
|
|
39
|
+
if value.nil?
|
|
40
|
+
append_null
|
|
41
|
+
else
|
|
42
|
+
key = value.keys[0]
|
|
43
|
+
child_info = child_infos[key]
|
|
44
|
+
append_value_raw(child_info[:id])
|
|
45
|
+
child_info[:builder].append(value.values[0])
|
|
43
46
|
end
|
|
44
47
|
end
|
|
45
48
|
end
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
# specific language governing permissions and limitations
|
|
16
16
|
# under the License.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
module Arrow
|
|
19
|
+
class DenseUnionArray
|
|
20
|
+
def get_value(i)
|
|
21
|
+
child_id = get_child_id(i)
|
|
22
|
+
field = fields[child_id]
|
|
23
|
+
field[get_value_offset(i)]
|
|
24
|
+
end
|
|
25
25
|
end
|
|
26
26
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Arrow
|
|
19
|
+
class DurationArrayBuilder
|
|
20
|
+
class << self
|
|
21
|
+
def build(data_type, values)
|
|
22
|
+
builder = new(data_type)
|
|
23
|
+
builder.build(values)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Arrow
|
|
19
|
+
class DurationArray
|
|
20
|
+
def unit
|
|
21
|
+
@unit ||= value_data_type.unit
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Arrow
|
|
19
|
+
class DurationDataType
|
|
20
|
+
class << self
|
|
21
|
+
# @api private
|
|
22
|
+
def try_convert(value)
|
|
23
|
+
case value
|
|
24
|
+
when Symbol, Arrow::TimeUnit
|
|
25
|
+
new(value)
|
|
26
|
+
else
|
|
27
|
+
super
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/arrow/expression.rb
CHANGED
|
@@ -31,10 +31,14 @@ module Arrow
|
|
|
31
31
|
else
|
|
32
32
|
return nil
|
|
33
33
|
end
|
|
34
|
+
options = nil
|
|
34
35
|
if arguments.last.is_a?(FunctionOptions)
|
|
35
36
|
options = arguments.pop
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
elsif arguments.last.is_a?(Hash)
|
|
38
|
+
function = Function.find(function_name)
|
|
39
|
+
if function
|
|
40
|
+
options = function.resolve_options(arguments.pop)
|
|
41
|
+
end
|
|
38
42
|
end
|
|
39
43
|
CallExpression.new(function_name, arguments, options)
|
|
40
44
|
else
|
|
@@ -29,7 +29,7 @@ module Arrow
|
|
|
29
29
|
return nil if index < 0 or index >= n_fields
|
|
30
30
|
get_field(index)
|
|
31
31
|
else
|
|
32
|
-
message = "field name or index must be String, Symbol or Integer"
|
|
32
|
+
message = +"field name or index must be String, Symbol or Integer"
|
|
33
33
|
message << ": <#{name_or_index.inspect}>"
|
|
34
34
|
raise ArgumentError, message
|
|
35
35
|
end
|
data/lib/arrow/field.rb
CHANGED
|
@@ -17,12 +17,28 @@
|
|
|
17
17
|
|
|
18
18
|
module Arrow
|
|
19
19
|
class Field
|
|
20
|
+
class << self
|
|
21
|
+
# @api private
|
|
22
|
+
def try_convert(value)
|
|
23
|
+
case value
|
|
24
|
+
when Hash
|
|
25
|
+
begin
|
|
26
|
+
new(value)
|
|
27
|
+
rescue ArgumentError
|
|
28
|
+
nil
|
|
29
|
+
end
|
|
30
|
+
else
|
|
31
|
+
nil
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
20
36
|
alias_method :initialize_raw, :initialize
|
|
21
37
|
private :initialize_raw
|
|
22
38
|
|
|
23
39
|
# Creates a new {Arrow::Field}.
|
|
24
40
|
#
|
|
25
|
-
# @overload initialize(name, data_type)
|
|
41
|
+
# @overload initialize(name, data_type, nullable=false)
|
|
26
42
|
#
|
|
27
43
|
# @param name [String, Symbol] The name of the field.
|
|
28
44
|
#
|
|
@@ -34,6 +50,11 @@ module Arrow
|
|
|
34
50
|
# See {Arrow::DataType.resolve} how to specify data type
|
|
35
51
|
# description.
|
|
36
52
|
#
|
|
53
|
+
# @param nullable [Boolean, nil] (false) Whether the field may contain
|
|
54
|
+
# zero or more nulls.
|
|
55
|
+
#
|
|
56
|
+
# `nil` is processed as `true` (null may be contained).
|
|
57
|
+
#
|
|
37
58
|
# @example Create a field with {Arrow::DataType}s
|
|
38
59
|
# Arrow::Field.new("visible", Arrow::BooleanDataType.new)
|
|
39
60
|
#
|
|
@@ -75,6 +96,11 @@ module Arrow
|
|
|
75
96
|
# See {Arrow::DataType.resolve} how to specify data type
|
|
76
97
|
# description.
|
|
77
98
|
#
|
|
99
|
+
# @option description [Boolean, nil] :nullable Whether the field
|
|
100
|
+
# may contain zero or more nulls.
|
|
101
|
+
#
|
|
102
|
+
# `nil` is processed as `true` (null may be contained).
|
|
103
|
+
#
|
|
78
104
|
# @example Create a field with {Arrow::DataType}s
|
|
79
105
|
# Arrow::Field.new(name: "visible",
|
|
80
106
|
# data_type: Arrow::BooleanDataType.new)
|
|
@@ -92,6 +118,7 @@ module Arrow
|
|
|
92
118
|
name = nil
|
|
93
119
|
data_type = nil
|
|
94
120
|
data_type_description = {}
|
|
121
|
+
nullable = nil
|
|
95
122
|
description.each do |key, value|
|
|
96
123
|
key = key.to_sym
|
|
97
124
|
case key
|
|
@@ -99,20 +126,34 @@ module Arrow
|
|
|
99
126
|
name = value
|
|
100
127
|
when :data_type
|
|
101
128
|
data_type = DataType.resolve(value)
|
|
129
|
+
when :nullable
|
|
130
|
+
nullable = value
|
|
102
131
|
else
|
|
103
132
|
data_type_description[key] = value
|
|
104
133
|
end
|
|
105
134
|
end
|
|
106
135
|
data_type ||= DataType.resolve(data_type_description)
|
|
107
136
|
when 2
|
|
137
|
+
name = args[0]
|
|
138
|
+
data_type = args[1]
|
|
139
|
+
if data_type.is_a?(Hash)
|
|
140
|
+
data_type = data_type.dup
|
|
141
|
+
nullable = data_type.delete(:nullable)
|
|
142
|
+
else
|
|
143
|
+
nullable = nil
|
|
144
|
+
end
|
|
145
|
+
data_type = DataType.resolve(data_type)
|
|
146
|
+
when 3
|
|
108
147
|
name = args[0]
|
|
109
148
|
data_type = DataType.resolve(args[1])
|
|
149
|
+
nullable = args[2]
|
|
110
150
|
else
|
|
111
|
-
message = "wrong number of arguments (given #{n_args}, expected 1..
|
|
151
|
+
message = "wrong number of arguments (given #{n_args}, expected 1..3)"
|
|
112
152
|
raise ArgumentError, message
|
|
113
153
|
end
|
|
154
|
+
nullable = true if nullable.nil?
|
|
114
155
|
|
|
115
|
-
initialize_raw(name, data_type)
|
|
156
|
+
initialize_raw(name, data_type, nullable)
|
|
116
157
|
end
|
|
117
158
|
end
|
|
118
159
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Arrow
|
|
19
|
+
class FixedSizeListArrayBuilder
|
|
20
|
+
class << self
|
|
21
|
+
def build(data_type, values)
|
|
22
|
+
builder = new(data_type)
|
|
23
|
+
builder.build(values)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
prepend ListValuesAppendable
|
|
28
|
+
end
|
|
29
|
+
end
|