red-arrow 8.0.0 → 10.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/ext/arrow/converters.hpp +3 -0
- data/ext/arrow/extconf.rb +8 -4
- data/lib/arrow/array-builder.rb +40 -6
- data/lib/arrow/array-computable.rb +37 -0
- data/lib/arrow/array.rb +28 -0
- data/lib/arrow/chunked-array.rb +21 -0
- data/lib/arrow/column.rb +28 -0
- data/lib/arrow/data-type.rb +8 -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/lib/arrow/field.rb +44 -3
- data/lib/arrow/list-data-type.rb +1 -6
- data/lib/arrow/loader.rb +3 -0
- data/lib/arrow/raw-table-converter.rb +6 -1
- data/lib/arrow/raw-tensor-converter.rb +89 -0
- data/lib/arrow/string-array-builder.rb +30 -0
- data/lib/arrow/tensor.rb +140 -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 +2 -14
- data/lib/arrow/timestamp-data-type.rb +9 -34
- data/lib/arrow/version.rb +1 -1
- data/red-arrow.gemspec +1 -1
- data/test/raw-records/test-dictionary-array.rb +341 -0
- data/test/test-array-builder.rb +62 -0
- data/test/test-chunked-array.rb +6 -0
- data/test/test-column.rb +31 -0
- data/test/test-decimal128-array-builder.rb +14 -0
- data/test/test-decimal128-array.rb +5 -2
- data/test/test-decimal128.rb +26 -2
- data/test/test-decimal256-array-builder.rb +14 -0
- data/test/test-decimal256-array.rb +5 -2
- data/test/test-decimal256.rb +26 -2
- data/test/test-field.rb +26 -0
- data/test/test-orc.rb +2 -2
- data/test/test-table.rb +16 -0
- data/test/test-tensor.rb +243 -2
- data/test/values/test-dictionary-array.rb +30 -0
- metadata +15 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc23de72fe60f7f6b71d45d4ec9019b0066da0de1aaef7992af984fa3ee14db3
|
4
|
+
data.tar.gz: 5383f405645f394c8af4b35ce537a82a54b207823a1debf755d09ef645bcbe15
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf9d0c9274059ab09a91af39573c5e4b1a902ca486038e61aff882441d725592bc4143821ba82607979ff09ea7cc9e5220efda1f12478e28b2cf9a9c89cff2d2
|
7
|
+
data.tar.gz: 4225c79d4eeb6770175624ef0eb4e90e263715a1d0b817bf34898ad179a85325f0d15e8fca6697d94870b6147bb965ab1644170fdae52eab07c37396214e5549
|
data/ext/arrow/converters.hpp
CHANGED
data/ext/arrow/extconf.rb
CHANGED
@@ -38,6 +38,8 @@ checking_for(checking_message("Homebrew")) do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
$CXXFLAGS += " -std=c++17 "
|
42
|
+
|
41
43
|
unless required_pkg_config_package([
|
42
44
|
"arrow",
|
43
45
|
Arrow::Version::MAJOR,
|
@@ -45,9 +47,10 @@ unless required_pkg_config_package([
|
|
45
47
|
Arrow::Version::MICRO,
|
46
48
|
],
|
47
49
|
debian: "libarrow-dev",
|
48
|
-
|
50
|
+
fedora: "libarrow-devel",
|
49
51
|
homebrew: "apache-arrow",
|
50
|
-
msys2: "arrow"
|
52
|
+
msys2: "arrow",
|
53
|
+
redhat: "arrow-devel")
|
51
54
|
exit(false)
|
52
55
|
end
|
53
56
|
|
@@ -58,9 +61,10 @@ unless required_pkg_config_package([
|
|
58
61
|
Arrow::Version::MICRO,
|
59
62
|
],
|
60
63
|
debian: "libarrow-glib-dev",
|
61
|
-
|
64
|
+
fedora: "libarrow-glib-devel",
|
62
65
|
homebrew: "apache-arrow-glib",
|
63
|
-
msys2: "arrow"
|
66
|
+
msys2: "arrow",
|
67
|
+
redhat: "arrow-glib-devel")
|
64
68
|
exit(false)
|
65
69
|
end
|
66
70
|
|
data/lib/arrow/array-builder.rb
CHANGED
@@ -33,6 +33,11 @@ module Arrow
|
|
33
33
|
end
|
34
34
|
if builder_info
|
35
35
|
builder = builder_info[:builder]
|
36
|
+
if builder.nil? and builder_info[:builder_type]
|
37
|
+
builder = create_builder(builder_info)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
if builder
|
36
41
|
builder.build(values)
|
37
42
|
else
|
38
43
|
Arrow::StringArray.new(values)
|
@@ -121,15 +126,28 @@ module Arrow
|
|
121
126
|
detected: true,
|
122
127
|
}
|
123
128
|
when BigDecimal
|
124
|
-
|
125
|
-
|
126
|
-
builder: Decimal128ArrayBuilder.new,
|
127
|
-
}
|
128
|
-
else
|
129
|
+
builder_info ||= {}
|
130
|
+
if builder_info[:builder] or value.nan? or value.infinite?
|
129
131
|
{
|
130
|
-
builder:
|
132
|
+
builder: StringArrayBuilder.new,
|
131
133
|
detected: true,
|
132
134
|
}
|
135
|
+
else
|
136
|
+
precision = [builder_info[:precision] || 0, value.precision].max
|
137
|
+
scale = [builder_info[:scale] || 0, value.scale].max
|
138
|
+
if precision <= Decimal128DataType::MAX_PRECISION
|
139
|
+
{
|
140
|
+
builder_type: :decimal128,
|
141
|
+
precision: precision,
|
142
|
+
scale: scale,
|
143
|
+
}
|
144
|
+
else
|
145
|
+
{
|
146
|
+
builder_type: :decimal256,
|
147
|
+
precision: precision,
|
148
|
+
scale: scale,
|
149
|
+
}
|
150
|
+
end
|
133
151
|
end
|
134
152
|
when ::Array
|
135
153
|
sub_builder_info = nil
|
@@ -154,6 +172,22 @@ module Arrow
|
|
154
172
|
}
|
155
173
|
end
|
156
174
|
end
|
175
|
+
|
176
|
+
def create_builder(builder_info)
|
177
|
+
builder_type = builder_info[:builder_type]
|
178
|
+
case builder_type
|
179
|
+
when :decimal128
|
180
|
+
data_type = Decimal128DataType.new(builder_info[:precision],
|
181
|
+
builder_info[:scale])
|
182
|
+
Decimal128ArrayBuilder.new(data_type)
|
183
|
+
when :decimal256
|
184
|
+
data_type = Decimal256DataType.new(builder_info[:precision],
|
185
|
+
builder_info[:scale])
|
186
|
+
Decimal256ArrayBuilder.new(data_type)
|
187
|
+
else
|
188
|
+
nil
|
189
|
+
end
|
190
|
+
end
|
157
191
|
end
|
158
192
|
|
159
193
|
def build(values)
|
@@ -0,0 +1,37 @@
|
|
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
|
+
module ArrayComputable
|
20
|
+
def min(options: nil)
|
21
|
+
compute("min", options: options).value
|
22
|
+
end
|
23
|
+
|
24
|
+
def max(options: nil)
|
25
|
+
compute("max", options: options).value
|
26
|
+
end
|
27
|
+
|
28
|
+
def uniq
|
29
|
+
unique.values
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def compute(name, options: nil)
|
34
|
+
Function.find(name).execute([self], options).value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/arrow/array.rb
CHANGED
@@ -18,6 +18,8 @@
|
|
18
18
|
module Arrow
|
19
19
|
class Array
|
20
20
|
include Enumerable
|
21
|
+
|
22
|
+
include ArrayComputable
|
21
23
|
include GenericFilterable
|
22
24
|
include GenericTakeable
|
23
25
|
|
@@ -34,6 +36,28 @@ module Arrow
|
|
34
36
|
return nil unless const_defined?(builder_class_name)
|
35
37
|
const_get(builder_class_name)
|
36
38
|
end
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
def try_convert(value)
|
42
|
+
case value
|
43
|
+
when ::Array
|
44
|
+
begin
|
45
|
+
new(value)
|
46
|
+
rescue ArgumentError
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
else
|
50
|
+
if value.respond_to?(:to_arrow_array)
|
51
|
+
begin
|
52
|
+
value.to_arrow_array
|
53
|
+
rescue RangeError
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
else
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
37
61
|
end
|
38
62
|
|
39
63
|
# @param i [Integer]
|
@@ -87,6 +111,10 @@ module Arrow
|
|
87
111
|
self
|
88
112
|
end
|
89
113
|
|
114
|
+
def to_arrow_array
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
90
118
|
alias_method :value_data_type_raw, :value_data_type
|
91
119
|
def value_data_type
|
92
120
|
@value_data_type ||= value_data_type_raw
|
data/lib/arrow/chunked-array.rb
CHANGED
@@ -18,6 +18,8 @@
|
|
18
18
|
module Arrow
|
19
19
|
class ChunkedArray
|
20
20
|
include Enumerable
|
21
|
+
|
22
|
+
include ArrayComputable
|
21
23
|
include GenericFilterable
|
22
24
|
include GenericTakeable
|
23
25
|
|
@@ -87,5 +89,24 @@ module Arrow
|
|
87
89
|
first_chunk.class.new(to_a)
|
88
90
|
end
|
89
91
|
end
|
92
|
+
|
93
|
+
def count(options: nil)
|
94
|
+
compute("count", options: options).value
|
95
|
+
end
|
96
|
+
|
97
|
+
def sum(options: nil)
|
98
|
+
compute("sum", options: options).value
|
99
|
+
end
|
100
|
+
|
101
|
+
def unique
|
102
|
+
compute("unique")
|
103
|
+
end
|
104
|
+
|
105
|
+
def cast(target_data_type, options: nil)
|
106
|
+
casted_chunks = chunks.collect do |chunk|
|
107
|
+
chunk.cast(target_data_type, options)
|
108
|
+
end
|
109
|
+
self.class.new(casted_chunks)
|
110
|
+
end
|
90
111
|
end
|
91
112
|
end
|
data/lib/arrow/column.rb
CHANGED
@@ -72,5 +72,33 @@ module Arrow
|
|
72
72
|
@field == other.field and
|
73
73
|
@data == other.data
|
74
74
|
end
|
75
|
+
|
76
|
+
def count(options: nil)
|
77
|
+
@data.count(options: options)
|
78
|
+
end
|
79
|
+
|
80
|
+
def sum(options: nil)
|
81
|
+
@data.sum(options: options)
|
82
|
+
end
|
83
|
+
|
84
|
+
def min(options: nil)
|
85
|
+
@data.min(options: options)
|
86
|
+
end
|
87
|
+
|
88
|
+
def max(options: nil)
|
89
|
+
@data.max(options: options)
|
90
|
+
end
|
91
|
+
|
92
|
+
def unique
|
93
|
+
@data.unique
|
94
|
+
end
|
95
|
+
|
96
|
+
def uniq
|
97
|
+
@data.uniq
|
98
|
+
end
|
99
|
+
|
100
|
+
def cast(target_data_type, options: nil)
|
101
|
+
@data.cast(target_data_type, options: options)
|
102
|
+
end
|
75
103
|
end
|
76
104
|
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,9 +188,13 @@ 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)
|
@@ -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
|
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
|
data/lib/arrow/list-data-type.rb
CHANGED
data/lib/arrow/loader.rb
CHANGED
@@ -34,6 +34,7 @@ module Arrow
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def require_libraries
|
37
|
+
require "arrow/array-computable"
|
37
38
|
require "arrow/column-containable"
|
38
39
|
require "arrow/field-containable"
|
39
40
|
require "arrow/generic-filterable"
|
@@ -106,6 +107,7 @@ module Arrow
|
|
106
107
|
require "arrow/source-node-options"
|
107
108
|
require "arrow/sparse-union-data-type"
|
108
109
|
require "arrow/string-dictionary-array-builder"
|
110
|
+
require "arrow/string-array-builder"
|
109
111
|
require "arrow/struct-array"
|
110
112
|
require "arrow/struct-array-builder"
|
111
113
|
require "arrow/struct-data-type"
|
@@ -118,6 +120,7 @@ module Arrow
|
|
118
120
|
require "arrow/table-saver"
|
119
121
|
require "arrow/tensor"
|
120
122
|
require "arrow/time"
|
123
|
+
require "arrow/time-unit"
|
121
124
|
require "arrow/time32-array"
|
122
125
|
require "arrow/time32-array-builder"
|
123
126
|
require "arrow/time32-data-type"
|
@@ -35,7 +35,12 @@ module Arrow
|
|
35
35
|
fields = []
|
36
36
|
@values = []
|
37
37
|
@raw_table.each do |name, array|
|
38
|
-
|
38
|
+
if array.respond_to?(:to_arrow_array)
|
39
|
+
array = array.to_arrow_array
|
40
|
+
else
|
41
|
+
array = array.to_ary if array.respond_to?(:to_ary)
|
42
|
+
array = ArrayBuilder.build(array)
|
43
|
+
end
|
39
44
|
fields << Field.new(name.to_s, array.value_data_type)
|
40
45
|
@values << array
|
41
46
|
end
|
@@ -0,0 +1,89 @@
|
|
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 RawTensorConverter
|
20
|
+
attr_reader :data_type
|
21
|
+
attr_reader :data
|
22
|
+
attr_reader :shape
|
23
|
+
attr_reader :strides
|
24
|
+
attr_reader :dimension_names
|
25
|
+
def initialize(raw_tensor,
|
26
|
+
data_type: nil,
|
27
|
+
shape: nil,
|
28
|
+
strides: nil,
|
29
|
+
dimension_names: nil)
|
30
|
+
@raw_tensor = raw_tensor
|
31
|
+
@data_type = data_type
|
32
|
+
@data = nil
|
33
|
+
@shape = shape
|
34
|
+
@strides = strides
|
35
|
+
@dimension_names = dimension_names
|
36
|
+
convert
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def convert
|
41
|
+
case @raw_tensor
|
42
|
+
when Buffer
|
43
|
+
@data = @raw_tensor
|
44
|
+
when String
|
45
|
+
unless @raw_tensor.encoding == Encoding::ASCII_8BIT
|
46
|
+
message = "raw tensor String must be an ASCII-8BIT encoded string: " +
|
47
|
+
"#{@raw_tensor.encoding.inspect}"
|
48
|
+
raise ArgumentError, message
|
49
|
+
end
|
50
|
+
@data = Arrow::Buffer.new(@raw_tensor)
|
51
|
+
else
|
52
|
+
@shape ||= guess_shape
|
53
|
+
build_buffer
|
54
|
+
unless @strides.nil?
|
55
|
+
message = "strides: is only accepted with " +
|
56
|
+
"an Arrow::Buffer or String raw tensor: #{@strides.inspect}"
|
57
|
+
raise ArgumentError, message
|
58
|
+
end
|
59
|
+
end
|
60
|
+
if @shape.nil?
|
61
|
+
raise ArgumentError, "shape: is missing: #{@raw_tensor.inspect}"
|
62
|
+
end
|
63
|
+
if @data_type.nil?
|
64
|
+
raise ArgumentError, "data_type: is missing: #{@raw_tensor.inspect}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def guess_shape
|
69
|
+
shape = [@raw_tensor.size]
|
70
|
+
target = @raw_tensor[0]
|
71
|
+
while target.is_a?(::Array)
|
72
|
+
shape << target.size
|
73
|
+
target = target[0]
|
74
|
+
end
|
75
|
+
shape
|
76
|
+
end
|
77
|
+
|
78
|
+
def build_buffer
|
79
|
+
if @data_type
|
80
|
+
@data_type = DataType.resolve(@data_type)
|
81
|
+
array = @data_type.build_array(@raw_tensor.flatten)
|
82
|
+
else
|
83
|
+
array = Array.new(@raw_tensor.flatten)
|
84
|
+
@data_type = array.value_data_type
|
85
|
+
end
|
86
|
+
@data = array.data_buffer
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|