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);