red-gandiva 0.15.1 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f416fcc98a45f270d3da1768e01ff1ab06d4fc6da43101397f453583f46a77e3
4
- data.tar.gz: e436a03e8520097f0a60ddbea9d99c3f98b604010c7b55feecd72b76e0e951b6
3
+ metadata.gz: 7d0162ea6bd0a7ec7c35fff0d19cd071b2f5090ea1962d634e7077f09b5a335b
4
+ data.tar.gz: 1fd3fb46dc4804053d8a303d2a2849dea6475720220064303f60ca43a9b52551
5
5
  SHA512:
6
- metadata.gz: ff3b4b0d77701034d8667410eafd0b652cd8de6176a2e16b946d17d716e5677aafe163bda6b52429c91550d8976368b0e0cb38b9b65f504e604c8d2acaef5e74
7
- data.tar.gz: 5e48f6227728211cd21c2b6b67bacf243fed07648b2093cda2a66fe383c89fc5e88bf0dcd2966f2878ce71668474ea4238687e4e59931882cd99485e34a6e2fd
6
+ metadata.gz: a4ef5fa824e20f2ee4fd9918854aeb8c7cb9df47c84e6b90108509305ef21c58c0a1d6477025ebd38f0f971ca7fa9c887bf78dd115e0bfb6c58b6fed4bc29d0a
7
+ data.tar.gz: 652526b57edff7c5d20b1aa2545afcf9b42ac0801a06f000565f661ea893092fc018c79ddc5362c7db604f0c64ee622f466c8949fedefb7d89640a48fa86dd01
data/README.md CHANGED
@@ -46,18 +46,23 @@ Install Red Gandiva after you install Gandiva GLib:
46
46
  ```ruby
47
47
  require "gandiva"
48
48
 
49
- field1 = Arrow::Field.new("field1", Arrow::Int32DataType.new)
50
- field2 = Arrow::Field.new("field2", Arrow::Int32DataType.new)
51
- schema = Arrow::Schema.new([field1, field2])
52
- add_result = Arrow::Field.new("add_result", Arrow::Int32DataType.new)
53
- subtract_result = Arrow::Field.new("subtract_result", Arrow::Int32DataType.new)
54
- add_expression = Gandiva::Expression.new("add", [field1, field2], add_result)
55
- subtract_expression = Gandiva::Expression.new("subtract", [field1, field2], subtract_result)
56
- projector = Gandiva::Projector.new(schema, [add_expression, subtract_expression])
57
- input_arrays = [
58
- Arrow::Int32Array.new([1, 2, 3, 4]),
59
- Arrow::Int32Array.new([11, 13, 15, 17]),
60
- ]
61
- record_batch = Arrow::RecordBatch.new(schema, 4, input_arrays)
62
- output_arrays = projector.evaluate(record_batch)
49
+ table = Arrow::Table.new(:field1 => Arrow::Int32Array.new([1, 2, 3, 4]),
50
+ :field2 => Arrow::Int32Array.new([11, 13, 15, 17]))
51
+ schema = table.schema
52
+
53
+ expression1 = schema.build_expression do |record|
54
+ record.field1 + record.field2
55
+ end
56
+
57
+ expression2 = schema.build_expression do |record, context|
58
+ context.if(record.field1 > record.field2)
59
+ .then(record.field1 / record.field2)
60
+ .else(record.field1)
61
+ end
62
+
63
+ projector = Gandiva::Projector.new(schema, [expression1, expression2])
64
+ table.each_record_batch do |record_batch|
65
+ outputs = projector.evaluate(record_batch)
66
+ puts outputs.collect(&:values))
67
+ end
63
68
  ```
data/Rakefile CHANGED
@@ -30,10 +30,12 @@ release_task.prerequisites.replace(["build", "release:rubygem_push"])
30
30
 
31
31
  desc "Run tests"
32
32
  task :test do
33
- cd("dependency-check") do
34
- ruby("-S", "rake")
33
+ cd(base_dir) do
34
+ cd("dependency-check") do
35
+ ruby("-S", "rake")
36
+ end
37
+ ruby("test/run-test.rb")
35
38
  end
36
- ruby("test/run-test.rb")
37
39
  end
38
40
 
39
41
  task default: :test
