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 dd34021fbc [CALCITE-7413] Add Concat and Substring function (enabled 
in Mongodb library)
dd34021fbc is described below

commit dd34021fbc30381e8f20fb51666cef9e6c69d3e6
Author: Terran <[email protected]>
AuthorDate: Wed Feb 11 16:03:15 2026 +0800

    [CALCITE-7413] Add Concat and Substring function (enabled in Mongodb 
library)
---
 .../apache/calcite/adapter/mongodb/MongoRules.java |  2 +
 .../calcite/adapter/mongodb/MongoAdapterTest.java  | 85 ++++++++++++++++++++++
 2 files changed, 87 insertions(+)

diff --git 
a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java 
b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
index 47ad046c14..48e46e610d 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
@@ -152,6 +152,8 @@ static class RexToMongoTranslator extends 
RexVisitorImpl<String> {
       MONGO_OPERATORS.put(SqlStdOperatorTable.LESS_THAN, "$lt");
       MONGO_OPERATORS.put(SqlStdOperatorTable.LESS_THAN_OR_EQUAL, "$lte");
       MONGO_OPERATORS.put(SqlStdOperatorTable.ABS, "$abs");
+      MONGO_OPERATORS.put(SqlStdOperatorTable.CONCAT, "$concat");
+      MONGO_OPERATORS.put(SqlStdOperatorTable.SUBSTRING, "$substrCP");
     }
 
     protected RexToMongoTranslator(JavaTypeFactory typeFactory,
diff --git 
a/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
 
b/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
index ce83c6e1d8..7c79718e79 100644
--- 
a/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
+++ 
b/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
@@ -1093,4 +1093,89 @@ private static Consumer<List> mongoChecker(final 
String... expected) {
             "POP_A=17522",
             "POP_A=22576");
   }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7413";>[CALCITE-7413]
+   * Add Concat and Substring function (enabled in Mongodb library)</a>. */
+  @Test void testConcat() {
+    assertModel(MODEL)
+        .query("SELECT city || ' ' || state  from zips"
+            + " order by pop")
+        .limit(3)
+        .queryContains(
+            mongoChecker(
+                "{$project: {EXPR$0:{$concat:[{$concat:['$city',{$literal: ' 
'}]},'$state']},POP:'$pop'}}",
+                "{$sort:{POP:1}}"))
+        .returnsOrdered("EXPR$0=PENTAGON DC",
+            "EXPR$0=BRATTLEBORO VT",
+            "EXPR$0=RUTLAND VT");
+  }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7413";>[CALCITE-7413]
+   * Add Concat and Substring function (enabled in Mongodb library)</a>. */
+  @Test void testAliasNameConcat() {
+    assertModel(MODEL)
+        .query("SELECT city || ' ' || state AS full_name from zips"
+            + " order by pop")
+        .limit(3)
+        .queryContains(
+            mongoChecker(
+                "{$project: {FULL_NAME:{$concat:[{$concat:['$city',{$literal: 
' '}]},'$state']},POP:'$pop'}}",
+                "{$sort:{POP:1}}"))
+        .returnsOrdered("FULL_NAME=PENTAGON DC",
+            "FULL_NAME=BRATTLEBORO VT",
+            "FULL_NAME=RUTLAND VT");
+  }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7413";>[CALCITE-7413]
+   * Add Concat and Substring function (enabled in Mongodb library)</a>. */
+  @Test void testAliasNameMultipleConcat() {
+    assertModel(MODEL)
+        .query("SELECT city || ',' || ',' || state AS full_name from zips"
+            + " order by pop")
+        .limit(3)
+        .queryContains(
+            mongoChecker(
+                
"{$project:{FULL_NAME:{$concat:[{$concat:[{$concat:['$city',{$literal:','}]},{$literal:','}]},'$state']},POP:'$pop'}}",
+                "{$sort:{POP:1}}"))
+        .returnsOrdered("FULL_NAME=PENTAGON,,DC",
+            "FULL_NAME=BRATTLEBORO,,VT",
+            "FULL_NAME=RUTLAND,,VT");
+  }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7413";>[CALCITE-7413]
+   * Add Concat and Substring function (enabled in Mongodb library)</a>. */
+  @Test void testSubstring() {
+    assertModel(MODEL)
+        .query("SELECT SUBSTRING(city FROM 1 FOR 2) from zips"
+            + " order by pop")
+        .limit(3)
+        .queryContains(
+            mongoChecker(
+                
"{$project:{EXPR$0:{$substrCP:['$city',{$literal:1},{$literal:2}]},POP:'$pop'}}",
+                "{$sort:{POP:1}}"))
+        .returnsOrdered("EXPR$0=EN",
+            "EXPR$0=RA",
+            "EXPR$0=UT");
+  }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7413";>[CALCITE-7413]
+   * Add Concat and Substring function (enabled in Mongodb library)</a>. */
+  @Test void testAliasNameSubstring() {
+    assertModel(MODEL)
+        .query("SELECT SUBSTRING(city FROM 1 FOR 2) AS city_substring from 
zips"
+            + " order by pop")
+        .limit(3)
+        .queryContains(
+            mongoChecker(
+                
"{$project:{CITY_SUBSTRING:{$substrCP:['$city',{$literal:1},{$literal:2}]},POP:'$pop'}}",
+                "{$sort:{POP:1}}"))
+        .returnsOrdered("CITY_SUBSTRING=EN",
+            "CITY_SUBSTRING=RA",
+            "CITY_SUBSTRING=UT");
+  }
 }

Reply via email to