red-arrow 3.0.0 → 6.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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -0
  3. data/ext/arrow/arrow.cpp +3 -0
  4. data/ext/arrow/converters.cpp +5 -0
  5. data/ext/arrow/converters.hpp +126 -0
  6. data/ext/arrow/extconf.rb +13 -0
  7. data/ext/arrow/memory-view.cpp +311 -0
  8. data/ext/arrow/memory-view.hpp +26 -0
  9. data/ext/arrow/raw-records.cpp +1 -0
  10. data/ext/arrow/values.cpp +1 -0
  11. data/lib/arrow/aggregate-node-options.rb +35 -0
  12. data/lib/arrow/aggregation.rb +46 -0
  13. data/lib/arrow/array-builder.rb +5 -0
  14. data/lib/arrow/array.rb +130 -0
  15. data/lib/arrow/binary-dictionary-array-builder.rb +27 -0
  16. data/lib/arrow/buffer.rb +10 -6
  17. data/lib/arrow/column-containable.rb +100 -1
  18. data/lib/arrow/constructor-arguments-gc-guardable.rb +25 -0
  19. data/lib/arrow/data-type.rb +14 -5
  20. data/lib/arrow/datum.rb +100 -0
  21. data/lib/arrow/dense-union-data-type.rb +2 -2
  22. data/lib/arrow/dictionary-data-type.rb +2 -2
  23. data/lib/arrow/equal-options.rb +38 -0
  24. data/lib/arrow/expression.rb +48 -0
  25. data/lib/arrow/file-system.rb +34 -0
  26. data/lib/arrow/group.rb +116 -124
  27. data/lib/arrow/loader.rb +46 -0
  28. data/lib/arrow/map-array-builder.rb +109 -0
  29. data/lib/arrow/map-array.rb +26 -0
  30. data/lib/arrow/map-data-type.rb +89 -0
  31. data/lib/arrow/path-extension.rb +1 -1
  32. data/lib/arrow/record-batch-reader.rb +41 -0
  33. data/lib/arrow/record-batch.rb +0 -2
  34. data/lib/arrow/scalar.rb +32 -0
  35. data/lib/arrow/slicer.rb +44 -143
  36. data/lib/arrow/sort-key.rb +193 -0
  37. data/lib/arrow/sort-options.rb +109 -0
  38. data/lib/arrow/source-node-options.rb +32 -0
  39. data/lib/arrow/sparse-union-data-type.rb +2 -2
  40. data/lib/arrow/string-dictionary-array-builder.rb +27 -0
  41. data/lib/arrow/symbol-values-appendable.rb +34 -0
  42. data/lib/arrow/table-concatenate-options.rb +36 -0
  43. data/lib/arrow/table-formatter.rb +141 -17
  44. data/lib/arrow/table-list-formatter.rb +5 -3
  45. data/lib/arrow/table-loader.rb +41 -3
  46. data/lib/arrow/table-saver.rb +29 -3
  47. data/lib/arrow/table-table-formatter.rb +7 -31
  48. data/lib/arrow/table.rb +34 -40
  49. data/lib/arrow/time32-data-type.rb +2 -2
  50. data/lib/arrow/time64-data-type.rb +2 -2
  51. data/lib/arrow/timestamp-data-type.rb +2 -2
  52. data/lib/arrow/version.rb +1 -1
  53. data/red-arrow.gemspec +2 -1
  54. data/test/helper.rb +1 -0
  55. data/test/raw-records/test-dense-union-array.rb +14 -0
  56. data/test/raw-records/test-list-array.rb +19 -0
  57. data/test/raw-records/test-map-array.rb +441 -0
  58. data/test/raw-records/test-sparse-union-array.rb +14 -0
  59. data/test/raw-records/test-struct-array.rb +15 -0
  60. data/test/test-array-builder.rb +7 -0
  61. data/test/test-array.rb +154 -0
  62. data/test/test-binary-dictionary-array-builder.rb +103 -0
  63. data/test/test-boolean-scalar.rb +26 -0
  64. data/test/test-csv-loader.rb +8 -8
  65. data/test/test-decimal128-data-type.rb +2 -2
  66. data/test/test-expression.rb +40 -0
  67. data/test/test-float-scalar.rb +46 -0
  68. data/test/test-function.rb +176 -0
  69. data/test/test-group.rb +75 -51
  70. data/test/test-map-array-builder.rb +110 -0
  71. data/test/test-map-array.rb +33 -0
  72. data/test/test-map-data-type.rb +36 -0
  73. data/test/test-memory-view.rb +434 -0
  74. data/test/test-orc.rb +19 -23
  75. data/test/test-record-batch-reader.rb +46 -0
  76. data/test/test-record-batch.rb +42 -0
  77. data/test/test-slicer.rb +166 -167
  78. data/test/test-sort-indices.rb +40 -0
  79. data/test/test-sort-key.rb +81 -0
  80. data/test/test-sort-options.rb +58 -0
  81. data/test/test-string-dictionary-array-builder.rb +103 -0
  82. data/test/test-table.rb +190 -53
  83. data/test/values/test-dense-union-array.rb +14 -0
  84. data/test/values/test-list-array.rb +17 -0
  85. data/test/values/test-map-array.rb +433 -0
  86. data/test/values/test-sparse-union-array.rb +14 -0
  87. data/test/values/test-struct-array.rb +15 -0
  88. metadata +73 -6
