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