From aa9d22b7800e7f46c4e6ac4834ee7408fcc1c4ab Mon Sep 17 00:00:00 2001 From: xueyu <278006819@qq.com> Date: Sun, 24 Mar 2019 21:48:55 +0800 Subject: [PATCH 1/2] support radians and degrees in sql --- docs/content/querying/sql.md | 2 ++ .../calcite/planner/DruidOperatorTable.java | 2 ++ .../druid/sql/calcite/CalciteQueryTest.java | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/docs/content/querying/sql.md b/docs/content/querying/sql.md index 868ad64ca950..77a13fb15b75 100644 --- a/docs/content/querying/sql.md +++ b/docs/content/querying/sql.md @@ -162,6 +162,8 @@ Numeric functions will return 64 bit integers or 64 bit floats, depending on the |`ACOS(expr)`|Arc cosine of expr.| |`ATAN(expr)`|Arc tangent of expr.| |`ATAN2(y, x)`|Angle theta from the conversion of rectangular coordinates (x, y) to polar * coordinates (r, theta).| +|`DEGREES(expr)`|Converts an angle measured in radians to an approximately equivalent angle measured in degrees| +|`RADIANS(expr)`|Converts an angle measured in degrees to an approximately equivalent angle measured in radians| ### String functions diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java index c908a2d52666..a1f6e159e08a 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java @@ -131,6 +131,8 @@ public class DruidOperatorTable implements SqlOperatorTable .add(new DirectOperatorConversion(SqlStdOperatorTable.ACOS, "acos")) .add(new DirectOperatorConversion(SqlStdOperatorTable.ATAN, "atan")) .add(new DirectOperatorConversion(SqlStdOperatorTable.ATAN2, "atan2")) + .add(new DirectOperatorConversion(SqlStdOperatorTable.RADIANS, "toRadians")) + .add(new DirectOperatorConversion(SqlStdOperatorTable.DEGREES, "toDegrees")) .add(new UnaryPrefixOperatorConversion(SqlStdOperatorTable.NOT, "!")) .add(new UnaryPrefixOperatorConversion(SqlStdOperatorTable.UNARY_MINUS, "-")) .add(new UnaryFunctionOperatorConversion(SqlStdOperatorTable.IS_NULL, "isnull")) diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index f18c276266e3..4384ac98b622 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -7669,4 +7669,29 @@ public void testTrigonometricFunction() throws Exception ) ); } + + @Test + public void testRadiansAndDegrees() throws Exception + { + testQuery( + "SELECT RADIANS(m1 * 15), DEGREES(m2) FROM numfoo WHERE dim1 = '1'", + ImmutableList.of( + newScanQueryBuilder() + .dataSource(CalciteTests.DATASOURCE3) + .intervals(querySegmentSpec(Filtration.eternity())) + .virtualColumns( + expressionVirtualColumn("v0", "toRadians((\"m1\" * 15))", ValueType.DOUBLE), + expressionVirtualColumn("v1", "toDegrees(\"m2\")", ValueType.DOUBLE) + ) + .columns("v0", "v1") + .filters(selector("dim1", "1", null)) + .resultFormat(ScanQuery.RESULT_FORMAT_COMPACTED_LIST) + .context(QUERY_CONTEXT_DEFAULT) + .build() + ), + ImmutableList.of( + new Object[]{Math.toRadians(60), Math.toDegrees(4)} + ) + ); + } } From 2eadaa1c0ff3b73d2c29374217dd9cd3b3232ff2 Mon Sep 17 00:00:00 2001 From: xueyu <278006819@qq.com> Date: Wed, 27 Mar 2019 13:12:19 +0800 Subject: [PATCH 2/2] update test case --- .../org/apache/druid/sql/calcite/CalciteQueryTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index 4384ac98b622..f2c9895bc2d9 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -7674,23 +7674,22 @@ public void testTrigonometricFunction() throws Exception public void testRadiansAndDegrees() throws Exception { testQuery( - "SELECT RADIANS(m1 * 15), DEGREES(m2) FROM numfoo WHERE dim1 = '1'", + "SELECT RADIANS(m1 * 15)/DEGREES(m2) FROM numfoo WHERE dim1 = '1'", ImmutableList.of( newScanQueryBuilder() .dataSource(CalciteTests.DATASOURCE3) .intervals(querySegmentSpec(Filtration.eternity())) .virtualColumns( - expressionVirtualColumn("v0", "toRadians((\"m1\" * 15))", ValueType.DOUBLE), - expressionVirtualColumn("v1", "toDegrees(\"m2\")", ValueType.DOUBLE) + expressionVirtualColumn("v0", "(toRadians((\"m1\" * 15)) / toDegrees(\"m2\"))", ValueType.DOUBLE) ) - .columns("v0", "v1") + .columns("v0") .filters(selector("dim1", "1", null)) .resultFormat(ScanQuery.RESULT_FORMAT_COMPACTED_LIST) .context(QUERY_CONTEXT_DEFAULT) .build() ), ImmutableList.of( - new Object[]{Math.toRadians(60), Math.toDegrees(4)} + new Object[]{Math.toRadians(60) / Math.toDegrees(4)} ) ); }