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 <[email protected]>
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 "