red-arrow 5.0.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -0
  3. data/ext/arrow/converters.cpp +5 -0
  4. data/ext/arrow/converters.hpp +126 -0
  5. data/ext/arrow/extconf.rb +13 -0
  6. data/ext/arrow/raw-records.cpp +1 -0
  7. data/ext/arrow/values.cpp +1 -0
  8. data/lib/arrow/aggregate-node-options.rb +35 -0
  9. data/lib/arrow/aggregation.rb +46 -0
  10. data/lib/arrow/array-builder.rb +5 -0
  11. data/lib/arrow/binary-dictionary-array-builder.rb +27 -0
  12. data/lib/arrow/column-containable.rb +100 -1
  13. data/lib/arrow/datum.rb +2 -0
  14. data/lib/arrow/expression.rb +48 -0
  15. data/lib/arrow/file-system.rb +34 -0
  16. data/lib/arrow/group.rb +116 -124
  17. data/lib/arrow/loader.rb +13 -0
  18. data/lib/arrow/map-array-builder.rb +109 -0
  19. data/lib/arrow/map-array.rb +26 -0
  20. data/lib/arrow/map-data-type.rb +89 -0
  21. data/lib/arrow/path-extension.rb +1 -1
  22. data/lib/arrow/record-batch-reader.rb +41 -0
  23. data/lib/arrow/record-batch.rb +0 -2
  24. data/lib/arrow/slicer.rb +44 -143
  25. data/lib/arrow/source-node-options.rb +32 -0
  26. data/lib/arrow/string-dictionary-array-builder.rb +27 -0
  27. data/lib/arrow/symbol-values-appendable.rb +34 -0
  28. data/lib/arrow/table-concatenate-options.rb +36 -0
  29. data/lib/arrow/table-formatter.rb +141 -17
  30. data/lib/arrow/table-list-formatter.rb +5 -3
  31. data/lib/arrow/table-loader.rb +41 -3
  32. data/lib/arrow/table-saver.rb +29 -3
  33. data/lib/arrow/table-table-formatter.rb +7 -31
  34. data/lib/arrow/table.rb +32 -38
  35. data/lib/arrow/version.rb +1 -1
  36. data/red-arrow.gemspec +1 -1
  37. data/test/raw-records/test-dense-union-array.rb +14 -0
  38. data/test/raw-records/test-list-array.rb +19 -0
  39. data/test/raw-records/test-map-array.rb +441 -0
  40. data/test/raw-records/test-sparse-union-array.rb +14 -0
  41. data/test/raw-records/test-struct-array.rb +15 -0
  42. data/test/test-array-builder.rb +7 -0
  43. data/test/test-binary-dictionary-array-builder.rb +103 -0
  44. data/test/test-csv-loader.rb +8 -8
  45. data/test/test-expression.rb +40 -0
  46. data/test/test-group.rb +75 -51
  47. data/test/test-map-array-builder.rb +110 -0
  48. data/test/test-map-array.rb +33 -0
  49. data/test/test-map-data-type.rb +36 -0
  50. data/test/test-record-batch-reader.rb +46 -0
  51. data/test/test-record-batch.rb +42 -0
  52. data/test/test-slicer.rb +166 -167
  53. data/test/test-string-dictionary-array-builder.rb +103 -0
  54. data/test/test-table.rb +190 -53
  55. data/test/values/test-dense-union-array.rb +14 -0
  56. data/test/values/test-list-array.rb +17 -0
  57. data/test/values/test-map-array.rb +433 -0
  58. data/test/values/test-sparse-union-array.rb +14 -0
  59. data/test/values/test-struct-array.rb +15 -0
  60. metadata +107 -76
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dcc31d7ec789dfa277963fda5b3710e7eec2451b6fbe425282638e48e684b95f
4
- data.tar.gz: 00bfbf2e0357861f7247c42c4faae6a72d9adfca745ad1b3298f549997847158
3
+ metadata.gz: c553e573f87398da7d492e8339684bb86b73d1fff02b56cff3277bb87d96a4cd
4
+ data.tar.gz: 9b97be2878369da0bed9ac8621330926b8a95144d833de6798858a210f88c92a
5
5
  SHA512:
6
- metadata.gz: 8e60e9a4ce4d379f7f1d9387154ae4d9fe4ec91ffe304647966d33d52e380950cc0a8a5f025164466526feb5198638139bb7564f2066fd93b7c21dcd697e07ca
7
- data.tar.gz: 140a8f087eeb42baae703eee677c97261c6b30317c0f72ce49231a117b2e32f34175bad71f913bdd6f940abd8097c77f968b27780cecbfca062be60ac87d09ec
6
+ metadata.gz: 0bc3526645457a551e25621ba3efaa52a3ad7398e8216c34440651beab58886ec8b52804b7afe227f953b727871980a2ac9a9b1153776499b48cd790ae476304
7
+ data.tar.gz: 9f3032d5a54a9b0b911edd273916ce68f140c50753d13cb88b950166ea771138f432d738a3a694f44bfff985fcf8329457e97712dca10a7f8a8430d3d8cb82f6
data/README.md CHANGED
@@ -50,3 +50,26 @@ table = Arrow::Table.load("/dev/shm/data.arrow")
50
50
  # Process data in table
