You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by dz...@apache.org on 2022/12/22 13:05:36 UTC
[drill] 05/13: DRILL-8238: Translation of IS NOT NULL($1) is not supported by MongoProject
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 <91...@users.noreply.github.com>
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();
}
-
}