This is an automated email from the ASF dual-hosted git repository.

mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new aced08dfa2 [CALCITE-6668] Arrow adapter should support IS FALSE 
Operator and IS TRUE Operator
aced08dfa2 is described below

commit aced08dfa22c9909de6000dbc194208060050696
Author: Cancai Cai <[email protected]>
AuthorDate: Sun Nov 3 18:13:12 2024 +0800

    [CALCITE-6668] Arrow adapter should support IS FALSE Operator and IS TRUE 
Operator
---
 .../calcite/adapter/arrow/ArrowTranslator.java     | 17 +++-
 .../adapter/arrow/ArrowAdapterDataTypesTest.java   | 15 ++++
 .../calcite/adapter/arrow/ArrowAdapterTest.java    | 99 ++++++++++++++++++++++
 .../apache/calcite/adapter/arrow/ArrowData.java    |  6 +-
 4 files changed, 135 insertions(+), 2 deletions(-)

diff --git 
a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java 
b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java
index 2137976265..b2e067db4f 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java
@@ -114,7 +114,13 @@ class ArrowTranslator {
     return predicates;
   }
 
-  /** Translate a binary or unary relation. */
+  /**
+   * Translates a binary or unary relation.
+   *
+   * @param node A RexNode that always evaluates to a boolean expression.
+   *             Currently, this method is only called from translateAnd.
+   * @return The translated SQL string for the relation.
+   */
   private String translateMatch2(RexNode node) {
     switch (node.getKind()) {
     case EQUALS:
@@ -133,6 +139,15 @@ class ArrowTranslator {
       return translateUnary("isnull", (RexCall) node);
     case IS_NOT_NULL:
       return translateUnary("isnotnull", (RexCall) node);
+    case IS_NOT_TRUE:
+      return translateUnary("isnottrue", (RexCall) node);
+    case IS_NOT_FALSE:
+      return translateUnary("isnotfalse", (RexCall) node);
+    case INPUT_REF:
+      final RexInputRef inputRef = (RexInputRef) node;
+      return fieldNames.get(inputRef.getIndex()) + " istrue";
+    case NOT:
+      return translateUnary("isfalse", (RexCall) node);
     default:
       throw new UnsupportedOperationException("Unsupported operator " + node);
     }
diff --git 
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
 
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
index 52c3c74f47..87dff81d4e 100644
--- 
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
+++ 
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
@@ -176,4 +176,19 @@ public class ArrowAdapterDataTypesTest {
         .returns(result)
         .explainContains(plan);
   }
+
+  @Test void testBooleanProject() {
+    String sql = "select \"booleanField\" from arrowdatatype";
+    String plan = "PLAN=ArrowToEnumerableConverter\n"
+        + "  ArrowProject(booleanField=[$7])\n"
+        + "    ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+    String result = 
"booleanField=null\nbooleanField=true\nbooleanField=false\n";
+    CalciteAssert.that()
+        .with(arrow)
+        .query(sql)
+        .limit(3)
+        .returns(result)
+        .explainContains(plan);
+  }
+
 }
diff --git 
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java 
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
index 8bcd812fa0..2e766c0384 100644
--- a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
+++ b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
@@ -77,6 +77,10 @@ class ArrowAdapterTest {
     arrowDataGenerator.writeArrowData(dataLocationFile);
     arrowDataGenerator.writeScottEmpData(arrowFilesDirectory);
 
+    File datatypeLocationFile = 
arrowFilesDirectory.resolve("arrowdatatype.arrow").toFile();
+    ArrowData arrowtypeDataGenerator = new ArrowData();
+    arrowtypeDataGenerator.writeArrowDataType(datatypeLocationFile);
+
     arrow = ImmutableMap.of("model", 
modelFileTarget.toAbsolutePath().toString());
   }
 
@@ -844,4 +848,99 @@ class ArrowAdapterTest {
         .returns(result)
         .explainContains(plan);
   }
+
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6638";>[CALCITE-6638]
+   * Arrow adapter should support IS FALSE Operator and IS TRUE Operator</a>. 
*/
+  @Test void testArrowProjectWithIsTrueFilter() {
+    String sql = "select \"booleanField\"\n"
+        + "from arrowdatatype\n"
+        + "where \"booleanField\" is true";
+    String plan = "PLAN=ArrowToEnumerableConverter\n"
+        + "  ArrowProject(booleanField=[$7])\n"
+        + "    ArrowFilter(condition=[$7])\n"
+        + "      ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+    String result = "booleanField=true\nbooleanField=true\n";
+
+    CalciteAssert.that()
+        .with(arrow)
+        .query(sql)
+        .limit(2)
+        .returns(result)
+        .explainContains(plan);
+  }
+
+  @Test void testArrowProjectWithIsTrueFilter2() {
+    String sql = "select \"intField\"\n"
+        + "from arrowdatatype\n"
+        + "where (\"intField\" > 10) is true";
+    String plan = "PLAN=ArrowToEnumerableConverter\n"
+        + "  ArrowProject(intField=[$2])\n"
+        + "    ArrowFilter(condition=[>($2, 10)])\n"
+        + "      ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+    String result = "intField=11\nintField=12\n";
+
+    CalciteAssert.that()
+        .with(arrow)
+        .query(sql)
+        .limit(2)
+        .returns(result)
+        .explainContains(plan);
+  }
+
+  @Test void testArrowProjectFieldsWithIsFalseFilter() {
+    String sql = "select \"booleanField\"\n"
+        + "from arrowdatatype\n"
+        + "where \"booleanField\" is false";
+    String plan = "PLAN=ArrowToEnumerableConverter\n"
+        + "  ArrowProject(booleanField=[$7])\n"
+        + "    ArrowFilter(condition=[NOT($7)])\n"
+        + "      ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+    String result = "booleanField=false\nbooleanField=false\n";
+
+    CalciteAssert.that()
+        .with(arrow)
+        .query(sql)
+        .limit(2)
+        .returns(result)
+        .explainContains(plan);
+  }
+
+
+  @Test void testArrowProjectFieldsWithIsNotTrueFilter() {
+    String sql = "select \"booleanField\"\n"
+        + "from arrowdatatype\n"
+        + "where \"booleanField\" is not true";
+    String plan = "PLAN=ArrowToEnumerableConverter\n"
+        + "  ArrowProject(booleanField=[$7])\n"
+        + "    ArrowFilter(condition=[IS NOT TRUE($7)])\n"
+        + "      ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+    String result = "booleanField=null\nbooleanField=false\n";
+
+    CalciteAssert.that()
+        .with(arrow)
+        .query(sql)
+        .limit(2)
+        .returns(result)
+        .explainContains(plan);
+  }
+
+  @Test void testArrowProjectFieldsWithIsNotFalseFilter() {
+    String sql = "select \"booleanField\"\n"
+        + "from arrowdatatype\n"
+        + "where \"booleanField\" is not false";
+    String plan = "PLAN=ArrowToEnumerableConverter\n"
+        + "  ArrowProject(booleanField=[$7])\n"
+        + "    ArrowFilter(condition=[IS NOT FALSE($7)])\n"
+        + "      ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+    String result = "booleanField=null\nbooleanField=true\n";
+
+    CalciteAssert.that()
+        .with(arrow)
+        .query(sql)
+        .limit(2)
+        .returns(result)
+        .explainContains(plan);
+  }
 }
diff --git 
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java 
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java
index e85c78e087..482a15e902 100644
--- a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java
+++ b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java
@@ -365,7 +365,11 @@ public class ArrowData {
     bitVector.setInitialCapacity(rowCount);
     bitVector.allocateNew();
     for (int i = 0; i < rowCount; i++) {
-      bitVector.set(i, this.booleanValue ? 1 : 0);
+      if (i % 3 == 0) {
+        bitVector.setNull(i);
+      } else {
+        bitVector.set(i, this.booleanValue ? 1 : 0);
+      }
       this.booleanValue = !this.booleanValue;
     }
     fieldVector.setValueCount(rowCount);

Reply via email to