refactor the datetime test to use ExpressionChecker and fix BeamSqlDivideExpression to speicify round mode.
Project: http://git-wip-us.apache.org/repos/asf/beam/repo Commit: http://git-wip-us.apache.org/repos/asf/beam/commit/1d826dae Tree: http://git-wip-us.apache.org/repos/asf/beam/tree/1d826dae Diff: http://git-wip-us.apache.org/repos/asf/beam/diff/1d826dae Branch: refs/heads/DSL_SQL Commit: 1d826dae8efa2fb2efac6ce19d8058a914c8d41a Parents: 6c289d3 Author: James Xu <[email protected]> Authored: Mon Jul 17 17:14:04 2017 +0800 Committer: JingsongLi <[email protected]> Committed: Tue Jul 18 16:17:24 2017 +0800 ---------------------------------------------------------------------- .../arithmetic/BeamSqlDivideExpression.java | 5 +- ...amSqlArithmeticOperatorsIntegrationTest.java | 13 ++-- .../BeamSqlDateFunctionsIntegrationTest.java | 68 +++++++++----------- 3 files changed, 42 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/beam/blob/1d826dae/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/arithmetic/BeamSqlDivideExpression.java ---------------------------------------------------------------------- diff --git a/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/arithmetic/BeamSqlDivideExpression.java b/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/arithmetic/BeamSqlDivideExpression.java index 6040690..c5fe02b 100644 --- a/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/arithmetic/BeamSqlDivideExpression.java +++ b/dsls/sql/src/main/java/org/apache/beam/dsls/sql/interpreter/operator/arithmetic/BeamSqlDivideExpression.java @@ -19,6 +19,7 @@ package org.apache.beam.dsls.sql.interpreter.operator.arithmetic; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; import org.apache.beam.dsls.sql.interpreter.operator.BeamSqlExpression; @@ -27,10 +28,10 @@ import org.apache.beam.dsls.sql.interpreter.operator.BeamSqlExpression; */ public class BeamSqlDivideExpression extends BeamSqlArithmeticExpression { public BeamSqlDivideExpression(List<BeamSqlExpression> operands) { - super(operands, operands.get(0).getOutputType()); + super(operands); } @Override protected BigDecimal calc(BigDecimal left, BigDecimal right) { - return left.divide(right); + return left.divide(right, 10, RoundingMode.HALF_EVEN); } } http://git-wip-us.apache.org/repos/asf/beam/blob/1d826dae/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlArithmeticOperatorsIntegrationTest.java ---------------------------------------------------------------------- diff --git a/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlArithmeticOperatorsIntegrationTest.java b/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlArithmeticOperatorsIntegrationTest.java index b1c577f..947660a 100644 --- a/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlArithmeticOperatorsIntegrationTest.java +++ b/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlArithmeticOperatorsIntegrationTest.java @@ -19,6 +19,7 @@ package org.apache.beam.dsls.sql.integrationtest; import java.math.BigDecimal; +import java.math.RoundingMode; import org.junit.Test; /** @@ -31,6 +32,8 @@ public class BeamSqlArithmeticOperatorsIntegrationTest private static final BigDecimal ONE0 = BigDecimal.valueOf(1); private static final BigDecimal ONE = BigDecimal.valueOf(1.0); private static final BigDecimal ONE2 = BigDecimal.valueOf(1.0).multiply(BigDecimal.valueOf(1.0)); + private static final BigDecimal ONE10 = BigDecimal.ONE.divide( + BigDecimal.ONE, 10, RoundingMode.HALF_EVEN); private static final BigDecimal TWO = BigDecimal.valueOf(2.0); @Test @@ -123,14 +126,14 @@ public class BeamSqlArithmeticOperatorsIntegrationTest public void testDivide() throws Exception { ExpressionChecker checker = new ExpressionChecker() .addExpr("1 / 1", 1) - .addExpr("1.0 / 1", ONE0) - .addExpr("1 / 1.0", ONE0) - .addExpr("1.0 / 1.0", ONE0) + .addExpr("1.0 / 1", ONE10) + .addExpr("1 / 1.0", ONE10) + .addExpr("1.0 / 1.0", ONE10) .addExpr("c_tinyint / c_tinyint", (byte) 1) .addExpr("c_smallint / c_smallint", (short) 1) .addExpr("c_bigint / c_bigint", 1L) - .addExpr("c_decimal / c_decimal", ONE0) - .addExpr("c_tinyint / c_decimal", ONE0) + .addExpr("c_decimal / c_decimal", ONE10) + .addExpr("c_tinyint / c_decimal", ONE10) .addExpr("c_float / c_decimal", 1.0) .addExpr("c_double / c_decimal", 1.0) .addExpr("c_float / c_float", 1.0f) http://git-wip-us.apache.org/repos/asf/beam/blob/1d826dae/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlDateFunctionsIntegrationTest.java ---------------------------------------------------------------------- diff --git a/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlDateFunctionsIntegrationTest.java b/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlDateFunctionsIntegrationTest.java index 386241d..bd0d3ba 100644 --- a/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlDateFunctionsIntegrationTest.java +++ b/dsls/sql/src/test/java/org/apache/beam/dsls/sql/integrationtest/BeamSqlDateFunctionsIntegrationTest.java @@ -18,6 +18,9 @@ package org.apache.beam.dsls.sql.integrationtest; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import java.util.Date; import java.util.Iterator; import org.apache.beam.dsls.sql.BeamSql; @@ -25,7 +28,6 @@ import org.apache.beam.dsls.sql.schema.BeamSqlRow; import org.apache.beam.sdk.testing.PAssert; import org.apache.beam.sdk.transforms.SerializableFunction; import org.apache.beam.sdk.values.PCollection; -import org.junit.Assert; import org.junit.Test; /** @@ -34,20 +36,26 @@ import org.junit.Test; public class BeamSqlDateFunctionsIntegrationTest extends BeamSqlBuiltinFunctionsIntegrationTestBase { @Test public void testDateTimeFunctions() throws Exception { + ExpressionChecker checker = new ExpressionChecker() + .addExpr("EXTRACT(YEAR FROM ts)", 1986L) + .addExpr("YEAR(ts)", 1986L) + .addExpr("QUARTER(ts)", 1L) + .addExpr("MONTH(ts)", 2L) + .addExpr("WEEK(ts)", 7L) + .addExpr("DAYOFMONTH(ts)", 15L) + .addExpr("DAYOFYEAR(ts)", 46L) + .addExpr("DAYOFWEEK(ts)", 7L) + .addExpr("HOUR(ts)", 11L) + .addExpr("MINUTE(ts)", 35L) + .addExpr("SECOND(ts)", 26L) + .addExpr("FLOOR(ts TO YEAR)", parseDate("1986-01-01 00:00:00")) + .addExpr("CEIL(ts TO YEAR)", parseDate("1987-01-01 00:00:00")) + ; + checker.buildRunAndCheck(); + } + + @Test public void testDateTimeFunctions_currentTime() throws Exception { String sql = "SELECT " - + "EXTRACT(YEAR FROM ts) as ex," - + "YEAR(ts) as y," - + "QUARTER(ts) as q," - + "MONTH(ts) as m," - + "WEEK(ts) as w," - + "DAYOFMONTH(ts) as d," - + "DAYOFYEAR(ts) as d1," - + "DAYOFWEEK(ts) as d2," - + "HOUR(ts) as h," - + "MINUTE(ts) as m1," - + "SECOND(ts) as s, " - + "FLOOR(ts TO YEAR) as f," - + "CEIL(ts TO YEAR) as c, " + "LOCALTIME as l," + "LOCALTIMESTAMP as l1," + "CURRENT_DATE as c1," @@ -64,30 +72,16 @@ public class BeamSqlDateFunctionsIntegrationTest private static class Checker implements SerializableFunction<Iterable<BeamSqlRow>, Void> { @Override public Void apply(Iterable<BeamSqlRow> input) { Iterator<BeamSqlRow> iter = input.iterator(); - while (iter.hasNext()) { - BeamSqlRow row = iter.next(); - Assert.assertEquals(1986L, row.getLong(0)); - Assert.assertEquals(1986L, row.getLong(1)); - Assert.assertEquals(1L, row.getLong(2)); - Assert.assertEquals(2L, row.getLong(3)); - Assert.assertEquals(7L, row.getLong(4)); - Assert.assertEquals(15L, row.getLong(5)); - Assert.assertEquals(46L, row.getLong(6)); - Assert.assertEquals(7L, row.getLong(7)); - Assert.assertEquals(11L, row.getLong(8)); - Assert.assertEquals(35L, row.getLong(9)); - Assert.assertEquals(26L, row.getLong(10)); - Assert.assertEquals(parseDate("1986-01-01 00:00:00"), row.getDate(11)); - Assert.assertEquals(parseDate("1987-01-01 00:00:00"), row.getDate(12)); - + assertTrue(iter.hasNext()); + BeamSqlRow row = iter.next(); // LOCALTIME - Date date = new Date(); - Assert.assertTrue(date.getTime() - row.getGregorianCalendar(13).getTime().getTime() < 1000); - Assert.assertTrue(date.getTime() - row.getDate(14).getTime() < 1000); - Assert.assertTrue(date.getTime() - row.getDate(15).getTime() < 1000); - Assert.assertTrue(date.getTime() - row.getGregorianCalendar(16).getTime().getTime() < 1000); - Assert.assertTrue(date.getTime() - row.getDate(17).getTime() < 1000); - } + Date date = new Date(); + assertTrue(date.getTime() - row.getGregorianCalendar(0).getTime().getTime() < 1000); + assertTrue(date.getTime() - row.getDate(1).getTime() < 1000); + assertTrue(date.getTime() - row.getDate(2).getTime() < 1000); + assertTrue(date.getTime() - row.getGregorianCalendar(3).getTime().getTime() < 1000); + assertTrue(date.getTime() - row.getDate(4).getTime() < 1000); + assertFalse(iter.hasNext()); return null; } }
