Repository: beam Updated Branches: refs/heads/DSL_SQL 125cef144 -> 25fea4e1e
POWER function Project: http://git-wip-us.apache.org/repos/asf/beam/repo Commit: http://git-wip-us.apache.org/repos/asf/beam/commit/556c48c8 Tree: http://git-wip-us.apache.org/repos/asf/beam/tree/556c48c8 Diff: http://git-wip-us.apache.org/repos/asf/beam/diff/556c48c8 Branch: refs/heads/DSL_SQL Commit: 556c48c805cba2e2fe8b349fca55bead1a0a7ef2 Parents: 125cef1 Author: tarushapptech <[email protected]> Authored: Fri Jun 9 21:32:39 2017 +0530 Committer: Tyler Akidau <[email protected]> Committed: Wed Jul 12 10:43:54 2017 -0700 ---------------------------------------------------------------------- .../dsls/sql/interpreter/BeamSqlFnExecutor.java | 4 ++ .../operator/math/BeamSqlPowerExpression.java | 46 ++++++++++++++++++++ .../math/BeamSqlMathBinaryExpressionTest.java | 45 +++++++++++++++++++ 3 files changed, 95 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/beam/blob/556c48c8/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/BeamSqlFnExecutor.java ---------------------------------------------------------------------- diff --git a/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/BeamSqlFnExecutor.java b/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/BeamSqlFnExecutor.java index 2c2efe9..5d0ce29 100644 --- a/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/BeamSqlFnExecutor.java +++ b/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/BeamSqlFnExecutor.java @@ -63,6 +63,7 @@ import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlDegreesExpressi import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlExpExpression; import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlLnExpression; import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlLogExpression; +import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlPowerExpression; import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlRadiansExpression; import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlRoundExpression; import org.apache.beam.dsls.sql.interpreter.operator.math.BeamSqlSignExpression; @@ -279,6 +280,9 @@ public class BeamSqlFnExecutor implements BeamSqlExpressionExecutor { case "SIGN": ret = new BeamSqlSignExpression(subExps); break; + case "POWER": + ret = new BeamSqlPowerExpression(subExps); + break; // string operators case "||": http://git-wip-us.apache.org/repos/asf/beam/blob/556c48c8/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlPowerExpression.java ---------------------------------------------------------------------- diff --git a/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlPowerExpression.java b/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlPowerExpression.java new file mode 100644 index 0000000..d0d7298 --- /dev/null +++ b/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlPowerExpression.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.beam.dsls.sql.interpreter.operator.math; + +import java.util.List; + +import org.apache.beam.dsls.sql.interpreter.operator.BeamSqlExpression; +import org.apache.beam.dsls.sql.interpreter.operator.BeamSqlPrimitive; +import org.apache.calcite.runtime.SqlFunctions; +import org.apache.calcite.sql.type.SqlTypeName; + +/** + * {@code BeamSqlMathBinaryExpression} for 'POWER' function. + */ +public class BeamSqlPowerExpression extends BeamSqlMathBinaryExpression { + + public BeamSqlPowerExpression(List<BeamSqlExpression> operands) { + super(operands); + this.outputType = SqlTypeName.DOUBLE; + } + + @Override + public BeamSqlPrimitive<? extends Number> calculate(BeamSqlPrimitive leftOp, + BeamSqlPrimitive rightOp) { + return BeamSqlPrimitive.of(SqlTypeName.DOUBLE, SqlFunctions + .power(SqlFunctions.toDouble(leftOp.getValue()), + SqlFunctions.toDouble(rightOp.getValue()))); + } + +} http://git-wip-us.apache.org/repos/asf/beam/blob/556c48c8/dsls/sql/src/test/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlMathBinaryExpressionTest.java ---------------------------------------------------------------------- diff --git a/dsls/sql/src/test/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlMathBinaryExpressionTest.java b/dsls/sql/src/test/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlMathBinaryExpressionTest.java index 58107e8..143b9da 100644 --- a/dsls/sql/src/test/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlMathBinaryExpressionTest.java +++ b/dsls/sql/src/test/java/org/apache/beam/dsls/sql/interpreter/operator/math/BeamSqlMathBinaryExpressionTest.java @@ -135,4 +135,49 @@ public class BeamSqlMathBinaryExpressionTest extends BeamSqlFnExecutorTestBase { assertEquals(1234567L, new BeamSqlRoundExpression(operands).evaluate(record).getValue()); } + @Test public void testPowerFunction() { + // test power functions with operands of type bigint, int, + // tinyint, smallint, double, decimal + List<BeamSqlExpression> operands = new ArrayList<>(); + + operands.add(BeamSqlPrimitive.of(SqlTypeName.DOUBLE, 2.0)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.DOUBLE, 4.0)); + Assert.assertEquals(16.0, new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + // power(integer,integer) => long + operands.clear(); + operands.add(BeamSqlPrimitive.of(SqlTypeName.INTEGER, 2)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.INTEGER, 2)); + assertEquals(4.0, new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + // power(integer,long) => long + operands.clear(); + operands.add(BeamSqlPrimitive.of(SqlTypeName.INTEGER, 2)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.BIGINT, 3L)); + assertEquals(8.0, new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + + // power(long,long) => long + operands.clear(); + operands.add(BeamSqlPrimitive.of(SqlTypeName.BIGINT, 2L)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.BIGINT, 2L)); + assertEquals(4.0, new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + + // power(double, int) => double + operands.clear(); + operands.add(BeamSqlPrimitive.of(SqlTypeName.DOUBLE, 1.1)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.INTEGER, 1)); + assertEquals(1.1, new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + + // power(double, long) => double + operands.clear(); + operands.add(BeamSqlPrimitive.of(SqlTypeName.DOUBLE, 1.1)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.BIGINT, 1L)); + assertEquals(1.1, new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + + // power(integer, double) => double + operands.clear(); + operands.add(BeamSqlPrimitive.of(SqlTypeName.INTEGER, 2)); + operands.add(BeamSqlPrimitive.of(SqlTypeName.DOUBLE, 2.2)); + assertEquals(Math.pow(2, 2.2), + new BeamSqlPowerExpression(operands).evaluate(record).getValue()); + } + }
