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