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]