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/16 08:38:51 UTC

incubator-lens git commit: LENS-125 : Fix negative constants parsing during rewriting (Jaideep Dhok via amareshwari)

Repository: incubator-lens
Updated Branches:
  refs/heads/master 71742223f -> ecb791119


LENS-125 : Fix negative constants parsing during rewriting (Jaideep Dhok 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/ecb79111
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/ecb79111
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/ecb79111

Branch: refs/heads/master
Commit: ecb791119353ee09ac1093cbb9cfed18394b2c1c
Parents: 7174222
Author: Amareshwari Sriramdasu <am...@inmobi.com>
Authored: Tue Dec 16 13:08:14 2014 +0530
Committer: Amareshwari Sriramdasu <am...@inmobi.com>
Committed: Tue Dec 16 13:08:14 2014 +0530

----------------------------------------------------------------------
 .../org/apache/lens/cube/parse/HQLParser.java   | 38 +++++++------
 .../apache/lens/cube/parse/TestHQLParser.java   | 58 +++++++++++++-------
 2 files changed, 60 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/ecb79111/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
index 628fc05..8e41830 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
@@ -197,7 +197,7 @@ public class HQLParser {
 
   /**
    * Debug function for printing query AST to stdout
-   * 
+   *
    * @param node
    * @param level
    */
@@ -252,9 +252,9 @@ public class HQLParser {
   }
 
   /**
-   * Find a node in the tree rooted at root, given the path of type of tokens
-   * from the root's children to the desired node
-   * 
+   * Find a node in the tree rooted at root, given the path of type of tokens from the root's children to the desired
+   * node
+   *
    * @param root
    * @param path
    *          starts at the level of root's children
@@ -309,7 +309,7 @@ public class HQLParser {
 
   /**
    * Breadth first traversal of AST
-   * 
+   *
    * @param root
    * @param visitor
    * @throws SemanticException
@@ -344,11 +344,10 @@ public class HQLParser {
 
   /**
    * Recursively reconstruct query string given a query AST
-   * 
+   *
    * @param root
    * @param buf
-   *          preallocated builder where the reconstructed string will be
-   *          written
+   *          preallocated builder where the reconstructed string will be written
    */
   public static void toInfixString(ASTNode root, StringBuilder buf) {
     if (root == null) {
@@ -408,18 +407,25 @@ public class HQLParser {
 
     } else if (BINARY_OPERATORS.contains(Integer.valueOf(root.getToken().getType()))) {
       buf.append("(");
-      // Left operand
-      toInfixString((ASTNode) root.getChild(0), buf);
-      // Operand name
-      if (root.getToken().getType() != DOT) {
+      if (MINUS == rootType && root.getChildCount() == 1) {
+        // If minus has only one child, then it's a unary operator.
+        // Add Operator name first
         buf.append(' ').append(rootText.toLowerCase()).append(' ');
+        // Operand
+        toInfixString((ASTNode) root.getChild(0), buf);
       } else {
-        buf.append(rootText.toLowerCase());
+        // Left operand
+        toInfixString((ASTNode) root.getChild(0), buf);
+        // Operator name
+        if (root.getToken().getType() != DOT) {
+          buf.append(' ').append(rootText.toLowerCase()).append(' ');
+        } else {
+          buf.append(rootText.toLowerCase());
+        }
+        // Right operand
+        toInfixString((ASTNode) root.getChild(1), buf);
       }
-      // Right operand
-      toInfixString((ASTNode) root.getChild(1), buf);
       buf.append(")");
-
     } else if (LSQUARE == rootType) {
       // square brackets for array and map types
       toInfixString((ASTNode) root.getChild(0), buf);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/ecb79111/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
index 9e06d20..760aaab 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
@@ -62,9 +62,8 @@ public class TestHQLParser {
 
   @Test
   public void testCaseStatementGetString() throws Exception {
-    String query =
-        "SELECT  " + "CASE (col1 * 100)/200 + 5 " + "WHEN 'ABC' THEN 'def' " + "WHEN 'EFG' THEN 'hij' " + "ELSE 'XyZ' "
-            + "END AS ComplexCaseStatement FROM FOO";
+    String query = "SELECT  " + "CASE (col1 * 100)/200 + 5 " + "WHEN 'ABC' THEN 'def' " + "WHEN 'EFG' THEN 'hij' "
+        + "ELSE 'XyZ' " + "END AS ComplexCaseStatement FROM FOO";
 
     ASTNode tree = HQLParser.parseHQL(query);
     ASTNode select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
@@ -75,9 +74,8 @@ public class TestHQLParser {
         + "when  'ABC'  then  'def'  when  'EFG'  then  'hij'  " + "else  'XyZ'  end  complexcasestatement",
         selectStr.trim());
 
-    String q2 =
-        "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' "
-            + "else 'none' END AS Complex_Case_Statement_2" + " from FOO";
+    String q2 = "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' "
+        + "else 'none' END AS Complex_Case_Statement_2" + " from FOO";
 
     tree = HQLParser.parseHQL(q2);
     select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
@@ -87,9 +85,8 @@ public class TestHQLParser {
     Assert.assertEquals("case  when ( col1  =  'abc' ) then  'def'  " + "when ( col1  =  'ghi' ) then  'jkl'  "
         + "else  'none'  end  complex_case_statement_2", selectStr.trim());
 
-    String q3 =
-        "SELECT  " + "CASE (col1 * 100)/200 + 5 " + "WHEN 'ABC' THEN 'def' " + "WHEN 'EFG' THEN 'hij' "
-            + "END AS ComplexCaseStatement FROM FOO";
+    String q3 = "SELECT  " + "CASE (col1 * 100)/200 + 5 " + "WHEN 'ABC' THEN 'def' " + "WHEN 'EFG' THEN 'hij' "
+        + "END AS ComplexCaseStatement FROM FOO";
 
     tree = HQLParser.parseHQL(q3);
     select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
@@ -99,9 +96,8 @@ public class TestHQLParser {
     Assert.assertEquals("case ((( col1  *  100 ) /  200 ) +  5 ) " + "when  'ABC'  then  'def'  when  'EFG'  "
         + "then  'hij'  end  complexcasestatement", selectStr.trim());
 
-    String q4 =
-        "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' "
-            + "END AS Complex_Case_Statement_2" + " from FOO";
+    String q4 = "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' "
+        + "END AS Complex_Case_Statement_2" + " from FOO";
 
     tree = HQLParser.parseHQL(q4);
     select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
@@ -151,15 +147,14 @@ public class TestHQLParser {
 
   @Test
   public void testBinaryOperators() throws Exception {
-    String q1 =
-        "SELECT * FROM FOO WHERE " + "(A <=> 10) AND (B & C = 10) AND (D | E = 10) "
-            + "AND (F ^ G = 10) AND (H % 2 = 1) AND  (~I = 10)" + "AND (!J) AND (NOT K) AND TRUE AND FALSE";
+    String q1 = "SELECT * FROM FOO WHERE " + "(A <=> 10) AND (B & C = 10) AND (D | E = 10) "
+        + "AND (F ^ G = 10) AND (H % 2 = 1) AND  (~I = 10)" + "AND (!J) AND (NOT K) AND TRUE AND FALSE";
 
     ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1), TOK_INSERT, TOK_WHERE);
     String whereStr = HQLParser.getString(where);
-    String expected =
-        "(((((((((( a  <=>  10 ) and (( b  &  c ) =  10 )) " + "and (( d  |  e ) =  10 )) and (( f  ^  g ) =  10 )) "
-            + "and (( h  %  2 ) =  1 )) and ( ~  i  =  10 )) and  not  j ) " + "and  not  k ) and  true ) and  false )";
+    String expected = "(((((((((( a  <=>  10 ) and (( b  &  c ) =  10 )) "
+        + "and (( d  |  e ) =  10 )) and (( f  ^  g ) =  10 )) "
+        + "and (( h  %  2 ) =  1 )) and ( ~  i  =  10 )) and  not  j ) " + "and  not  k ) and  true ) and  false )";
     System.out.println(whereStr);
     Assert.assertEquals(expected, whereStr.trim());
   }
@@ -224,8 +219,7 @@ public class TestHQLParser {
 
   @Test
   public void testInnerJoin() throws Exception {
-    String query =
-        "select tab1.a, tab2.b from table1 tab1 inner join table tab2 on tab1.id = tab2.id where tab1.a > 123";
+    String query = "select tab1.a, tab2.b from table1 tab1 inner join table tab2 on tab1.id = tab2.id where tab1.a > 123";
     ASTNode node = HQLParser.parseHQL(query);
     ASTNode temp = HQLParser.findNodeByPath(node, TOK_FROM, TOK_JOIN);
     String expected = " table1  tab1  table  tab2 (( tab1 . id ) = ( tab2 . id ))";
@@ -273,4 +267,28 @@ public class TestHQLParser {
     Assert.assertEquals("count( tab . * )", selectStr);
   }
 
+  @Test
+  public void testNegativeLiteral() throws Exception {
+    String query1 = "select 2-1 as col1,col2 from table1";
+    ASTNode tree = HQLParser.parseHQL(query1);
+    ASTNode selectAST = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
+    HQLParser.printAST(selectAST);
+    String genQuery = HQLParser.getString(selectAST);
+    System.out.println("genQuery1: " + genQuery);
+
+    String query2 = "select -1 as col1,col2 from table1";
+    tree = HQLParser.parseHQL(query2);
+    selectAST = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
+    HQLParser.printAST(selectAST);
+    String genQuery2 = HQLParser.getString(selectAST);
+    System.out.println("genQuery2: " + genQuery2);
+
+    Assert.assertFalse(genQuery2.contains("1  -"));
+    Assert.assertTrue(genQuery2.contains("-  1"));
+
+    // Validate returned string is parseable
+    HQLParser.printAST(HQLParser.findNodeByPath(HQLParser.parseHQL("SELECT " + genQuery2 + " FROM table1"), TOK_INSERT,
+        TOK_SELECT));
+  }
+
 }