You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by xu...@apache.org on 2026/04/18 14:20:50 UTC
(calcite) branch main updated: [CALCITE-7472] Arrow adapter should support LIKE operator push down
This is an automated email from the ASF dual-hosted git repository.
xuzifu666 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 422952453a [CALCITE-7472] Arrow adapter should support LIKE operator push down
422952453a is described below
commit 422952453ae7199934a41215cebd4419a36ebdd9
Author: Yu Xu <12...@qq.com>
AuthorDate: Wed Apr 15 18:40:43 2026 +0800
[CALCITE-7472] Arrow adapter should support LIKE operator push down
---
.../calcite/adapter/arrow/ArrowTranslator.java | 2 +
.../calcite/adapter/arrow/ArrowAdapterTest.java | 84 ++++++++++++++++++++++
2 files changed, 86 insertions(+)
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 cb27096a09..0ec6804052 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
@@ -144,6 +144,8 @@ private ConditionToken translateMatch2(RexNode node) {
return ConditionToken.unary(fieldNames.get(inputRef.getIndex()), "istrue");
case NOT:
return translateUnary("isfalse", (RexCall) node);
+ case LIKE:
+ return translateBinary("like", null, (RexCall) node);
default:
throw new UnsupportedOperationException("Unsupported operator " + node);
}
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 e8d09d6bd9..25237eed27 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
@@ -1167,4 +1167,88 @@ static void initializeArrowState(@TempDir Path sharedTempDir)
.returns(result)
.explainContains(plan);
}
+
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-7472">[CALCITE-7472]
+ * Arrow adapter should support LIKE operator push down</a>. */
+ @Test void testArrowProjectFieldsWithLikePrefixFilter() {
+ String sql = "select \"stringField\"\n"
+ + "from arrowdatatype\n"
+ + "where \"stringField\" like '1%'";
+ String plan = "PLAN=ArrowToEnumerableConverter\n"
+ + " ArrowProject(stringField=[$3])\n"
+ + " ArrowFilter(condition=[LIKE($3, '1%')])\n"
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], "
+ + "fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]])\n\n";
+ String result = "stringField=1\nstringField=10\n";
+
+ CalciteAssert.that()
+ .with(arrow)
+ .query(sql)
+ .limit(2)
+ .returns(result)
+ .explainContains(plan);
+ }
+
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-7472">[CALCITE-7472]
+ * Arrow adapter should support LIKE operator push down</a>. */
+ @Test void testArrowProjectFieldsWithLikeSuffixFilter() {
+ String sql = "select \"stringField\"\n"
+ + "from arrowdatatype\n"
+ + "where \"stringField\" like '%5'";
+ String plan = "PLAN=ArrowToEnumerableConverter\n"
+ + " ArrowProject(stringField=[$3])\n"
+ + " ArrowFilter(condition=[LIKE($3, '%5')])\n"
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], "
+ + "fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]])\n\n";
+
+ CalciteAssert.that()
+ .with(arrow)
+ .query(sql)
+ .returnsCount(5) // 5, 15, 25, 35, 45
+ .explainContains(plan);
+ }
+
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-7472">[CALCITE-7472]
+ * Arrow adapter should support LIKE operator push down</a>. */
+ @Test void testArrowProjectFieldsWithLikeContainsFilter() {
+ String sql = "select \"stringField\"\n"
+ + "from arrowdatatype\n"
+ + "where \"stringField\" like '%2%'";
+ String plan = "PLAN=ArrowToEnumerableConverter\n"
+ + " ArrowProject(stringField=[$3])\n"
+ + " ArrowFilter(condition=[LIKE($3, '%2%')])\n"
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]],"
+ + " fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]])\n\n";
+
+ CalciteAssert.that()
+ .with(arrow)
+ .query(sql)
+ .returnsCount(14) // 2, 12, 20-29, 32, 42
+ .explainContains(plan);
+ }
+
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-7472">[CALCITE-7472]
+ * Arrow adapter should support LIKE operator push down</a>. */
+ @Test void testArrowProjectFieldsWithLikeSingleCharFilter() {
+ String sql = "select \"stringField\"\n"
+ + "from arrowdatatype\n"
+ + "where \"stringField\" like '1_'";
+ String plan = "PLAN=ArrowToEnumerableConverter\n"
+ + " ArrowProject(stringField=[$3])\n"
+ + " ArrowFilter(condition=[LIKE($3, '1_')])\n"
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], "
+ + "fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]])\n\n";
+ String result = "stringField=10\nstringField=11\n";
+
+ CalciteAssert.that()
+ .with(arrow)
+ .query(sql)
+ .limit(2)
+ .returns(result)
+ .explainContains(plan);
+ }
}