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 "

Reply via email to