This is an automated email from the ASF dual-hosted git repository. dzamo pushed a commit to branch 1.20 in repository https://gitbox.apache.org/repos/asf/drill.git
commit 0e06b706a6ff7430db8aa7503a475c7850ba9045 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(); } - }
