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 0748e44459 [CALCITE-7014] Support 
EQUAL/GreaterThanOrEqual/LessThanOrEqual expressions to RexNode In 
CalcitePrepare
0748e44459 is described below

commit 0748e44459809b5ddb86b32600523e2a57f35e43
Author: Yu Xu <[email protected]>
AuthorDate: Wed May 14 10:55:20 2025 +0800

    [CALCITE-7014] Support EQUAL/GreaterThanOrEqual/LessThanOrEqual expressions 
to RexNode In CalcitePrepare
---
 .../apache/calcite/prepare/CalcitePrepareImpl.java |   6 +
 .../apache/calcite/test/ReflectiveSchemaTest.java  | 130 +++++++++++++++++++++
 2 files changed, 136 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java 
b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
index 4f71fd5af5..1f036986f4 100644
--- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
+++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
@@ -1327,10 +1327,16 @@ private static List<Expression> 
simpleList(BlockStatement statement) {
             toRex(targetExpression),
             field.getName(),
             true);
+      case Equal:
+        return binary(expression, SqlStdOperatorTable.EQUALS);
       case GreaterThan:
         return binary(expression, SqlStdOperatorTable.GREATER_THAN);
+      case GreaterThanOrEqual:
+        return binary(expression, SqlStdOperatorTable.GREATER_THAN_OR_EQUAL);
       case LessThan:
         return binary(expression, SqlStdOperatorTable.LESS_THAN);
+      case LessThanOrEqual:
+        return binary(expression, SqlStdOperatorTable.LESS_THAN_OR_EQUAL);
       case Parameter:
         return parameter((ParameterExpression) expression);
       case Call:
diff --git 
a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java 
b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
index 94144cb12c..3c86c01255 100644
--- a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
+++ b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
@@ -176,6 +176,136 @@ public static class HrSchemaPlus extends HrSchema {
     assertThat(list, isListOf(100, 200, 150, 110));
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7014";>[CALCITE-7014]
+   * Support EQUAL/GreaterThanOrEqual/LessThanOrEqual expressions to RexNode
+   * in CalcitePrepare</a>. */
+  @Test void testQueryProviderWithFilter() throws Exception {
+    Connection connection = CalciteAssert
+        .that(CalciteAssert.Config.REGULAR).connect();
+    QueryProvider queryProvider = connection.unwrap(QueryProvider.class);
+    ParameterExpression e = Expressions.parameter(Employee.class, "e");
+
+    // test where empid>150 and empid<=160, result size would be 0
+    List<Object[]> list =
+        queryProvider.createQuery(
+                Expressions.call(
+                    Expressions.call(
+                        Types.of(Enumerable.class, Employee.class),
+                        null,
+                        LINQ4J_AS_ENUMERABLE_METHOD,
+                        Expressions.constant(
+                            new HrSchema().emps)),
+                    "asQueryable"),
+                Employee.class)
+            .where(
+                Expressions.lambda(
+                    Expressions.lessThanOrEqual(
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.constant(160)),
+                    e))
+            .where(
+                Expressions.lambda(
+                    Expressions.greaterThan(
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.constant(150)),
+                    e))
+            .select(
+                Expressions.<Function1<Employee, Object[]>>lambda(
+                    Expressions.new_(
+                        Object[].class,
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.call(
+                            Expressions.field(
+                                e, "name"),
+                            "toUpperCase")),
+                    e))
+            .toList();
+    assertThat(list, hasSize(0));
+
+    // test where empid>=150 and empid<=160, result size would be 1
+    list =
+        queryProvider.createQuery(
+                Expressions.call(
+                    Expressions.call(
+                        Types.of(Enumerable.class, Employee.class),
+                        null,
+                        LINQ4J_AS_ENUMERABLE_METHOD,
+                        Expressions.constant(
+                            new HrSchema().emps)),
+                    "asQueryable"),
+                Employee.class)
+            .where(
+                Expressions.lambda(
+                    Expressions.lessThanOrEqual(
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.constant(160)),
+                    e))
+            .where(
+                Expressions.lambda(
+                    Expressions.greaterThanOrEqual(
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.constant(150)),
+                    e))
+            .select(
+                Expressions.<Function1<Employee, Object[]>>lambda(
+                    Expressions.new_(
+                        Object[].class,
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.call(
+                            Expressions.field(
+                                e, "name"),
+                            "toUpperCase")),
+                    e))
+            .toList();
+    assertThat(list, hasSize(1));
+    assertThat(list.get(0), arrayWithSize(2));
+    assertThat(list.get(0)[0], is(150));
+    assertThat(list.get(0)[1], is("SEBASTIAN"));
+
+    // test where empid=150, result size would be 1
+    list =
+        queryProvider.createQuery(
+                Expressions.call(
+                    Expressions.call(
+                        Types.of(Enumerable.class, Employee.class),
+                        null,
+                        LINQ4J_AS_ENUMERABLE_METHOD,
+                        Expressions.constant(
+                            new HrSchema().emps)),
+                    "asQueryable"),
+                Employee.class)
+            .where(
+                Expressions.lambda(
+                    Expressions.equal(
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.constant(150)),
+                    e))
+            .select(
+                Expressions.<Function1<Employee, Object[]>>lambda(
+                    Expressions.new_(
+                        Object[].class,
+                        Expressions.field(
+                            e, "empid"),
+                        Expressions.call(
+                            Expressions.field(
+                                e, "name"),
+                            "toUpperCase")),
+                    e))
+            .toList();
+    assertThat(list, hasSize(1));
+    assertThat(list.get(0), arrayWithSize(2));
+    assertThat(list.get(0)[0], is(150));
+    assertThat(list.get(0)[1], is("SEBASTIAN"));
+  }
+
   /**
    * Tests a relation that is accessed via method syntax.
    * The function returns a {@link org.apache.calcite.linq4j.Queryable}.

Reply via email to