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