Skip to content

Commit dd34021

Browse files
Terranmihaibudiu
authored andcommitted
[CALCITE-7413] Add Concat and Substring function (enabled in Mongodb library)
1 parent 4385bbb commit dd34021

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ static class RexToMongoTranslator extends RexVisitorImpl<String> {
152152
MONGO_OPERATORS.put(SqlStdOperatorTable.LESS_THAN, "$lt");
153153
MONGO_OPERATORS.put(SqlStdOperatorTable.LESS_THAN_OR_EQUAL, "$lte");
154154
MONGO_OPERATORS.put(SqlStdOperatorTable.ABS, "$abs");
155+
MONGO_OPERATORS.put(SqlStdOperatorTable.CONCAT, "$concat");
156+
MONGO_OPERATORS.put(SqlStdOperatorTable.SUBSTRING, "$substrCP");
155157
}
156158

157159
protected RexToMongoTranslator(JavaTypeFactory typeFactory,

mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,4 +1093,89 @@ private static Consumer<List> mongoChecker(final String... expected) {
10931093
"POP_A=17522",
10941094
"POP_A=22576");
10951095
}
1096+
1097+
/** Test case for
1098+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7413">[CALCITE-7413]
1099+
* Add Concat and Substring function (enabled in Mongodb library)</a>. */
1100+
@Test void testConcat() {
1101+
assertModel(MODEL)
1102+
.query("SELECT city || ' ' || state from zips"
1103+
+ " order by pop")
1104+
.limit(3)
1105+
.queryContains(
1106+
mongoChecker(
1107+
"{$project: {EXPR$0:{$concat:[{$concat:['$city',{$literal: ' '}]},'$state']},POP:'$pop'}}",
1108+
"{$sort:{POP:1}}"))
1109+
.returnsOrdered("EXPR$0=PENTAGON DC",
1110+
"EXPR$0=BRATTLEBORO VT",
1111+
"EXPR$0=RUTLAND VT");
1112+
}
1113+
1114+
/** Test case for
1115+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7413">[CALCITE-7413]
1116+
* Add Concat and Substring function (enabled in Mongodb library)</a>. */
1117+
@Test void testAliasNameConcat() {
1118+
assertModel(MODEL)
1119+
.query("SELECT city || ' ' || state AS full_name from zips"
1120+
+ " order by pop")
1121+
.limit(3)
1122+
.queryContains(
1123+
mongoChecker(
1124+
"{$project: {FULL_NAME:{$concat:[{$concat:['$city',{$literal: ' '}]},'$state']},POP:'$pop'}}",
1125+
"{$sort:{POP:1}}"))
1126+
.returnsOrdered("FULL_NAME=PENTAGON DC",
1127+
"FULL_NAME=BRATTLEBORO VT",
1128+
"FULL_NAME=RUTLAND VT");
1129+
}
1130+
1131+
/** Test case for
1132+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7413">[CALCITE-7413]
1133+
* Add Concat and Substring function (enabled in Mongodb library)</a>. */
1134+
@Test void testAliasNameMultipleConcat() {
1135+
assertModel(MODEL)
1136+
.query("SELECT city || ',' || ',' || state AS full_name from zips"
1137+
+ " order by pop")
1138+
.limit(3)
1139+
.queryContains(
1140+
mongoChecker(
1141+
"{$project:{FULL_NAME:{$concat:[{$concat:[{$concat:['$city',{$literal:','}]},{$literal:','}]},'$state']},POP:'$pop'}}",
1142+
"{$sort:{POP:1}}"))
1143+
.returnsOrdered("FULL_NAME=PENTAGON,,DC",
1144+
"FULL_NAME=BRATTLEBORO,,VT",
1145+
"FULL_NAME=RUTLAND,,VT");
1146+
}
1147+
1148+
/** Test case for
1149+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7413">[CALCITE-7413]
1150+
* Add Concat and Substring function (enabled in Mongodb library)</a>. */
1151+
@Test void testSubstring() {
1152+
assertModel(MODEL)
1153+
.query("SELECT SUBSTRING(city FROM 1 FOR 2) from zips"
1154+
+ " order by pop")
1155+
.limit(3)
1156+
.queryContains(
1157+
mongoChecker(
1158+
"{$project:{EXPR$0:{$substrCP:['$city',{$literal:1},{$literal:2}]},POP:'$pop'}}",
1159+
"{$sort:{POP:1}}"))
1160+
.returnsOrdered("EXPR$0=EN",
1161+
"EXPR$0=RA",
1162+
"EXPR$0=UT");
1163+
}
1164+
1165+
/** Test case for
1166+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7413">[CALCITE-7413]
1167+
* Add Concat and Substring function (enabled in Mongodb library)</a>. */
1168+
@Test void testAliasNameSubstring() {
1169+
assertModel(MODEL)
1170+
.query("SELECT SUBSTRING(city FROM 1 FOR 2) AS city_substring from zips"
1171+
+ " order by pop")
1172+
.limit(3)
1173+
.queryContains(
1174+
mongoChecker(
1175+
"{$project:{CITY_SUBSTRING:{$substrCP:['$city',{$literal:1},{$literal:2}]},POP:'$pop'}}",
1176+
"{$sort:{POP:1}}"))
1177+
.returnsOrdered("CITY_SUBSTRING=EN",
1178+
"CITY_SUBSTRING=RA",
1179+
"CITY_SUBSTRING=UT");
1180+
}
10961181
}

0 commit comments

Comments
 (0)