51
51
  table.save("/dev/shm/data-processed.arrow")
52
52
  ```
53
+
54
+ ## Development
55
+
56
+ Note that you need to install Apache Arrow C++/GLib at master before preparing Red Arrow. See also:
57
+
58
+ * For Apache Arrow C++: https://arrow.apache.org/docs/developers/cpp/building.html
59
+ * For Apache Arrow GLib: https://github.com/apache/arrow/blob/master/c_glib/README.md
60
+
61
+ ```console
62
+ $ cd ruby/red-arrow
63
+ $ bundle install
64
+ $ bundle exec rake test
65
+ ```
66
+
67
+ ### For macOS with Homebrew
68
+
69
+ ```console
70
+ $ cd ruby/red-arrow
71
+ $ bundle install
72
+ $ brew install apache-arrow --head
73
+ $ brew install apache-arrow-glib --head
74
+ $ bundle exec rake test
75
+ ```
@@ -30,6 +30,11 @@ namespace red_arrow {
30
30
  return struct_array_value_converter_->convert(array, i);
31
31
  }
32
32
 
33
+ VALUE ArrayValueConverter::convert(const arrow::MapArray& array,
34
+ const int64_t i) {
35
+ return map_array_value_converter_->convert(array, i);
36
+ }
37
+
33
38
  VALUE ArrayValueConverter::convert(const arrow::UnionArray& array,
34
39
  const int64_t i) {
35
40
  return union_array_value_converter_->convert(array, i);
@@ -29,6 +29,7 @@
29
29
  namespace red_arrow {
30
30
  class ListArrayValueConverter;
31
31
  class StructArrayValueConverter;
32
+ class MapArrayValueConverter;
32
33
  class UnionArrayValueConverter;
33
34
  class DictionaryArrayValueConverter;
34
35
 
@@ -38,16 +39,19 @@ namespace red_arrow {
38
39
  : decimal_buffer_(),
39
40
  list_array_value_converter_(nullptr),
40
41
  struct_array_value_converter_(nullptr),
42
+ map_array_value_converter_(nullptr),
41
43
  union_array_value_converter_(nullptr),
42
44
  dictionary_array_value_converter_(nullptr) {
43
45
  }
44
46
 
45
47
  inline void set_sub_value_converters(ListArrayValueConverter* list_array_value_converter,
46
48
  StructArrayValueConverter* struct_array_value_converter,
49
+ MapArrayValueConverter* map_array_value_converter,
47
50
  UnionArrayValueConverter* union_array_value_converter,
48
51
  DictionaryArrayValueConverter* dictionary_array_value_converter) {
49
52
  list_array_value_converter_ = list_array_value_converter;
50
53
  struct_array_value_converter_ = struct_array_value_converter;
54
+ map_array_value_converter_ = map_array_value_converter;
51
55
  union_array_value_converter_ = union_array_value_converter;
52
56
  dictionary_array_value_converter_ = dictionary_array_value_converter;
53
57
  }
@@ -204,6 +208,9 @@ namespace red_arrow {
204
208
  VALUE convert(const arrow::StructArray& array,
205
209
  const int64_t i);
206
210
 
211
+ VALUE convert(const arrow::MapArray& array,
212
+ const int64_t i);
213
+
207
214
  VALUE convert(const arrow::UnionArray& array,
208
215
  const int64_t i);
209
216
 
@@ -234,6 +241,7 @@ namespace red_arrow {
234
241
  std::string decimal_buffer_;
235
242
  ListArrayValueConverter* list_array_value_converter_;
236
243
  StructArrayValueConverter* struct_array_value_converter_;
244
+ MapArrayValueConverter* map_array_value_converter_;
237
245
  UnionArrayValueConverter* union_array_value_converter_;
238
246
  DictionaryArrayValueConverter* dictionary_array_value_converter_;
239
247
  };
@@ -294,6 +302,7 @@ namespace red_arrow {
294
302
  // VISIT(Interval)
295
303
  VISIT(List)
296
304
  VISIT(Struct)
305
+ VISIT(Map)
297
306
  VISIT(SparseUnion)
298
307
  VISIT(DenseUnion)
299
308
  VISIT(Dictionary)
@@ -399,6 +408,7 @@ namespace red_arrow {
399
408
  // VISIT(Interval)
400
409
  VISIT(List)
401
410
  VISIT(Struct)
411
+ VISIT(Map)
402
412
  VISIT(SparseUnion)
403
413
  VISIT(DenseUnion)
404
414
  VISIT(Dictionary)
@@ -431,6 +441,117 @@ namespace red_arrow {
431
441
  VALUE result_;
432
442
  };
433
443
 
444
+ class MapArrayValueConverter : public arrow::ArrayVisitor {
445
+ public:
446
+ explicit MapArrayValueConverter(ArrayValueConverter* converter)
447
+ : array_value_converter_(converter),
448
+ offset_(0),
449
+ length_(0),
450
+ values_(Qnil) {}
451
+
452
+ VALUE convert(const arrow::MapArray& array,
453
+ const int64_t index) {
454
+ auto key_array = array.keys().get();
455
+ auto item_array = array.items().get();
456
+ auto offset_keep = offset_;
457
+ auto length_keep = length_;
458
+ auto values_keep = values_;
459
+ offset_ = array.value_offset(index);
460
+ length_ = array.value_length(index);
461
+ auto keys = rb_ary_new_capa(length_);
462
+ values_ = keys;
463
+ check_status(key_array->Accept(this),
464
+ "[raw-records][map-array][keys]");
465
+ auto items = rb_ary_new_capa(length_);
466
+ values_ = items;
467
+ check_status(item_array->Accept(this),
468
+ "[raw-records][map-array][items]");
469
+ auto map = rb_hash_new();
470
+ auto n = RARRAY_LEN(keys);
471
+ auto raw_keys = RARRAY_CONST_PTR(keys);
472
+ auto raw_items = RARRAY_CONST_PTR(items);
473
+ for (long i = 0; i < n; ++i) {
474
+ rb_hash_aset(map, raw_keys[i], raw_items[i]);
475
+ }
476
+ offset_ = offset_keep;
477
+ length_ = length_keep;
478
+ values_ = values_keep;
479
+ return map;
480
+ }
481
+
482
+ #define VISIT(TYPE) \
483
+ arrow::Status Visit(const arrow::TYPE ## Array& array) override { \
484
+ return visit_value(array); \
485
+ }
486
+
487
+ VISIT(Null)
488
+ VISIT(Boolean)
489
+ VISIT(Int8)
490
+ VISIT(Int16)
491
+ VISIT(Int32)
492
+ VISIT(Int64)
493
+ VISIT(UInt8)
494
+ VISIT(UInt16)
495
+ VISIT(UInt32)
496
+ VISIT(UInt64)
497
+ // TODO
498
+ // VISIT(HalfFloat)
499
+ VISIT(Float)
500
+ VISIT(Double)
501
+ VISIT(Binary)
502
+ VISIT(String)
503
+ VISIT(FixedSizeBinary)
504
+ VISIT(Date32)
505
+ VISIT(Date64)
506
+ VISIT(Time32)
507
+ VISIT(Time64)
508
+ VISIT(Timestamp)
509
+ // TODO
510
+ // VISIT(Interval)
511
+ VISIT(List)
512
+ VISIT(Struct)
513
+ VISIT(Map)
514
+ VISIT(SparseUnion)
515
+ VISIT(DenseUnion)
516
+ VISIT(Dictionary)
517
+ VISIT(Decimal128)
518
+ VISIT(Decimal256)
519
+ // TODO
520
+ // VISIT(Extension)
521
+
522
+ #undef VISIT
523
+
524
+ private:
525
+ template <typename ArrayType>
526
+ inline VALUE convert_value(const ArrayType& array,
527
+ const int64_t i) {
528
+ return array_value_converter_->convert(array, i);
529
+ }
530
+
531
+ template <typename ArrayType>
532
+ arrow::Status visit_value(const ArrayType& array) {
533
+ if (array.null_count() > 0) {
534
+ for (int64_t i = 0; i < length_; ++i) {
535
+ auto value = Qnil;
536
+ if (!array.IsNull(i + offset_)) {
537
+ value = convert_value(array, i + offset_);
538
+ }
539
+ rb_ary_push(values_, value);
540
+ }
541
+ } else {
542
+ for (int64_t i = 0; i < length_; ++i) {
543
+ rb_ary_push(values_, convert_value(array, i + offset_));
544
+ }
545
+ }
546
+ return arrow::Status::OK();
547
+ }
548
+
549
+ ArrayValueConverter* array_value_converter_;
550
+ int32_t offset_;
551
+ int32_t length_;
552
+ VALUE values_;
553
+ };
554
+
434
555
  class UnionArrayValueConverter : public arrow::ArrayVisitor {
435
556
  public:
436
557
  explicit UnionArrayValueConverter(ArrayValueConverter* converter)
@@ -492,6 +613,7 @@ namespace red_arrow {
492
613
  // VISIT(Interval)
493
614
  VISIT(List)
494
615
  VISIT(Struct)
616
+ VISIT(Map)
495
617
  VISIT(SparseUnion)
496
618
  VISIT(DenseUnion)
497
619
  VISIT(Dictionary)
@@ -617,6 +739,7 @@ namespace red_arrow {
617
739
  // VISIT(Interval)
618
740
  VISIT(List)
619
741
  VISIT(Struct)
742
+ VISIT(Map)
620
743
  VISIT(SparseUnion)
621
744
  VISIT(DenseUnion)
622
745
  VISIT(Dictionary)
@@ -645,11 +768,13 @@ namespace red_arrow {
645
768
  : array_value_converter_(),
646
769
  list_array_value_converter_(&array_value_converter_),
647
770
  struct_array_value_converter_(&array_value_converter_),
771
+ map_array_value_converter_(&array_value_converter_),
648
772
  union_array_value_converter_(&array_value_converter_),
649
773
  dictionary_array_value_converter_(&array_value_converter_) {
650
774
  array_value_converter_.
651
775
  set_sub_value_converters(&list_array_value_converter_,
652
776
  &struct_array_value_converter_,
777
+ &map_array_value_converter_,
653
778
  &union_array_value_converter_,
654
779
  &dictionary_array_value_converter_);
655
780
  }
@@ -663,6 +788,7 @@ namespace red_arrow {
663
788
  ArrayValueConverter array_value_converter_;
664
789
  ListArrayValueConverter list_array_value_converter_;
665
790
  StructArrayValueConverter struct_array_value_converter_;
791
+ MapArrayValueConverter map_array_value_converter_;
666
792
  UnionArrayValueConverter union_array_value_converter_;
667
793
  DictionaryArrayValueConverter dictionary_array_value_converter_;
668
794
  };
data/ext/arrow/extconf.rb CHANGED
@@ -25,6 +25,19 @@ if arrow_pkg_config_path
25
25
  ENV["PKG_CONFIG_PATH"] = pkg_config_paths.join(File::PATH_SEPARATOR)
26
26
  end
27
27
 
28
+ checking_for(checking_message("Homebrew")) do
29
+ platform = NativePackageInstaller::Platform.detect
30
+ if platform.is_a?(NativePackageInstaller::Platform::Homebrew)
31
+ openssl_prefix = `brew --prefix openssl@1.1`.chomp
32
+ unless openssl_prefix.empty?
33
+ PKGConfig.add_path("#{openssl_prefix}/lib/pkgconfig")
34
+ end
35
+ true
36
+ else
37
+ false
38
+ end
39
+ end
40
+
28
41
  unless required_pkg_config_package([
29
42
  "arrow",
30
43
  Arrow::Version::MAJOR,
@@ -100,6 +100,7 @@ namespace red_arrow {
100
100
  // VISIT(Interval)
101
101
  VISIT(List)
102
102
  VISIT(Struct)
103
+ VISIT(Map)
103
104
  VISIT(SparseUnion)
104
105
  VISIT(DenseUnion)
105
106
  VISIT(Dictionary)
data/ext/arrow/values.cpp CHANGED
@@ -81,6 +81,7 @@ namespace red_arrow {
81
81
  // VISIT(Interval)
82
82
  VISIT(List)
83
83
  VISIT(Struct)
84
+ VISIT(Map)
84
85
  VISIT(SparseUnion)
85
86
  VISIT(DenseUnion)
86
87
  VISIT(Dictionary)
@@ -0,0 +1,35 @@
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 AggregateNodeOptions
20
+ class << self
21
+ # @api private
22
+ def try_convert(value)
23
+ case value
24
+ when Hash
25
+ aggregations = value[:aggregations]
26
+ return nil if aggregations.nil?
27
+ keys = value[:keys]
28
+ new(aggregations, keys)
29
+ else
30
+ nil
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -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,
@@ -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
@@ -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
data/lib/arrow/datum.rb CHANGED
@@ -21,6 +21,8 @@ module Arrow
21
21
  # @api private
22
22
  def try_convert(value)
23
23
  case value
24
+ when Table
25
+ TableDatum.new(value)
24
26
  when Array
25
27
  ArrayDatum.new(value)
26
28
  when ChunkedArray
@@ -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
@@ -0,0 +1,34 @@
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 FileSystem
20
+ alias_method :open_output_stream_raw, :open_output_stream
21
+ def open_output_stream(path)
22
+ stream = open_output_stream_raw(path)
23
+ if block_given?
24
+ begin
25
+ yield(stream)
26
+ ensure
27
+ stream.close
28
+ end
29
+ else
30
+ stream
31
+ end
32
+ end
33
+ end
34
+ end