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 f5d83a4  SQL: Fix assumption that AND, OR have two arguments. (#5470) 
(#6239)
f5d83a4 is described below

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

    SQL: Fix assumption that AND, OR have two arguments. (#5470) (#6239)
    
    Calcite can deliver an AND or OR operator with > 2 arguments.
    Fixes #5468.
---
 .../expression/BinaryOperatorConversion.java       | 19 ++++++++-----
 .../io/druid/sql/calcite/CalciteQueryTest.java     | 33 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 7 deletions(-)

diff --git 
a/sql/src/main/java/io/druid/sql/calcite/expression/BinaryOperatorConversion.java
 
b/sql/src/main/java/io/druid/sql/calcite/expression/BinaryOperatorConversion.java
index bf4f069..deb50c3 100644
--- 
a/sql/src/main/java/io/druid/sql/calcite/expression/BinaryOperatorConversion.java
+++ 
b/sql/src/main/java/io/druid/sql/calcite/expression/BinaryOperatorConversion.java
@@ -19,6 +19,7 @@
 
 package io.druid.sql.calcite.expression;
 
+import com.google.common.base.Joiner;
 import io.druid.java.util.common.ISE;
 import io.druid.java.util.common.StringUtils;
 import io.druid.sql.calcite.planner.PlannerContext;
@@ -26,15 +27,17 @@ import io.druid.sql.calcite.table.RowSignature;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlOperator;
 
+import java.util.stream.Collectors;
+
 public class BinaryOperatorConversion implements SqlOperatorConversion
 {
   private final SqlOperator operator;
-  private final String druidOperator;
+  private final Joiner joiner;
 
   public BinaryOperatorConversion(final SqlOperator operator, final String 
druidOperator)
   {
     this.operator = operator;
-    this.druidOperator = druidOperator;
+    this.joiner = Joiner.on(" " + druidOperator + " ");
   }
 
   @Override
@@ -55,16 +58,18 @@ public class BinaryOperatorConversion implements 
SqlOperatorConversion
         rowSignature,
         rexNode,
         operands -> {
-          if (operands.size() != 2) {
+          if (operands.size() < 2) {
             throw new ISE("WTF?! Got binary operator[%s] with %s args?", 
operator.getName(), operands.size());
           }
 
           return DruidExpression.fromExpression(
               StringUtils.format(
-                  "(%s %s %s)",
-                  operands.get(0).getExpression(),
-                  druidOperator,
-                  operands.get(1).getExpression()
+                  "(%s)",
+                  joiner.join(
+                      operands.stream()
+                              .map(DruidExpression::getExpression)
+                              .collect(Collectors.toList())
+                  )
               )
           );
         }
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 dccdc5f..19f687f 100644
--- a/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
@@ -1603,6 +1603,39 @@ public class CalciteQueryTest extends CalciteTestBase
   }
 
   @Test
+  public void testGroupByCaseWhenOfTripleAnd() throws Exception
+  {
+    testQuery(
+        "SELECT\n"
+        + "  CASE WHEN m1 > 1 AND m1 < 5 AND cnt = 1 THEN 'x' ELSE NULL END,"
+        + "  COUNT(*)\n"
+        + "FROM druid.foo\n"
+        + "GROUP BY 1",
+        ImmutableList.of(
+            GroupByQuery.builder()
+                        .setDataSource(CalciteTests.DATASOURCE1)
+                        .setInterval(QSS(Filtration.eternity()))
+                        .setGranularity(Granularities.ALL)
+                        .setVirtualColumns(
+                            EXPRESSION_VIRTUAL_COLUMN(
+                                "d0:v",
+                                "case_searched(((\"m1\" > 1) && (\"m1\" < 5) 
&& (\"cnt\" == 1)),'x','')",
+                                ValueType.STRING
+                            )
+                        )
+                        .setDimensions(DIMS(new DefaultDimensionSpec("d0:v", 
"d0")))
+                        .setAggregatorSpecs(AGGS(new 
CountAggregatorFactory("a0")))
+                        .setContext(QUERY_CONTEXT_DEFAULT)
+                        .build()
+        ),
+        ImmutableList.of(
+            new Object[]{"", 3L},
+            new Object[]{"x", 3L}
+        )
+    );
+  }
+
+  @Test
   public void testNullEmptyStringEquality() throws Exception
   {
     // Doesn't conform to the SQL standard, but it's how we do it.


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

Reply via email to