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();
   }
-
 }