This is an automated email from the ASF dual-hosted git repository.
dzamo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
The following commit(s) were added to refs/heads/master by this push:
new 4a95a545b0 DRILL-8238: Translation of IS NOT NULL($1) is not supported
by MongoProject
4a95a545b0 is described below
commit 4a95a545b000bedd1f6883bc51eae7cc759a06a6
Author: James Turton <[email protected]>
AuthorDate: Thu Nov 3 09:59:28 2022 +0200
DRILL-8238: Translation of IS NOT NULL($1) is not supported by MongoProject
---
.../store/mongo/plan/RexToMongoTranslator.java | 25 +++++++++++++++++++---
.../drill/exec/store/mongo/MongoTestConstants.java | 5 +++--
.../exec/store/mongo/TestMongoFilterPushDown.java | 21 ++++++++++++++++++
.../exec/store/mongo/TestMongoProjectPushDown.java | 18 +++++++++++++---
4 files changed, 61 insertions(+), 8 deletions(-)
diff --git
a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/RexToMongoTranslator.java
b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/RexToMongoTranslator.java
index a1e9f64512..16a51d455f 100644
---
a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/RexToMongoTranslator.java
+++
b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/RexToMongoTranslator.java
@@ -139,11 +139,12 @@ class RexToMongoTranslator extends
RexVisitorImpl<BsonValue> {
if (call.getKind() == SqlKind.CAST) {
return strings.get(0);
}
- String stdOperator = MONGO_OPERATORS.get(call.getOperator());
+ SqlOperator sqlOperator = call.getOperator();
+ String stdOperator = MONGO_OPERATORS.get(sqlOperator);
if (stdOperator != null) {
return new BsonDocument(stdOperator, new BsonArray(strings));
}
- if (call.getOperator() == SqlStdOperatorTable.ITEM) {
+ if (sqlOperator == SqlStdOperatorTable.ITEM) {
RexNode op1 = call.operands.get(1);
if (op1 instanceof RexLiteral) {
if (op1.getType().getSqlTypeName() == SqlTypeName.INTEGER) {
@@ -154,7 +155,7 @@ class RexToMongoTranslator extends
RexVisitorImpl<BsonValue> {
}
}
}
- if (call.getOperator() == SqlStdOperatorTable.CASE) {
+ if (sqlOperator == SqlStdOperatorTable.CASE) {
// case(a, b, c) -> $cond:[a, b, c]
// case(a, b, c, d) -> $cond:[a, b, $cond:[c, d, null]]
// case(a, b, c, d, e) -> $cond:[a, b, $cond:[c, d, e]]
@@ -180,6 +181,24 @@ class RexToMongoTranslator extends
RexVisitorImpl<BsonValue> {
}
return result;
}
+ if (sqlOperator == SqlStdOperatorTable.IS_NULL) {
+ BsonDocument result = new BsonDocument();
+ BsonArray args = new BsonArray();
+ args.add(strings.get(0));
+ args.add(BsonNull.VALUE);
+ // Perf: the $eq operator can make use of indexes in Mongo
+ result.put(MongoOp.EQUAL.getCompareOp(), args);
+ return result;
+ }
+ if (sqlOperator == SqlStdOperatorTable.IS_NOT_NULL) {
+ BsonDocument result = new BsonDocument();
+ BsonArray args = new BsonArray();
+ args.add(strings.get(0));
+ args.add(BsonNull.VALUE);
+ // Perf: the $ne operator can make use of indexes in Mongo
+ result.put(MongoOp.NOT_EQUAL.getCompareOp(), args);
+ return result;
+ }
throw new IllegalArgumentException("Translation of " + call + " is not
supported by MongoProject");
}
diff --git
a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
index 1e9d24340b..4dbb605429 100644
---
a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
+++
b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
@@ -67,8 +67,9 @@ public interface MongoTestConstants {
// test query template1
String TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_1 = "SELECT `employee_id` FROM
mongo.%s.`%s`";
- String TEST_QUERY_PROJECT_PUSH_DOWN__TEMPLATE_2 = "select `employee_id`,
`rating` from mongo.%s.`%s`";
- String TEST_QUERY_PROJECT_PUSH_DOWN__TEMPLATE_3 = "select * from
mongo.%s.`%s`";
+ String TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_2 = "select `employee_id`,
`rating`, coalesce(`full_name`, 'Bob') from mongo.%s.`%s`";
+ String TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_3 = "select * from
mongo.%s.`%s`";
+ String TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_4 = "select
coalesce(`position_id`, -1) position_id_or_default from mongo.%s.`%s`";
String TEST_FILTER_PUSH_DOWN_IS_NULL_QUERY_TEMPLATE_1 = "SELECT
`employee_id` FROM mongo.%s.`%s` where position_id is null";
String TEST_FILTER_PUSH_DOWN_IS_NOT_NULL_QUERY_TEMPLATE_1 = "SELECT
`employee_id` FROM mongo.%s.`%s` where position_id is not null";
String TEST_FILTER_PUSH_DOWN_EQUAL_QUERY_TEMPLATE_1 = "SELECT `full_name`
FROM mongo.%s.`%s` where rating = 52.17";
diff --git
a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoFilterPushDown.java
b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoFilterPushDown.java
index b0644c1861..7a28ebde9f 100644
---
a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoFilterPushDown.java
+++
b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoFilterPushDown.java
@@ -60,4 +60,25 @@ public class TestMongoFilterPushDown extends MongoTestBase {
.go();
}
+ @Test
+ public void testFilterPushDownIsNull() throws Exception {
+ String queryString =
String.format(TEST_FILTER_PUSH_DOWN_IS_NULL_QUERY_TEMPLATE_1, EMPLOYEE_DB,
EMPINFO_COLLECTION);
+
+ testBuilder()
+ .sqlQuery(queryString)
+ .unOrdered()
+ .expectsNumRecords(2)
+ .go();
+ }
+
+ @Test
+ public void testFilterPushDownIsNotNull() throws Exception {
+ String queryString =
String.format(TEST_FILTER_PUSH_DOWN_IS_NOT_NULL_QUERY_TEMPLATE_1, EMPLOYEE_DB,
EMPINFO_COLLECTION);
+
+ testBuilder()
+ .sqlQuery(queryString)
+ .unOrdered()
+ .expectsNumRecords(17)
+ .go();
+ }
}
diff --git
a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoProjectPushDown.java
b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoProjectPushDown.java
index 372ec6d5e4..e615c0f19f 100644
---
a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoProjectPushDown.java
+++
b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoProjectPushDown.java
@@ -81,7 +81,7 @@ public class TestMongoProjectPushDown extends MongoTestBase {
@Test
public void testMultipleColumnsProject() throws Exception {
- String query = String.format(TEST_QUERY_PROJECT_PUSH_DOWN__TEMPLATE_2,
EMPLOYEE_DB, EMPINFO_COLLECTION);
+ String query = String.format(TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_2,
EMPLOYEE_DB, EMPINFO_COLLECTION);
testBuilder()
.sqlQuery(query)
@@ -93,7 +93,7 @@ public class TestMongoProjectPushDown extends MongoTestBase {
@Test
public void testStarProject() throws Exception {
- String query = String.format(TEST_QUERY_PROJECT_PUSH_DOWN__TEMPLATE_3,
EMPLOYEE_DB, EMPINFO_COLLECTION);
+ String query = String.format(TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_3,
EMPLOYEE_DB, EMPINFO_COLLECTION);
testBuilder()
.sqlQuery(query)
.unOrdered()
@@ -101,6 +101,19 @@ public class TestMongoProjectPushDown extends
MongoTestBase {
.go();
}
+ // DRILL-8238
+ @Test
+ public void testOperatorsProject() throws Exception {
+ String query = String.format(TEST_QUERY_PROJECT_PUSH_DOWN_TEMPLATE_4,
EMPLOYEE_DB, EMPINFO_COLLECTION);
+
+ testBuilder()
+ .sqlQuery(query)
+ .unOrdered()
+ .baselineColumns("position_id_or_default")
+ .expectsNumRecords(19)
+ .go();
+ }
+
@Test // DRILL-8190
public void testProjectWithJoin() throws Exception {
String query = "SELECT sum(s1.sales) s1_sales,\n" +
@@ -122,5 +135,4 @@ public class TestMongoProjectPushDown extends MongoTestBase
{
.baselineValues(1194L, 1194L)
.go();
}
-
}