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]