You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2014/12/23 13:17:19 UTC

incubator-lens git commit: LENS-141 : Exclude join condition as filter in inner fact query in ColumnarSqlRewriter (Sushil Mohanty via amareshwari)

Repository: incubator-lens
Updated Branches:
  refs/heads/master f18e60097 -> e51c14c04


LENS-141 : Exclude join condition as filter in inner fact query in ColumnarSqlRewriter (Sushil Mohanty via amareshwari)


Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/e51c14c0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/e51c14c0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/e51c14c0

Branch: refs/heads/master
Commit: e51c14c042b80e9cb960cb3e1be0da1054506a32
Parents: f18e600
Author: Amareshwari Sriramdasu <am...@inmobi.com>
Authored: Tue Dec 23 17:47:08 2014 +0530
Committer: Amareshwari Sriramdasu <am...@inmobi.com>
Committed: Tue Dec 23 17:47:08 2014 +0530

----------------------------------------------------------------------
 .../lens/driver/jdbc/ColumnarSQLRewriter.java   | 23 ++++++++++++++++++
 .../driver/jdbc/TestColumnarSQLRewriter.java    | 25 ++++++++++++++++++++
 2 files changed, 48 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/e51c14c0/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/ColumnarSQLRewriter.java
----------------------------------------------------------------------
diff --git a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/ColumnarSQLRewriter.java b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/ColumnarSQLRewriter.java
index b05d87f..5b7f519 100644
--- a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/ColumnarSQLRewriter.java
+++ b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/ColumnarSQLRewriter.java
@@ -419,6 +419,16 @@ public class ColumnarSQLRewriter implements QueryRewriter {
 
     String filterCond = "";
     if (node.getToken().getType() == HiveParser.KW_AND) {
+
+      ASTNode parentNode = (ASTNode) node.getChild(0).getParent();
+      // Skip the join conditions used as "and" for fact filter pushdown.
+      // eg. inner join fact.id1 = dim.id and fact.id2 = dim.id
+      if (parentNode.getChild(0).getChild(0).getType() == HiveParser.DOT
+          && parentNode.getChild(0).getChild(1).getType() == HiveParser.DOT
+          && parentNode.getChild(1).getChild(0).getType() == HiveParser.DOT
+          && parentNode.getChild(1).getChild(1).getType() == HiveParser.DOT)
+        return;
+
       ASTNode right = (ASTNode) node.getChild(1);
       filterCond = HQLParser.getString(right);
     }
@@ -498,6 +508,19 @@ public class ColumnarSQLRewriter implements QueryRewriter {
         ASTNode left = (ASTNode) node.getChild(0);
         ASTNode right = (ASTNode) node.getChild(1);
 
+        ASTNode parentNode = (ASTNode) node.getParent();
+        HQLParser.printAST(parentNode);
+
+        // Skip the join conditions used as "and" while building subquery
+        // eg. inner join fact.id1 = dim.id and fact.id2 = dim.id
+        if (parentNode.getChild(0).getChild(0).getType() == HiveParser.DOT
+            && parentNode.getChild(0).getChild(1).getType() == HiveParser.DOT
+            && parentNode.getChild(1).getChild(0).getType() == HiveParser.DOT
+            && parentNode.getChild(1).getChild(1).getType() == HiveParser.DOT) {
+          HQLParser.printAST(parentNode);
+          return;
+        }
+
         // Get the fact and dimension columns in table_name.column_name format
         String factJoinKeys = HQLParser.getString(left).toString().replaceAll("\\s+", "")
             .replaceAll("[(,)]", "");

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/e51c14c0/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
----------------------------------------------------------------------
diff --git a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
index 6ca0d2d..5af6ead 100644
--- a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
+++ b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestColumnarSQLRewriter.java
@@ -735,6 +735,31 @@ public void testCountReplace() throws ParseException, SemanticException, LensExc
     compareQueries(expected, actual);
   }
 
+  @Test
+  public void testExcludeJoinFilterFromFactQuery() throws ParseException, SemanticException, LensException {
+
+    String query = "SELECT (dim1 . date) dim1_date , sum((f . msr1)) msr1 , (dim2 . name) dim2_name  "
+        + "FROM fact f  INNER JOIN dim1 dim1 ON f.dim1_id = dim1.id  and f.m2 = '1234' "
+        + "INNER JOIN dim2 dim2 ON f.dim2_id = dim2.id  and f.dim3_id = dim2.id "
+        + "WHERE ((dim1 . date) = '2014-11-25 00:00:00')  and f.m4  is not null "
+        + "GROUP BY (dim1 . date),  (dim2 . name) ORDER BY dim1_date";
+
+    SessionState.start(conf);
+
+    String actual = qtest.rewrite(query, conf);
+    String expected = "select ( dim1___dim1 . date ) dim1_date , sum(sum_fact___f_msr1) msr1 , ( dim2___dim2 . name ) dim2_name  "
+        + "from  (select fact___f.dim2_id, fact___f.dim1_id, fact___f.dim3_id, fact___f.m4, fact___f.m2,sum(( fact___f . msr1 )) "
+        + "as sum_fact___f_msr1 from fact fact___f where ( fact___f . m4 ) is not null  and (( fact___f . m2 ) =  '1234' ) and "
+        + "fact___f.dim1_id in  (  select dim1 .id from dim1 where (( dim1. date ) =  '2014-11-25 00:00:00' ) )  "
+        + "group by fact___f.dim2_id, fact___f.dim1_id, fact___f.dim3_id, fact___f.m4, fact___f.m2) fact___f  inner join dim1 "
+        + "dim1___dim1 on ((( fact___f . dim1_id ) = ( dim1___dim1 . id )) and (( fact___f . m2 ) =  '1234' ))  inner join "
+        + "dim2 dim2___dim2 on ((( fact___f . dim2_id ) = ( dim2___dim2 . id )) and (( fact___f . dim3_id ) = ( dim2___dim2 . id ))) "
+        + " where ((( dim1___dim1 . date ) =  '2014-11-25 00:00:00' ) and ( fact___f . m4 ) is not null ) group by ( dim1___dim1 . date ), "
+        + "( dim2___dim2 . name ) order by dim1_date  asc";
+
+    compareQueries(expected, actual);
+  }
+
   /**
    * Test replace db name.
    *