@@ -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
+ class Schema
20
+ def build_expression(&block)
21
+ builder = Gandiva::ExpressionBuilder.new(self)
22
+ builder.build(&block)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,45 @@
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 Gandiva
19
+ class ExpressionBuilder
20
+ def initialize(schema)
21
+ @schema = schema
22
+ end
23
+
24
+ def build
25
+ builder = yield(Record.new(@schema), Context.new)
26
+ node = builder.build
27
+ Expression.new(node,
28
+ Arrow::Field.new("result", node.return_type))
29
+ end
30
+ end
31
+ end
32
+
33
+ require "gandiva/expression-builder/add"
34
+ require "gandiva/expression-builder/context"
35
+ require "gandiva/expression-builder/divide"
36
+ require "gandiva/expression-builder/elsif"
37
+ require "gandiva/expression-builder/equal"
38
+ require "gandiva/expression-builder/field"
39
+ require "gandiva/expression-builder/greater-than"
40
+ require "gandiva/expression-builder/if"
41
+ require "gandiva/expression-builder/literal"
42
+ require "gandiva/expression-builder/less-than"
43
+ require "gandiva/expression-builder/multiply"
44
+ require "gandiva/expression-builder/record"
45
+ require "gandiva/expression-builder/subtract"
@@ -0,0 +1,40 @@
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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Add < BinaryOperation
23
+ def initialize(left, right)
24
+ super("add", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ # TODO: More clever implementation. e.g. (int64, float) -> float
30
+ left_return_type = left_node.return_type
31
+ right_return_type = right_node.return_type
32
+ if left_return_type.bit_width > right_return_type.bit_width
33
+ left_return_type
34
+ else
35
+ right_return_type
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -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
+ require "gandiva/expression-builder/value"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class BinaryOperation < Value
23
+ def initialize(operator, left, right)
24
+ @operator = operator
25
+ @left = left
26
+ @right = right
27
+ end
28
+
29
+ def build
30
+ left_node = @left.build
31
+ right_node = @right.build
32
+ FunctionNode.new(@operator,
33
+ [left_node, right_node],
34
+ return_type(left_node, right_node))
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,26 @@
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 Gandiva
19
+ class ExpressionBuilder
20
+ class Context
21
+ def if(condition)
22
+ If.new(condition)
23
+ end
24
+ end
25
+ end
26
+ 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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Divide < BinaryOperation
23
+ def initialize(left, right)
24
+ super("divide", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ # TODO: Use float if left or right is float
30
+ left_node.return_type
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,36 @@
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
+ require "gandiva/expression-builder/if"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Elsif < If
23
+ def initialize(parent, condition)
24
+ @parent = parent
25
+ super(condition)
26
+ end
27
+
28
+ def build
29
+ elsif_node = super
30
+ build_if_node(@parent.condition_node,
31
+ @parent.then_node,
32
+ elsif_node)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Equal < BinaryOperation
23
+ def initialize(left, right)
24
+ super("equal", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ Arrow::BooleanDataType.new
30
+ end
31
+ end
32
+ end
33
+ 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
+ require "gandiva/expression-builder/value"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Field < Value
23
+ def initialize(field)
24
+ @field = field
25
+ end
26
+
27
+ def build
28
+ FieldNode.new(@field)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class GreaterThan < BinaryOperation
23
+ def initialize(left, right)
24
+ super("greater_than", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ Arrow::BooleanDataType.new
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,75 @@
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 Gandiva
19
+ class ExpressionBuilder
20
+ class If
21
+ def initialize(condition)
22
+ @condition = condition
23
+ @then = nil
24
+ @else = nil
25
+ end
26
+
27
+ def then(clause)
28
+ @then = clause
29
+ self
30
+ end
31
+
32
+ def else(clause)
33
+ @else = clause
34
+ self
35
+ end
36
+
37
+ def elsif(condition)
38
+ Elsif.new(self, condition)
39
+ end
40
+
41
+ def build
42
+ build_if_node(condition_node,
43
+ then_node,
44
+ else_node)
45
+ end
46
+
47
+ protected
48
+ def condition_node
49
+ @condition.build
50
+ end
51
+
52
+ def then_node
53
+ @then&.build
54
+ end
55
+
56
+ def else_node
57
+ @else&.build
58
+ end
59
+
60
+ private
61
+ def build_if_node(condition_node, then_node, else_node)
62
+ if then_node and else_node
63
+ # TODO: Validate then_node.return_type == else_node.return_type
64
+ return_type = then_node.return_type
65
+ else
66
+ return_type = (then_node || else_node).return_type
67
+ end
68
+ IfNode.new(condition_node,
69
+ then_node,
70
+ else_node,
71
+ return_type)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,33 @@
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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class LessThan < BinaryOperation
23
+ def initialize(left, right)
24
+ super("less_than", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ Arrow::BooleanDataType.new
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,65 @@
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 Gandiva
19
+ class ExpressionBuilder
20
+ class Literal
21
+ class << self
22
+ def resolve(value)
23
+ case value
24
+ when true, false
25
+ new(BooleanLiteralNode, value)
26
+ when Integer
27
+ if value < -(2 ** 31)
28
+ new(Int64LiteralNode, value)
29
+ elsif value < -(2 ** 15)
30
+ new(Int32LiteralNode, value)
31
+ elsif value < -(2 ** 7)
32
+ new(Int16LiteralNode, value)
33
+ elsif value < 0
34
+ new(Int8LiteralNode, value)
35
+ elsif value < (2 ** 8 - 1)
36
+ new(UInt8LiteralNode, value)
37
+ elsif value < (2 ** 16 - 1)
38
+ new(UInt16LiteralNode, value)
39
+ elsif value < (2 ** 32 - 1)
40
+ new(UInt32LiteralNode, value)
41
+ else
42
+ new(UInt64LiteralNode, value)
43
+ end
44
+ when Float
45
+ new(DoubleLiteralNode, value)
46
+ when String
47
+ new(StringLiteralNode, value)
48
+ else
49
+ nil
50
+ end
51
+ end
52
+ end
53
+
54
+ attr_reader :value
55
+ def initialize(node_class, value)
56
+ @node_class = node_class
57
+ @value = value
58
+ end
59
+
60
+ def build
61
+ @node_class.new(value)
62
+ end
63
+ end
64
+ end
65
+ 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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Multiply < BinaryOperation
23
+ def initialize(left, right)
24
+ super("multiply", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ # TODO: Use larger type
30
+ right_node.return_type
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,45 @@
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 Gandiva
19
+ class ExpressionBuilder
20
+ class Record
21
+ def initialize(schema)
22
+ @schema = schema
23
+ end
24
+
25
+ def respond_to_missing?(name, include_private)
26
+ return true if @schema[name]
27
+ super
28
+ end
29
+
30
+ def method_missing(name, *args)
31
+ return super unless args.empty?
32
+ self[name] || super
33
+ end
34
+
35
+ def [](name)
36
+ field = @schema[name]
37
+ if field
38
+ Field.new(field)
39
+ else
40
+ nil
41
+ end
42
+ end
43
+ end
44
+ end
45
+ 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
+ require "gandiva/expression-builder/binary-operation"
19
+
20
+ module Gandiva
21
+ class ExpressionBuilder
22
+ class Subtract < BinaryOperation
23
+ def initialize(left, right)
24
+ super("subtract", left, right)
25
+ end
26
+
27
+ private
28
+ def return_type(left_node, right_node)
29
+ # TODO: Use larger type
30
+ right_node.return_type
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,55 @@
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 Gandiva
19
+ class ExpressionBuilder
20
+ class Value
21
+ def +(right)
22
+ Add.new(self, resolve(right))
23
+ end
24
+
25
+ def -(right)
26
+ Subtract.new(self, resolve(right))
27
+ end
28
+
29
+ def *(right)
30
+ Multiply.new(self, resolve(right))
31
+ end
32
+
33
+ def /(right)
34
+ Divide.new(self, resolve(right))
35
+ end
36
+
37
+ def >(right)
38
+ GreaterThan.new(self, resolve(right))
39
+ end
40
+
41
+ def <(right)
42
+ LessThan.new(self, resolve(right))
43
+ end
44
+
45
+ def ==(right)
46
+ Equal.new(self, resolve(right))
47
+ end
48
+
49
+ private
50
+ def resolve(value)
51
+ Literal.resolve(value) or value
52
+ end
53
+ end
54
+ end
55
+ end
@@ -36,5 +36,14 @@ module Gandiva
36
36
  super
37
37
  end
38
38
  end
39
+
40
+ def post_load(repository, namespace)
41
+ require_libraries
42
+ end
43
+
44
+ def require_libraries
45
+ require "gandiva/arrow-schema"
46
+ require "gandiva/expression-builder"
47
+ end
39
48
  end
40
49
  end
@@ -16,7 +16,7 @@
16
16
  # under the License.
17
17
 
18
18
  module Gandiva
19
- VERSION = "0.15.1"
19
+ VERSION = "1.0.1"
20
20
 
21
21
  module Version
22
22
  numbers, TAG = VERSION.split("-")
@@ -0,0 +1,54 @@
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
+ class TestExpressionBuilderAdd < Test::Unit::TestCase
19
+ def setup
20
+ @table = Arrow::Table.new(int32_field: Arrow::Int32Array.new([1]),
21
+ int64_field: Arrow::Int64Array.new([2]))
22
+ @schema = @table.schema
23
+ end
24
+
25
+ def build
26
+ record = Gandiva::ExpressionBuilder::Record.new(@schema)
27
+ builder = yield(record)
28
+ builder.build
29
+ end
30
+
31
+ test("literal") do
32
+ node = build do |record|
33
+ record.int32_field + (2 ** 63)
34
+ end
35
+ assert_equal("uint64 add((int32) int32_field, (const uint64) #{2 ** 63})",
36
+ node.to_s)
37
+ end
38
+
39
+ test("int32 + int64") do
40
+ node = build do |record|
41
+ record.int32_field + record.int64_field
42
+ end
43
+ assert_equal("int64 add((int32) int32_field, (int64) int64_field)",
44
+ node.to_s)
45
+ end
46
+
47
+ test("int64 + int32") do
48
+ node = build do |record|
49
+ record.int64_field + record.int32_field
50
+ end
51
+ assert_equal("int64 add((int64) int64_field, (int32) int32_field)",
52
+ node.to_s)
53
+ end
54
+ end
@@ -0,0 +1,45 @@
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
+ class TestExpressionBuilderRecord < Test::Unit::TestCase
19
+ def setup
20
+ @table = Arrow::Table.new(field: Arrow::Int32Array.new([1, 13, 3, 17]))
21
+ @schema = @table.schema
22
+ end
23
+
24
+ def build
25
+ record = Gandiva::ExpressionBuilder::Record.new(@schema)
26
+ builder = yield(record)
27
+ builder.build
28
+ end
29
+
30
+ test("name") do
31
+ node = build do |record|
32
+ record.field
33
+ end
34
+ assert_equal("(int32) field",
35
+ node.to_s)
36
+ end
37
+
38
+ test("#[]") do
39
+ node = build do |record|
40
+ record[:field]
41
+ end
42
+ assert_equal("(int32) field",
43
+ node.to_s)
44
+ end
45
+ end
@@ -34,7 +34,14 @@ test_dir = base_dir + "test"
34
34
  arrow_lib_dir = arrow_base_dir + "lib"
35
35
  arrow_ext_dir = arrow_base_dir + "ext" + "arrow"
36
36
 
37
- $LOAD_PATH.unshift(arrow_ext_dir.to_s)
37
+ build_dir = ENV["BUILD_DIR"]
38
+ if build_dir
39
+ arrow_build_dir = Pathname.new(build_dir) + "red-arrow"
40
+ else
41
+ arrow_build_dir = arrow_ext_dir
42
+ end
43
+
44
+ $LOAD_PATH.unshift(arrow_build_dir.to_s)
38
45
  $LOAD_PATH.unshift(arrow_lib_dir.to_s)
39
46
  $LOAD_PATH.unshift(lib_dir.to_s)
40
47
 
@@ -17,32 +17,31 @@
17
17
 
18
18
  class TestProjector < Test::Unit::TestCase
19
19
  def test_evaluate
20
- table = Arrow::Table.new(:field1 => Arrow::Int32Array.new([1, 2, 3, 4]),
21
- :field2 => Arrow::Int32Array.new([11, 13, 15, 17]))
20
+ table = Arrow::Table.new(:field1 => Arrow::Int32Array.new([1, 13, 3, 17]),
21
+ :field2 => Arrow::Int32Array.new([11, 2, 15, 17]),
22
+ :field3 => Arrow::Int32Array.new([1, 10, 2, 2]))
22
23
  schema = table.schema
23
- field1 = schema[:field1]
24
- field2 = schema[:field2]
25
- field_node1 = Gandiva::FieldNode.new(field1)
26
- field_node2 = Gandiva::FieldNode.new(field2)
27
- add_function_node = Gandiva::FunctionNode.new("add",
28
- [field_node1, field_node2],
29
- Arrow::Int32DataType.new)
30
- add_result = Arrow::Field.new("add_result", :int32)
31
- add_expression = Gandiva::Expression.new(add_function_node,
32
- add_result)
33
- subtract_function_node = Gandiva::FunctionNode.new("subtract",
34
- [field_node1, field_node2],
35
- Arrow::Int32DataType.new)
36
- subtract_result = Arrow::Field.new("subtract_result", :int32)
37
- subtract_expression = Gandiva::Expression.new(subtract_function_node,
38
- subtract_result)
24
+
25
+ expression1 = schema.build_expression do |record|
26
+ record.field1 + record.field2
27
+ end
28
+
29
+ expression2 = schema.build_expression do |record, context|
30
+ context.if(record.field1 > record.field2)
31
+ .then(record.field1 + record.field2 * record.field3)
32
+ .elsif(record.field1 == record.field2)
33
+ .then(record.field1 - record.field2 / record.field3)
34
+ .else(record.field2)
35
+ end
36
+
39
37
  projector = Gandiva::Projector.new(schema,
40
- [add_expression, subtract_expression])
38
+ [expression1, expression2])
39
+
41
40
  table.each_record_batch do |record_batch|
42
41
  outputs = projector.evaluate(record_batch)
43
42
  assert_equal([
44
- [12, 15, 18, 21],
45
- [-10, -11, -12, -13],
43
+ [12, 15, 18, 34],
44
+ [11, 33, 15, 9]
46
45
  ],
47
46
  outputs.collect(&:values))
48
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red-gandiva
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.1
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Apache Arrow Developers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-01 00:00:00.000000000 Z
11
+ date: 2020-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: red-arrow
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.15.1
19
+ version: 1.0.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.15.1
26
+ version: 1.0.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -82,9 +82,28 @@ files:
82
82
  - Rakefile
83
83
  - dependency-check/Rakefile
84
84
  - lib/gandiva.rb
85
+ - lib/gandiva/arrow-schema.rb
86
+ - lib/gandiva/expression-builder.rb
87
+ - lib/gandiva/expression-builder/add.rb
88
+ - lib/gandiva/expression-builder/binary-operation.rb
89
+ - lib/gandiva/expression-builder/context.rb
90
+ - lib/gandiva/expression-builder/divide.rb
91
+ - lib/gandiva/expression-builder/elsif.rb
92
+ - lib/gandiva/expression-builder/equal.rb
93
+ - lib/gandiva/expression-builder/field.rb
94
+ - lib/gandiva/expression-builder/greater-than.rb
95
+ - lib/gandiva/expression-builder/if.rb
96
+ - lib/gandiva/expression-builder/less-than.rb
97
+ - lib/gandiva/expression-builder/literal.rb
98
+ - lib/gandiva/expression-builder/multiply.rb
99
+ - lib/gandiva/expression-builder/record.rb
100
+ - lib/gandiva/expression-builder/subtract.rb
101
+ - lib/gandiva/expression-builder/value.rb
85
102
  - lib/gandiva/loader.rb
86
103
  - lib/gandiva/version.rb
87
104
  - red-gandiva.gemspec
105
+ - test/expression-builder/test-add.rb
106
+ - test/expression-builder/test-record.rb
88
107
  - test/helper.rb
89
108
  - test/run-test.rb
90
109
  - test/test-boolean-literal-node.rb
@@ -93,7 +112,7 @@ homepage: https://arrow.apache.org/
93
112
  licenses:
94
113
  - Apache-2.0
95
114
  metadata: {}
96
- post_install_message:
115
+ post_install_message:
97
116
  rdoc_options: []
98
117
  require_paths:
99
118
  - lib
@@ -108,12 +127,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
127
  - !ruby/object:Gem::Version
109
128
  version: '0'
110
129
  requirements: []
111
- rubygems_version: 3.0.6
112
- signing_key:
130
+ rubygems_version: 3.1.2
131
+ signing_key:
113
132
  specification_version: 4
114
133
  summary: Red Gandiva is the Ruby bindings of Gandiva
115
134
  test_files:
116
135
  - test/test-projector.rb
136
+ - test/expression-builder/test-add.rb
137
+ - test/expression-builder/test-record.rb
117
138
  - test/run-test.rb
118
139
  - test/helper.rb
119
140
  - test/test-boolean-literal-node.rb