@@ -0,0 +1,46 @@
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 Aggregation
20
+ class << self
21
+ # @api private
22
+ def try_convert(value)
23
+ case value
24
+ when Hash
25
+ function = value[:function]
26
+ return nil if function.nil?
27
+ function = function.to_s if function.is_a?(Symbol)
28
+ return nil unless function.is_a?(String)
29
+ # TODO: Improve this when we have non hash based aggregate function
30
+ function = "hash_#{function}" unless function.start_with?("hash_")
31
+ options = value[:options]
32
+ input = value[:input]
33
+ return nil if input.nil?
34
+ output = value[:output]
35
+ if output.nil?
36
+ normalized_function = function.gsub(/\Ahash_/, "")
37
+ output = "#{normalized_function}(#{input})"
38
+ end
39
+ new(function, options, input, output)
40
+ else
41
+ nil
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -58,6 +58,11 @@ module Arrow
58
58
  builder: StringArrayBuilder.new,
59
59
  detected: true,
60
60
  }
61
+ when Symbol
62
+ {
63
+ builder: StringDictionaryArrayBuilder.new,
64
+ detected: true,
65
+ }
61
66
  when Float
62
67
  {
63
68
  builder: DoubleArrayBuilder.new,
data/lib/arrow/array.rb CHANGED
@@ -55,6 +55,18 @@ module Arrow
55
55
  end
56
56
  end
57
57
 
58
+ # @param other [Arrow::Array] The array to be compared.
59
+ # @param options [Arrow::EqualOptions, Hash] (nil)
60
+ # The options to custom how to compare.
61
+ #
62
+ # @return [Boolean]
63
+ # `true` if both of them have the same data, `false` otherwise.
64
+ #
65
+ # @since 5.0.0
66
+ def equal_array?(other, options=nil)
67
+ equal_options(other, options)
68
+ end
69
+
58
70
  def each
59
71
  return to_enum(__method__) unless block_given?
60
72
 
@@ -100,5 +112,123 @@ module Arrow
100
112
  is_in_raw(values)
101
113
  end
102
114
  end
115
+
116
+ # @api private
117
+ alias_method :concatenate_raw, :concatenate
118
+ # Concatenates the given other arrays to the array.
119
+ #
120
+ # @param other_arrays [::Array, Arrow::Array] The arrays to be
121
+ # concatenated.
122
+ #
123
+ # Each other array is processed by {#resolve} before they're
124
+ # concatenated.
125
+ #
126
+ # @example Raw Ruby Array
127
+ # array = Arrow::Int32Array.new([1])
128
+ # array.concatenate([2, 3], [4]) # => Arrow::Int32Array.new([1, 2, 3, 4])
129
+ #
130
+ # @example Arrow::Array
131
+ # array = Arrow::Int32Array.new([1])
132
+ # array.concatenate(Arrow::Int32Array.new([2, 3]),
133
+ # Arrow::Int8Array.new([4])) # => Arrow::Int32Array.new([1, 2, 3, 4])
134
+ #
135
+ # @since 4.0.0
136
+ def concatenate(*other_arrays)
137
+ other_arrays = other_arrays.collect do |other_array|
138
+ resolve(other_array)
139
+ end
140
+ concatenate_raw(other_arrays)
141
+ end
142
+
143
+ # Concatenates the given other array to the array.
144
+ #
145
+ # If you have multiple arrays to be concatenated, you should use
146
+ # {#concatenate} to concatenate multiple arrays at once.
147
+ #
148
+ # @param other_array [::Array, Arrow::Array] The array to be concatenated.
149
+ #
150
+ # `@other_array` is processed by {#resolve} before it's
151
+ # concatenated.
152
+ #
153
+ # @example Raw Ruby Array
154
+ # Arrow::Int32Array.new([1]) + [2, 3] # => Arrow::Int32Array.new([1, 2, 3])
155
+ #
156
+ # @example Arrow::Array
157
+ # Arrow::Int32Array.new([1]) +
158
+ # Arrow::Int32Array.new([2, 3]) # => Arrow::Int32Array.new([1, 2, 3])
159
+ #
160
+ # @since 4.0.0
161
+ def +(other_array)
162
+ concatenate(other_array)
163
+ end
164
+
165
+ # Ensures returning the same data type array from the given array.
166
+ #
167
+ # @return [Arrow::Array]
168
+ #
169
+ # @overload resolve(other_raw_array)
170
+ #
171
+ # @param other_raw_array [::Array] A raw Ruby Array. A new Arrow::Array
172
+ # is built by `self.class.new`.
173
+ #
174
+ # @example Raw Ruby Array
175
+ # int32_array = Arrow::Int32Array.new([1])
176
+ # other_array = int32_array.resolve([2, 3, 4])
177
+ # other_array # => Arrow::Int32Array.new([2, 3, 4])
178
+ #
179
+ # @overload resolve(other_array)
180
+ #
181
+ # @param other_array [Arrow::Array] Another Arrow::Array.
182
+ #
183
+ # If the given other array is an same data type array of
184
+ # `self`, the given other array is returned as-is.
185
+ #
186
+ # If the given other array isn't an same data type array of
187
+ # `self`, the given other array is casted.
188
+ #
189
+ # @example Same data type
190
+ # int32_array = Arrow::Int32Array.new([1])
191
+ # other_int32_array = Arrow::Int32Array.new([2, 3, 4])
192
+ # other_array = int32_array.resolve(other_int32_array)
193
+ # other_array.object_id == other_int32_array.object_id
194
+ #
195
+ # @example Other data type
196
+ # int32_array = Arrow::Int32Array.new([1])
197
+ # other_int8_array = Arrow::Int8Array.new([2, 3, 4])
198
+ # other_array = int32_array.resolve(other_int32_array)
199
+ # other_array #=> Arrow::Int32Array.new([2, 3, 4])
200
+ #
201
+ # @since 4.0.0
202
+ def resolve(other_array)
203
+ if other_array.is_a?(::Array)
204
+ builder_class = self.class.builder_class
205
+ if builder_class.nil?
206
+ message =
207
+ "[array][resolve] can't build #{value_data_type} array " +
208
+ "from raw Ruby Array"
209
+ raise ArgumentError, message
210
+ end
211
+ if builder_class.buildable?([other_array])
212
+ other_array = builder_class.build(other_array)
213
+ elsif builder_class.buildable?([value_data_type, other_array])
214
+ other_array = builder_class.build(value_data_type, other_array)
215
+ else
216
+ message =
217
+ "[array][resolve] need to implement " +
218
+ "a feature that building #{value_data_type} array " +
219
+ "from raw Ruby Array"
220
+ raise NotImpelemented, message
221
+ end
222
+ other_array
223
+ elsif other_array.respond_to?(:value_data_type)
224
+ return other_array if value_data_type == other_array.value_data_type
225
+ other_array.cast(value_data_type)
226
+ else
227
+ message =
228
+ "[array][resolve] can't build #{value_data_type} array: " +
229
+ "#{other_array.inspect}"
230
+ raise ArgumentError, message
231
+ end
232
+ end
103
233
  end
104
234
  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 BinaryDictionaryArrayBuilder
20
+ include SymbolValuesAppendable
21
+
22
+ private
23
+ def create_values_array_builder
24
+ BinaryArrayBuilder.new
25
+ end
26
+ end
27
+ end
data/lib/arrow/buffer.rb CHANGED
@@ -17,12 +17,16 @@
17
17
 
18
18
  module Arrow
19
19
  class Buffer
20
- alias_method :initialize_raw, :initialize
21
- private :initialize_raw
22
-
23
- def initialize(data)
24
- @data = data
25
- initialize_raw(data)
20
+ class << self
21
+ # @api private
22
+ def try_convert(value)
23
+ case value
24
+ when String
25
+ new(value)
26
+ else
27
+ nil
28
+ end
29
+ end
26
30
  end
27
31
  end
28
32
  end
@@ -27,6 +27,17 @@ module Arrow
27
27
  columns.each(&block)
28
28
  end
29
29
 
30
+ # @overload [](name)
31
+ # Find a column that has the given name.
32
+ #
33
+ # @param name [String, Symbol] The column name to be found.
34
+ # @return [Column] The found column.
35
+ #
36
+ # @overload [](index)
37
+ # Find the `index`-th column.
38
+ #
39
+ # @param index [Integer] The index to be found.
40
+ # @return [Column] The found column.
30
41
  def find_column(name_or_index)
31
42
  case name_or_index
32
43
  when String, Symbol
@@ -40,9 +51,97 @@ module Arrow
40
51
  return nil if index < 0 or index >= n_columns
41
52
  Column.new(self, index)
42
53
  else
43
- message = "column name or index must be String, Symbol or Integer"
54
+ message = "column name or index must be String, Symbol or Integer: "
55
+ message << name_or_index.inspect
44
56
  raise ArgumentError, message
45
57
  end
46
58
  end
59
+
60
+ # Selects columns that are selected by `selectors` and/or `block`
61
+ # and creates a new container only with the selected columns.
62
+ #
63
+ # @param selectors [Array<String, Symbol, Integer, Range>]
64
+ # If a selector is `String`, `Symbol` or `Integer`, the selector
65
+ # selects a column by {#find_column}.
66
+ #
67
+ # If a selector is `Range`, the selector selects columns by `::Array#[]`.
68
+ # @yield [column] Gives a column to the block to select columns.
69
+ # This uses `::Array#select`.
70
+ # @yieldparam column [Column] A target column.
71
+ # @yieldreturn [Boolean] Whether the given column is selected or not.
72
+ # @return [self.class] The newly created container that only has selected
73
+ # columns.
74
+ def select_columns(*selectors, &block)
75
+ if selectors.empty?
76
+ return to_enum(__method__) unless block_given?
77
+ selected_columns = columns.select(&block)
78
+ else
79
+ selected_columns = []
80
+ selectors.each do |selector|
81
+ case selector
82
+ when Range
83
+ selected_columns.concat(columns[selector])
84
+ else
85
+ column = find_column(selector)
86
+ if column.nil?
87
+ case selector
88
+ when String, Symbol
89
+ message = "unknown column: #{selector.inspect}: #{inspect}"
90
+ raise KeyError.new(message)
91
+ else
92
+ message = "out of index (0..#{n_columns - 1}): "
93
+ message << "#{selector.inspect}: #{inspect}"
94
+ raise IndexError.new(message)
95
+ end
96
+ end
97
+ selected_columns << column
98
+ end
99
+ end
100
+ selected_columns = selected_columns.select(&block) if block_given?
101
+ end
102
+ self.class.new(selected_columns)
103
+ end
104
+
105
+ # @overload [](name)
106
+ # Find a column that has the given name.
107
+ #
108
+ # @param name [String, Symbol] The column name to be found.
109
+ # @return [Column] The found column.
110
+ # @see #find_column
111
+ #
112
+ # @overload [](index)
113
+ # Find the `index`-th column.
114
+ #
115
+ # @param index [Integer] The index to be found.
116
+ # @return [Column] The found column.
117
+ # @see #find_column
118
+ #
119
+ # @overload [](range)
120
+ # Selects columns that are in `range` and creates a new container
121
+ # only with the selected columns.
122
+ #
123
+ # @param range [Range] The range to be selected.
124
+ # @return [self.class] The newly created container that only has selected
125
+ # columns.
126
+ # @see #select_columns
127
+ #
128
+ # @overload [](selectors)
129
+ # Selects columns that are selected by `selectors` and creates a
130
+ # new container only with the selected columns.
131
+ #
132
+ # @param selectors [Array] The selectors that are used to select columns.
133
+ # @return [self.class] The newly created container that only has selected
134
+ # columns.
135
+ # @see #select_columns
136
+ def [](selector)
137
+ case selector
138
+ when ::Array
139
+ select_columns(*selector)
140
+ when Range
141
+ select_columns(selector)
142
+ else
143
+ find_column(selector)
144
+ end
145
+ end
47
146
  end
48
147
  end
@@ -0,0 +1,25 @@
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 ConstructorArgumentsGCGuardable
20
+ def initialize(*args)
21
+ super
22
+ @arguments = args
23
+ end
24
+ end
25
+ end
@@ -18,7 +18,7 @@
18
18
  module Arrow
19
19
  class DataType
20
20
  class << self
21
- # Creates a new suitable {Arrow::DataType}.
21
+ # Ensure returning suitable {Arrow::DataType}.
22
22
  #
23
23
  # @overload resolve(data_type)
24
24
  #
@@ -31,17 +31,21 @@ module Arrow
31
31
  #
32
32
  # @overload resolve(name)
33
33
  #
34
- # Creates a suitable data type from type name. For example,
35
- # you can create {Arrow::BooleanDataType} from `:boolean`.
34
+ # Creates a suitable data type from the given type name. For
35
+ # example, you can create {Arrow::BooleanDataType} from
36
+ # `:boolean`.
36
37
  #
37
38
  # @param name [String, Symbol] The type name of the data type.
38
39
  #
40
+ # @return [Arrow::DataType] A new suitable data type.
41
+ #
39
42
  # @example Create a boolean data type
40
43
  # Arrow::DataType.resolve(:boolean)
41
44
  #
42
45
  # @overload resolve(name_with_arguments)
43
46
  #
44
- # Creates a suitable data type from type name with arguments.
47
+ # Creates a new suitable data type from the given type name
48
+ # with arguments.
45
49
  #
46
50
  # @param name_with_arguments [::Array<String, ...>]
47
51
  # The type name of the data type as the first element.
@@ -51,6 +55,8 @@ module Arrow
51
55
  # For example, {Arrow::TimestampDataType} needs unit as
52
56
  # additional information.
53
57
  #
58
+ # @return [Arrow::DataType] A new suitable data type.
59
+ #
54
60
  # @example Create a boolean data type
55
61
  # Arrow::DataType.resolve([:boolean])
56
62
  #
@@ -59,7 +65,8 @@ module Arrow
59
65
  #
60
66
  # @overload resolve(description)
61
67
  #
62
- # Creates a suitable data type from data type description.
68
+ # Creates a new suitable data type from the given data type
69
+ # description.
63
70
  #
64
71
  # Data type description is a raw `Hash`. Data type description
65
72
  # must have `:type` value. `:type` is the type of the data type.
@@ -74,6 +81,8 @@ module Arrow
74
81
  # @option description [String, Symbol] :type The type name of
75
82
  # the data type.
76
83
  #
84
+ # @return [Arrow::DataType] A new suitable data type.
85
+ #
77
86
  # @example Create a boolean data type
78
87
  # Arrow::DataType.resolve(type: :boolean)
79
88
  #
@@ -0,0 +1,100 @@
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 Datum
20
+ class << self
21
+ # @api private
22
+ def try_convert(value)
23
+ case value
24
+ when Table
25
+ TableDatum.new(value)
26
+ when Array
27
+ ArrayDatum.new(value)
28
+ when ChunkedArray
29
+ ChunkedArrayDatum.new(value)
30
+ when Scalar
31
+ ScalarDatum.new(value)
32
+ when ::Array
33
+ ArrayDatum.new(ArrayBuilder.build(value))
34
+ when Integer
35
+ case value
36
+ when (0..((2 ** 8) - 1))
37
+ try_convert(UInt8Scalar.new(value))
38
+ when ((-(2 ** 7))..((2 ** 7) - 1))
39
+ try_convert(Int8Scalar.new(value))
40
+ when (0..((2 ** 16) - 1))
41
+ try_convert(UInt16Scalar.new(value))
42
+ when ((-(2 ** 15))..((2 ** 15) - 1))
43
+ try_convert(Int16Scalar.new(value))
44
+ when (0..((2 ** 32) - 1))
45
+ try_convert(UInt32Scalar.new(value))
46
+ when ((-(2 ** 31))..((2 ** 31) - 1))
47
+ try_convert(Int32Scalar.new(value))
48
+ when (0..((2 ** 64) - 1))
49
+ try_convert(UInt64Scalar.new(value))
50
+ when ((-(2 ** 63))..((2 ** 63) - 1))
51
+ try_convert(Int64Scalar.new(value))
52
+ else
53
+ nil
54
+ end
55
+ when Float
56
+ try_convert(DoubleScalar.new(value))
57
+ when true, false
58
+ try_convert(BooleanScalar.new(value))
59
+ when String
60
+ if value.ascii_only? or value.encoding == Encoding::UTF_8
61
+ if value.bytesize <= ((2 ** 31) - 1)
62
+ try_convert(StringScalar.new(value))
63
+ else
64
+ try_convert(LargeStringScalar.new(value))
65
+ end
66
+ else
67
+ if value.bytesize <= ((2 ** 31) - 1)
68
+ try_convert(BinaryScalar.new(value))
69
+ else
70
+ try_convert(LargeBinaryScalar.new(value))
71
+ end
72
+ end
73
+ when Date
74
+ date32_value = (value - Date32ArrayBuilder::UNIX_EPOCH).to_i
75
+ try_convert(Date32Scalar.new(date32_value))
76
+ when Time
77
+ case value.unit
78
+ when TimeUnit::SECOND, TimeUnit::MILLI
79
+ data_type = Time32DataType.new(value.unit)
80
+ scalar_class = Time32Scalar
81
+ else
82
+ data_type = Time64DataType.new(value.unit)
83
+ scalar_class = Time64Scalar
84
+ end
85
+ try_convert(scalar_class.new(data_type, value.value))
86
+ when ::Time
87
+ data_type = TimestampDataType.new(:nano)
88
+ timestamp_value = value.to_i * 1_000_000_000 + value.nsec
89
+ try_convert(TimestampScalar.new(data_type, timestamp_value))
90
+ when Decimal128
91
+ data_type = TimestampDataType.new(:nano)
92
+ timestamp_value = value.to_i * 1_000_000_000 + value.nsec
93
+ try_convert(Decimal128Scalar.new(data_type, timestamp_value))
94
+ else
95
+ nil
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -33,7 +33,7 @@ module Arrow
33
33
  # @param type_codes [::Array<Integer>] The IDs that indicates
34
34
  # corresponding fields.
35
35
  #
36
- # @example Create a dense union data type for {2: visible, 9: count}
36
+ # @example Create a dense union data type for `{2: visible, 9: count}`
37
37
  # fields = [
38
38
  # Arrow::Field.new("visible", :boolean),
39
39
  # {
@@ -57,7 +57,7 @@ module Arrow
57
57
  # @option description [::Array<Integer>] :type_codes The IDs
58
58
  # that indicates corresponding fields.
59
59
  #
60
- # @example Create a dense union data type for {2: visible, 9: count}
60
+ # @example Create a dense union data type for `{2: visible, 9: count}`
61
61
  # fields = [
62
62
  # Arrow::Field.new("visible", :boolean),
63
63
  # {
@@ -50,7 +50,7 @@ module Arrow
50
50
  # @param ordered [Boolean] Whether dictionary contents are
51
51
  # ordered or not.
52
52
  #
53
- # @example Create a dictionary data type for {0: "Hello", 1: "World"}
53
+ # @example Create a dictionary data type for `{0: "Hello", 1: "World"}`
54
54
  # index_data_type = :int8
55
55
  # value_data_type = :string
56
56
  # ordered = true
@@ -91,7 +91,7 @@ module Arrow
91
91
  # @option description [Boolean] :ordered Whether dictionary
92
92
  # contents are ordered or not.
93
93
  #
94
- # @example Create a dictionary data type for {0: "Hello", 1: "World"}
94
+ # @example Create a dictionary data type for `{0: "Hello", 1: "World"}`
95
95
  # Arrow::DictionaryDataType.new(index_data_type: :int8,
96
96
  # value_data_type: :string,
97
97
  # ordered: true)
@@ -0,0 +1,38 @@
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 EqualOptions
20
+ class << self
21
+ # @api private
22
+ def try_convert(value)
23
+ case value
24
+ when Hash
25
+ options = new
26
+ value.each do |k, v|
27
+ setter = :"#{k}="
28
+ return unless options.respond_to?(setter)
29
+ options.__send__(setter, v)
30
+ end
31
+ options
32
+ else
33
+ nil
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,48 @@
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 Expression
20
+ class << self
21
+ # @api private
22
+ def try_convert(value)
23
+ case value
24
+ when Symbol
25
+ FieldExpression.new(value.to_s)
26
+ when ::Array
27
+ function_name, *arguments = value
28
+ case function_name
29
+ when String, Symbol
30
+ function_name = function_name.to_s
31
+ else
32
+ return nil
33
+ end
34
+ if arguments.last.is_a?(FunctionOptions)
35
+ options = arguments.pop
36
+ else
37
+ options = nil
38
+ end
39
+ CallExpression.new(function_name, arguments, options)
40
+ else
41
+ datum = Datum.try_convert(value)
42
+ return nil if datum.nil?
43
+ LiteralExpression.new(datum)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end