This is an automated email from the ASF dual-hosted git repository.

fjy pushed a commit to branch 0.12.3
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/0.12.3 by this push:
     new a14e593  SQL: Remove useless boolean CASTs in filters. (#5619) (#6241)
a14e593 is described below

commit a14e5938d9c2a44722708b4cf8feb0e13f5b1ce4
Author: Gian Merlino <[email protected]>
AuthorDate: Sun Aug 26 18:44:54 2018 -0700

    SQL: Remove useless boolean CASTs in filters. (#5619) (#6241)
---
 .../druid/sql/calcite/expression/Expressions.java  |  9 ++++---
 .../io/druid/sql/calcite/CalciteQueryTest.java     | 28 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/sql/src/main/java/io/druid/sql/calcite/expression/Expressions.java 
b/sql/src/main/java/io/druid/sql/calcite/expression/Expressions.java
index 3cff45e..8917260 100644
--- a/sql/src/main/java/io/druid/sql/calcite/expression/Expressions.java
+++ b/sql/src/main/java/io/druid/sql/calcite/expression/Expressions.java
@@ -218,9 +218,12 @@ public class Expressions
       final RexNode expression
   )
   {
-    if (expression.getKind() == SqlKind.AND
-        || expression.getKind() == SqlKind.OR
-        || expression.getKind() == SqlKind.NOT) {
+    if (expression.getKind() == SqlKind.CAST && 
expression.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) {
+      // Calcite sometimes leaves errant, useless cast-to-booleans inside 
filters. Strip them and continue.
+      return toFilter(plannerContext, rowSignature, 
Iterables.getOnlyElement(((RexCall) expression).getOperands()));
+    } else if (expression.getKind() == SqlKind.AND
+               || expression.getKind() == SqlKind.OR
+               || expression.getKind() == SqlKind.NOT) {
       final List<DimFilter> filters = Lists.newArrayList();
       for (final RexNode rexNode : ((RexCall) expression).getOperands()) {
         final DimFilter nextFilter = toFilter(
diff --git a/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java 
b/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
index 19f687f..eea56ca 100644
--- a/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
@@ -2972,6 +2972,34 @@ public class CalciteQueryTest extends CalciteTestBase
   }
 
   @Test
+  public void testRemoveUselessCaseWhen() throws Exception
+  {
+    testQuery(
+        "SELECT COUNT(*) FROM druid.foo\n"
+        + "WHERE\n"
+        + "  CASE\n"
+        + "    WHEN __time >= TIME_PARSE('2000-01-01 00:00:00', 'yyyy-MM-dd 
HH:mm:ss') AND __time < TIMESTAMP '2001-01-01 00:00:00'\n"
+        + "    THEN true\n"
+        + "    ELSE false\n"
+        + "  END\n"
+        + "OR\n"
+        + "  __time >= TIMESTAMP '2010-01-01 00:00:00' AND __time < TIMESTAMP 
'2011-01-01 00:00:00'",
+        ImmutableList.of(
+            Druids.newTimeseriesQueryBuilder()
+                  .dataSource(CalciteTests.DATASOURCE1)
+                  .intervals(QSS(Intervals.of("2000/2001"), 
Intervals.of("2010/2011")))
+                  .granularity(Granularities.ALL)
+                  .aggregators(AGGS(new CountAggregatorFactory("a0")))
+                  .context(TIMESERIES_CONTEXT_DEFAULT)
+                  .build()
+        ),
+        ImmutableList.of(
+            new Object[]{3L}
+        )
+    );
+  }
+
+  @Test
   public void testCountStarWithTimeFilterUsingStringLiterals() throws Exception
   {
     // Strings are implicitly cast to timestamps. Test a few different forms.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to