This is an automated email from the ASF dual-hosted git repository. sereda pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push: new 6b41a61 [CALCITE-2850] Geode adapter: support boolean column as filter operand 6b41a61 is described below commit 6b41a6135d7bb09b4ccd08df665ae089275b8454 Author: Zoltan Haindrich <k...@rxd.hu> AuthorDate: Fri Feb 15 10:26:44 2019 +0100 [CALCITE-2850] Geode adapter: support boolean column as filter operand Earlier when a boolean column was supplied as a filter, the adapter have thrown Exception. --- .../calcite/adapter/geode/rel/GeodeFilter.java | 25 ++++++++++++++++++--- .../calcite/adapter/geode/rel/GeodeRules.java | 26 ++++++++++++++++++++++ .../adapter/geode/rel/GeodeAllDataTypesTest.java | 22 ++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java index 91435fe..c896544 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java @@ -25,6 +25,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexCall; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexLiteral; @@ -60,7 +61,7 @@ public class GeodeFilter extends Filter implements GeodeRel { super(cluster, traitSet, input, condition); - Translator translator = new Translator(getRowType()); + Translator translator = new Translator(getRowType(), getCluster().getRexBuilder()); this.match = translator.translateMatch(condition); assert getConvention() == GeodeRel.CONVENTION; @@ -89,8 +90,11 @@ public class GeodeFilter extends Filter implements GeodeRel { private final List<String> fieldNames; - Translator(RelDataType rowType) { + private RexBuilder rexBuilder; + + Translator(RelDataType rowType, RexBuilder rexBuilder) { this.rowType = rowType; + this.rexBuilder = rexBuilder; this.fieldNames = GeodeRules.geodeFieldNames(rowType); } @@ -293,6 +297,7 @@ public class GeodeFilter extends Filter implements GeodeRel { private String translateMatch2(RexNode node) { // We currently only use equality, but inequalities on clustering keys // should be possible in the future + RexNode child; switch (node.getKind()) { case EQUALS: return translateBinary("=", "=", (RexCall) node); @@ -304,9 +309,23 @@ public class GeodeFilter extends Filter implements GeodeRel { return translateBinary(">", "<", (RexCall) node); case GREATER_THAN_OR_EQUAL: return translateBinary(">=", "<=", (RexCall) node); + case INPUT_REF: + return translateBinary2("=", node, rexBuilder.makeLiteral(true)); + case NOT: + child = ((RexCall) node).getOperands().get(0); + if (child.getKind() == SqlKind.CAST) { + child = ((RexCall) child).getOperands().get(0); + } + if (child.getKind() == SqlKind.INPUT_REF) { + return translateBinary2("=", child, rexBuilder.makeLiteral(false)); + } + break; + case CAST: + return translateMatch2(((RexCall) node).getOperands().get(0)); default: - throw new AssertionError("cannot translate " + node); + break; } + throw new AssertionError("Cannot translate " + node + ", kind=" + node.getKind()); } /** diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java index a0e7b0a..9a87610 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java @@ -275,6 +275,14 @@ public class GeodeRules { */ private boolean isEqualityOnKey(RexNode node, List<String> fieldNames) { + if (isBooleanColumnReference(node, fieldNames)) { + return true; + } + + if (!SqlKind.COMPARISON.contains(node.getKind())) { + return false; + } + RexCall call = (RexCall) node; final RexNode left = call.operands.get(0); final RexNode right = call.operands.get(1); @@ -286,6 +294,24 @@ public class GeodeRules { } + private boolean isBooleanColumnReference(RexNode node, List<String> fieldNames) { + // FIXME Ignore casts for rel and assume they aren't really necessary + if (node.isA(SqlKind.CAST)) { + node = ((RexCall) node).getOperands().get(0); + } + if (node.isA(SqlKind.NOT)) { + node = ((RexCall) node).getOperands().get(0); + } + if (node.isA(SqlKind.INPUT_REF)) { + if (node.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) { + final RexInputRef left1 = (RexInputRef) node; + String name = fieldNames.get(left1.getIndex()); + return name != null; + } + } + return false; + } + /** * Checks whether a condition contains input refs of literals. * diff --git a/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java b/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java index 41700e5..2144c10 100644 --- a/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java +++ b/geode/src/test/java/org/apache/calcite/adapter/geode/rel/GeodeAllDataTypesTest.java @@ -117,6 +117,28 @@ public class GeodeAllDataTypesTest extends AbstractGeodeTest { } @Test + public void testSqlBooleanColumnFilter() { + calciteAssert() + .query("SELECT booleanValue as booleanValue " + + "FROM geode.allDataTypesRegion WHERE booleanValue") + .returnsCount(2) + .queryContains( + GeodeAssertions.query("SELECT booleanValue AS booleanValue FROM /allDataTypesRegion " + + "WHERE booleanValue = true")); + } + + @Test + public void testSqlBooleanColumnNotFilter() { + calciteAssert() + .query("SELECT booleanValue as booleanValue " + + "FROM geode.allDataTypesRegion WHERE not booleanValue") + .returnsCount(1) + .queryContains( + GeodeAssertions.query("SELECT booleanValue AS booleanValue FROM /allDataTypesRegion " + + "WHERE booleanValue = false")); + } + + @Test public void testSqlMultipleBooleanWhereFilter() { calciteAssert() .query("SELECT booleanValue as booleanValue "