Repository: lens Updated Branches: refs/heads/master 34223e880 -> 4e822031f
LENS-1033 : Fix HQLParser to honor double spaces in literals Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/4e822031 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/4e822031 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/4e822031 Branch: refs/heads/master Commit: 4e822031f4a3d75b45281ec5aadaf8f64cbb7542 Parents: 34223e8 Author: Amareshwari Sriramadasu <amareshw...@apache.org> Authored: Mon May 9 10:08:31 2016 +0530 Committer: Amareshwari Sriramadasu <amareshw...@apache.org> Committed: Mon May 9 10:08:31 2016 +0530 ---------------------------------------------------------------------- .../org/apache/lens/cube/parse/HQLParser.java | 36 ++++---- .../lens/cube/parse/TestBaseCubeQueries.java | 36 ++++---- .../lens/cube/parse/TestBridgeTableQueries.java | 8 +- .../lens/cube/parse/TestCubeRewriter.java | 24 +++--- .../lens/cube/parse/TestExpressionContext.java | 64 +++++++------- .../apache/lens/cube/parse/TestHQLParser.java | 87 ++++++++++++-------- .../cube/parse/join/TestBridgeTableJoinCtx.java | 42 +++++----- .../driver/jdbc/TestColumnarSQLRewriter.java | 30 +++---- 8 files changed, 170 insertions(+), 157 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/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 0d00188..1f6b66c 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 @@ -372,7 +372,7 @@ public final class HQLParser { || KW_FALSE == rootType || KW_FORMATTED == rootType || KW_EXTENDED == rootType || KW_DEPENDENCY == rootType) { // StringLiterals should not be lower cased. if (StringLiteral == rootType) { - buf.append(' ').append(rootText).append(' '); + buf.append(rootText); } else if (KW_TRUE == rootType) { buf.append(" true "); } else if (KW_FALSE == rootType) { @@ -380,12 +380,9 @@ public final class HQLParser { } else if (Identifier == rootType && TOK_SELEXPR == root.getParent().getType()) { // back quote column alias in all cases. This is required since some alias values can match DB keywords // (example : year as alias) and in such case queries can fail on certain DBs if the alias in not back quoted - buf.append(" as `").append(rootText).append("` "); - } else if (Identifier == rootType && TOK_FUNCTIONSTAR == root.getParent().getType()) { - // count(*) or count(someTab.*): Don't append space after the identifier - buf.append(" ").append(rootText == null ? "" : rootText.toLowerCase()); + buf.append(" as `").append(rootText).append("`"); } else { - buf.append(" ").append(rootText == null ? "" : rootText.toLowerCase()).append(" "); + buf.append(rootText == null ? "" : rootText.toLowerCase()); } } else if (TOK_ALLCOLREF == rootType) { @@ -395,14 +392,14 @@ public final class HQLParser { } buf.append("."); } - buf.append(" * "); + buf.append("*"); } else if (TOK_FUNCTIONSTAR == rootType) { if (root.getChildCount() > 0) { for (int i = 0; i < root.getChildCount(); i++) { toInfixString((ASTNode) root.getChild(i), buf); } } - buf.append("(*) "); + buf.append("(*)"); } else if (UNARY_OPERATORS.contains(rootType)) { if (KW_NOT == rootType) { // Check if this is actually NOT IN @@ -410,7 +407,7 @@ public final class HQLParser { buf.append(" not "); } } else if (TILDE == rootType) { - buf.append(" ~ "); + buf.append(" ~"); } for (int i = 0; i < root.getChildCount(); i++) { @@ -429,7 +426,7 @@ public final class HQLParser { 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(' '); + buf.append(rootText.toLowerCase()); // Operand toInfixString((ASTNode) root.getChild(0), buf); } else { @@ -508,7 +505,7 @@ public final class HQLParser { // Distinct is a different case. String fname = root.getChild(0).getText(); - buf.append(fname.toLowerCase()).append("( distinct "); + buf.append(fname.toLowerCase()).append("(distinct "); // Arguments to distinct separated by comma for (int i = 1; i < root.getChildCount(); i++) { @@ -528,9 +525,8 @@ public final class HQLParser { colStr = colStr.substring(1, colStr.length() - 1); } buf.append(colStr); - buf.append(" "); } - buf.append(" ").append(rootType == TOK_TABSORTCOLNAMEDESC ? "desc" : "asc").append(" "); + buf.append(rootType == TOK_TABSORTCOLNAMEDESC ? " desc" : " asc"); } else if (TOK_SELECT == rootType || TOK_ORDERBY == rootType || TOK_GROUPBY == rootType) { for (int i = 0; i < root.getChildCount(); i++) { toInfixString((ASTNode) root.getChild(i), buf); @@ -582,7 +578,7 @@ public final class HQLParser { private static void functionString(ASTNode root, StringBuilder buf) { // special handling for CASE udf if (findNodeByPath(root, KW_CASE) != null) { - buf.append(" case "); + buf.append("case "); toInfixString((ASTNode) root.getChild(1), buf); // each of the conditions ArrayList<Node> caseChildren = root.getChildren(); @@ -603,12 +599,12 @@ public final class HQLParser { toInfixString((ASTNode) caseChildren.get(nchildren - 1), buf); } - buf.append(" end "); + buf.append(" end"); } else if (findNodeByPath(root, KW_WHEN) != null) { // 2nd form of case statement - buf.append(" case "); + buf.append("case "); // each of the conditions ArrayList<Node> caseChildren = root.getChildren(); int from = 1; @@ -628,17 +624,17 @@ public final class HQLParser { toInfixString((ASTNode) caseChildren.get(nchildren - 1), buf); } - buf.append(" end "); + buf.append(" end"); } else if (findNodeByPath(root, TOK_ISNULL) != null) { // IS NULL operator toInfixString((ASTNode) root.getChild(1), buf); - buf.append(" is null "); + buf.append(" is null"); } else if (findNodeByPath(root, TOK_ISNOTNULL) != null) { // IS NOT NULL operator toInfixString((ASTNode) root.getChild(1), buf); - buf.append(" is not null "); + buf.append(" is not null"); } else if (root.getChild(0).getType() == Identifier && ((ASTNode) root.getChild(0)).getToken().getText().equalsIgnoreCase("between")) { @@ -723,7 +719,7 @@ public final class HQLParser { public static String getString(ASTNode tree) { StringBuilder buf = new StringBuilder(); toInfixString(tree, buf); - return buf.toString().trim().replaceAll("\\s+", " "); + return buf.toString().trim(); } public static String getColName(ASTNode node) { http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java index fcf975e..bc4f2a1 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java @@ -482,10 +482,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite { getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE")); compareContains(expected1, hqlQuery); compareContains(expected2, hqlQuery); - assertTrue(hqlQuery.toLowerCase().startsWith("select coalesce(mq1.expr1, mq2.expr1) `func1( dim1 )`," - + " coalesce(mq1.expr2, mq2.expr2) `func2( dim1 )`, mq2.msr12 msr12, mq1.roundedmsr2 roundedmsr2 from ") - || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.expr1, mq2.expr1) `func1( dim1 )`," - + " coalesce(mq1.expr2, mq2.expr2) `func2( dim1 )`, mq1.msr12 msr12, mq2.roundedmsr2 roundedmsr2 from "), + assertTrue(hqlQuery.toLowerCase().startsWith("select coalesce(mq1.expr1, mq2.expr1) `func1(dim1)`," + + " coalesce(mq1.expr2, mq2.expr2) `func2(dim1)`, mq2.msr12 msr12, mq1.roundedmsr2 roundedmsr2 from ") + || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.expr1, mq2.expr1) `func1(dim1)`," + + " coalesce(mq1.expr2, mq2.expr2) `func2(dim1)`, mq1.msr12 msr12, mq2.roundedmsr2 roundedmsr2 from "), hqlQuery); assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1 AND mq1.expr2 <=> mq2.expr2"), hqlQuery); @@ -507,10 +507,10 @@ public class TestBaseCubeQueries extends TestQueryRewrite { compareContains(expected1, hqlQuery); compareContains(expected2, hqlQuery); assertTrue(hqlQuery.toLowerCase().startsWith( - "select coalesce(mq1.expr1, mq2.expr1) `func1( dim1 )`, mq2.expr2 `directmsr`, mq1.roundedmsr2 roundedmsr2 " + "select coalesce(mq1.expr1, mq2.expr1) `func1(dim1)`, mq2.expr2 `directmsr`, mq1.roundedmsr2 roundedmsr2 " + "from ") || hqlQuery.toLowerCase().startsWith( - "select coalesce(mq1.expr1, mq2.expr1) `func1( dim1 )`, mq1.expr2 `directmsr`, mq2.roundedmsr2 roundedmsr2 " + "select coalesce(mq1.expr1, mq2.expr1) `func1(dim1)`, mq1.expr2 `directmsr`, mq2.roundedmsr2 roundedmsr2 " + "from "), hqlQuery.toLowerCase()); assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"), @@ -530,9 +530,9 @@ public class TestBaseCubeQueries extends TestQueryRewrite { compareContains(expected1, hqlQuery); compareContains(expected2, hqlQuery); assertTrue(hqlQuery.toLowerCase().startsWith( - "select coalesce(mq1.dim1, mq2.dim1) dim1, mq2.expr2 `avg( msr12 )`, mq1.expr3 `avg( msr2 )` from ") + "select coalesce(mq1.dim1, mq2.dim1) dim1, mq2.expr2 `avg(msr12)`, mq1.expr3 `avg(msr2)` from ") || hqlQuery.toLowerCase().startsWith( - "select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.expr2 `avg( msr12 )`, mq2.expr3 `avg( msr2 )` from "), hqlQuery); + "select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.expr2 `avg(msr12)`, mq2.expr3 `avg(msr2)` from "), hqlQuery); assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.dim1 <=> mq2.dim1"), hqlQuery); @@ -624,9 +624,9 @@ public class TestBaseCubeQueries extends TestQueryRewrite { compareContains(expected1, hqlQuery); compareContains(expected2, hqlQuery); assertTrue(hqlQuery.toLowerCase().startsWith("select coalesce(mq1.booleancut, mq2.booleancut) booleancut, " - + "mq2.expr2 `round((sum( msr2 ) / 1000 ))`, mq1.expr3 `avg(( msr13 + msr14 ))` from ") + + "mq2.expr2 `round((sum(msr2) / 1000))`, mq1.expr3 `avg((msr13 + msr14))` from ") || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.booleancut, mq2.booleancut) booleancut, " - + "mq1.expr2 `round((sum( msr2 ) / 1000 ))`, mq2.expr3 `avg(( msr13 + msr14 ))` from "), hqlQuery); + + "mq1.expr2 `round((sum(msr2) / 1000))`, mq2.expr3 `avg((msr13 + msr14))` from "), hqlQuery); assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.booleancut <=> mq2.booleancut"), hqlQuery); @@ -656,9 +656,9 @@ public class TestBaseCubeQueries extends TestQueryRewrite { compareContains(expected1, hqlQuery); compareContains(expected2, hqlQuery); assertTrue(hqlQuery.toLowerCase().startsWith("select coalesce(mq1.booleancut, mq2.booleancut) booleancut, " - + "mq2.expr2 `round((sum( msr2 ) / 1000 ))`, mq1.expr3 `avg(( msr13 + msr14 ))` from ") + + "mq2.expr2 `round((sum(msr2) / 1000))`, mq1.expr3 `avg((msr13 + msr14))` from ") || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.booleancut, mq2.booleancut) booleancut, " - + "mq1.expr2 `round((sum( msr2 ) / 1000 ))`, mq2.expr3 `avg(( msr13 + msr14 ))` from "), hqlQuery); + + "mq1.expr2 `round((sum(msr2) / 1000))`, mq2.expr3 `avg((msr13 + msr14))` from "), hqlQuery); assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.booleancut <=> mq2.booleancut"), hqlQuery); @@ -807,7 +807,7 @@ public class TestBaseCubeQueries extends TestQueryRewrite { || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.dim1, mq2.dim1) dim1, " + "coalesce(mq1.dim11, mq2.dim11) dim11, mq1.msr12 msr12, mq2.roundedmsr2 roundedmsr2 from "), hqlQuery); assertTrue(hqlQuery.contains(joinSubString) - && hqlQuery.endsWith(endSubString + " WHERE (( alias0 + roundedmsr2 ) <= 1000 )"), hqlQuery); + && hqlQuery.endsWith(endSubString + " WHERE ((alias0 + roundedmsr2) <= 1000)"), hqlQuery); // No push-down-able having clauses. hqlQuery = rewrite("select dim1, dim11, msr12, roundedmsr2 from basecube where " + TWO_DAYS_RANGE @@ -830,7 +830,7 @@ public class TestBaseCubeQueries extends TestQueryRewrite { || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.dim1, mq2.dim1) dim1, coalesce(mq1.dim11, mq2.dim11) " + "dim11, mq1.msr12 msr12, mq2.roundedmsr2 roundedmsr2 from "), hqlQuery); assertTrue(hqlQuery.contains(joinSubString) - && hqlQuery.endsWith(endSubString + " WHERE (( alias0 + roundedmsr2 ) <= 1000 )"), hqlQuery); + && hqlQuery.endsWith(endSubString + " WHERE ((alias0 + roundedmsr2) <= 1000)"), hqlQuery); // function over expression of two functions over measures hqlQuery = rewrite("select dim1, dim11, msr12, roundedmsr2 from basecube where " + TWO_DAYS_RANGE @@ -853,7 +853,7 @@ public class TestBaseCubeQueries extends TestQueryRewrite { || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.dim1, mq2.dim1) dim1, coalesce(mq1.dim11, mq2.dim11) " + "dim11, mq1.msr12 msr12, mq2.roundedmsr2 roundedmsr2 from "), hqlQuery); assertTrue(hqlQuery.contains(joinSubString) - && hqlQuery.endsWith(endSubString + " WHERE (round(( alias0 + roundedmsr2 )) <= 1000 )"), hqlQuery); + && hqlQuery.endsWith(endSubString + " WHERE (round((alias0 + roundedmsr2)) <= 1000)"), hqlQuery); // Following test cases only select dimensions, and all the measures are in having. @@ -905,7 +905,7 @@ public class TestBaseCubeQueries extends TestQueryRewrite { compareContains(expected2, hqlQuery); assertTrue(hqlQuery.toLowerCase().startsWith(begin), hqlQuery); assertTrue(hqlQuery.contains(joinSubString) - && hqlQuery.endsWith(endSubString + " WHERE (( alias0 + alias1 ) <= 1000 )"), hqlQuery); + && hqlQuery.endsWith(endSubString + " WHERE ((alias0 + alias1) <= 1000)"), hqlQuery); hqlQuery = rewrite("select dim1, dim11 from basecube where " + TWO_DAYS_RANGE + "having msr12 > 2 and roundedmsr2 > 0 and flooredmsr12+roundedmsr2 <= 1000", conf); @@ -923,7 +923,7 @@ public class TestBaseCubeQueries extends TestQueryRewrite { compareContains(expected2, hqlQuery); assertTrue(hqlQuery.toLowerCase().startsWith(begin), hqlQuery); assertTrue(hqlQuery.contains(joinSubString) - && hqlQuery.endsWith(endSubString + " WHERE (( alias0 + alias1 ) <= 1000 )"), hqlQuery); + && hqlQuery.endsWith(endSubString + " WHERE ((alias0 + alias1) <= 1000)"), hqlQuery); hqlQuery = rewrite("select dim1, dim11 from basecube where " + TWO_DAYS_RANGE + "having msr12 > 2 or roundedmsr2 > 0 or flooredmsr12+roundedmsr2 <= 1000", conf); @@ -936,7 +936,7 @@ public class TestBaseCubeQueries extends TestQueryRewrite { "select basecube.dim1 as dim1, basecube.dim11 as dim11, round(sum(basecube.msr2)/1000) as alias1 FROM ", null, " group by basecube.dim1, basecube.dim11", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE")); - String havingToWhere = " WHERE (( alias0 > 2 ) or ( alias1 > 0 ) or (( alias2 + alias1 ) <= 1000 ))"; + String havingToWhere = " WHERE ((alias0 > 2) or (alias1 > 0) or ((alias2 + alias1) <= 1000))"; assertFalse(hqlQuery.toLowerCase().contains("having")); compareContains(expected1, hqlQuery); http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java index b89ed2c..2f00244 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java @@ -686,9 +686,9 @@ public class TestBridgeTableQueries extends TestQueryRewrite { TestCubeRewriter.compareContains(expected1, hqlQuery); TestCubeRewriter.compareContains(expected2, hqlQuery); String lower = hqlQuery.toLowerCase(); - assertTrue(lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr(( usersports . name ), 3 )`," + assertTrue(lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr((usersports.name), 3)`," + " mq2.msr2 msr2, mq1.msr12 msr12 from ") - || lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr(( usersports . name ), 3 )`, mq1.msr2 msr2, " + || lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr((usersports.name), 3)`, mq1.msr2 msr2, " + "mq2.msr12 msr12 from "), hqlQuery); @@ -762,9 +762,9 @@ public class TestBridgeTableQueries extends TestQueryRewrite { TestCubeRewriter.compareContains(expected1, hqlQuery); TestCubeRewriter.compareContains(expected2, hqlQuery); String lower = hqlQuery.toLowerCase(); - assertTrue(lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr(( usersports . name ), 3 )`," + assertTrue(lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr((usersports.name), 3)`," + " mq2.msr2 msr2, mq1.msr12 msr12 from ") - || lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr(( usersports . name ), 3 )`, mq1.msr2 msr2," + || lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr((usersports.name), 3)`, mq1.msr2 msr2," + " mq2.msr12 msr12 from "), hqlQuery); http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java index a223449..f4ef5ca 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java @@ -553,10 +553,10 @@ public class TestCubeRewriter extends TestQueryRewrite { String whereCond = "zipcode = 'a' and cityid = 'b' and (" + TWO_DAYS_RANGE_SPLIT_OVER_UPDATE_PERIODS + ")"; String hqlQuery = rewrite("select zipcode, count(msr4), sum(msr15) from testCube where " + whereCond, conf); System.out.println(hqlQuery); - String possibleStart1 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) zipcode, mq1.expr2 `count( msr4 )`," - + " mq2.expr3 `sum( msr15 )` FROM "; - String possibleStart2 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) zipcode, mq2.expr2 `count( msr4 )`," - + " mq1.expr3 `sum( msr15 )` FROM "; + String possibleStart1 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) zipcode, mq1.expr2 `count(msr4)`," + + " mq2.expr3 `sum(msr15)` FROM "; + String possibleStart2 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) zipcode, mq2.expr2 `count(msr4)`," + + " mq1.expr3 `sum(msr15)` FROM "; assertTrue(hqlQuery.startsWith(possibleStart1) || hqlQuery.startsWith(possibleStart2)); compareContains(rewrite("select zipcode as `zipcode`, sum(msr15) as `expr3` from testcube where " + whereCond, @@ -1015,13 +1015,13 @@ public class TestCubeRewriter extends TestQueryRewrite { public void testSelectExprPromotionToGroupByWithSpacesInDimensionAliasAndWithAsKeywordBwColAndAlias() throws ParseException, LensException, HiveException { - String inputQuery = "select name as `Alias With Spaces`, SUM(msr2) as `TestMeasure` from testCube join citydim" + String inputQuery = "select name as `Alias With Spaces`, SUM(msr2) as `TestMeasure` from testCube join citydim" + " on testCube.cityid = citydim.id where " + LAST_HOUR_TIME_RANGE; - String expectedRewrittenQuery = "SELECT ( citydim . name ) as `Alias With Spaces` , sum(( testcube . msr2 )) " + String expectedRewrittenQuery = "SELECT (citydim.name) as `Alias With Spaces`, sum((testcube.msr2)) " + "as `TestMeasure` FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim " - + "ON (( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) = '" - + getDateUptoHours(getDateWithOffset(HOURLY, -1)) + "' ))) GROUP BY ( citydim . name )"; + + "ON ((testcube.cityid) = (citydim.id)) WHERE ((((testcube.dt) = '" + + getDateUptoHours(getDateWithOffset(HOURLY, -1)) + "'))) GROUP BY (citydim.name)"; String actualRewrittenQuery = rewrite(inputQuery, getConfWithStorages("C2")); @@ -1032,13 +1032,13 @@ public class TestCubeRewriter extends TestQueryRewrite { public void testSelectExprPromotionToGroupByWithSpacesInDimensionAliasAndWithoutAsKeywordBwColAndAlias() throws ParseException, LensException, HiveException { - String inputQuery = "select name `Alias With Spaces`, SUM(msr2) as `TestMeasure` from testCube join citydim" + String inputQuery = "select name `Alias With Spaces`, SUM(msr2) as `TestMeasure` from testCube join citydim" + " on testCube.cityid = citydim.id where " + LAST_HOUR_TIME_RANGE; - String expectedRewrittenQuery = "SELECT ( citydim . name ) as `Alias With Spaces` , sum(( testcube . msr2 )) " + String expectedRewrittenQuery = "SELECT (citydim.name) as `Alias With Spaces`, sum((testcube.msr2)) " + "as `TestMeasure` FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim " - + "ON (( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) = '" - + getDateUptoHours(getDateWithOffset(HOURLY, -1)) + "' ))) GROUP BY ( citydim . name )"; + + "ON ((testcube.cityid) = (citydim.id)) WHERE ((((testcube.dt) = '" + + getDateUptoHours(getDateWithOffset(HOURLY, -1)) + "'))) GROUP BY (citydim.name)"; String actualRewrittenQuery = rewrite(inputQuery, getConfWithStorages("C2")); http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java index 64ada27..a632be0 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java @@ -53,35 +53,34 @@ public class TestExpressionContext extends TestQueryRewrite { CubeQueryContext nestedExprQL = rewriteCtx("select nestedexpr from testCube where " + TWO_DAYS_RANGE, conf); Assert.assertNotNull(nestedExprQL.getExprCtx()); Set<String> expectedExpressions = Sets.newHashSet( - "avg(( testcube . roundedmsr2 ))", - "avg(( testcube . equalsums ))", - "case when (( testcube . substrexpr ) = 'xyz' ) then avg(( testcube . msr5 ))" - + " when (( testcube . substrexpr ) = 'abc' ) then (avg(( testcube . msr4 )) / 100 ) end", - "avg(round((( testcube . msr2 ) / 1000 )))", - "avg((( testcube . msr3 ) + ( testcube . msr4 )))", - "avg(((( testcube . msr3 ) + ( testcube . msr2 )) / 100 ))", - "case when (substr(( testcube . dim1 ), 3 ) = 'xyz' ) then avg(( testcube . msr5 ))" - + " when (substr(( testcube . dim1 ), 3 ) = 'abc' ) then (avg(( testcube . msr4 )) / 100 ) end", - "case when (substr(ascii(( dim2chain . name )), 3 ) = 'xyz' ) then" - + " avg(( testcube . msr5 )) when (substr(ascii(( dim2chain . name )), 3 ) = 'abc' ) then" - + " (avg(( testcube . msr4 )) / 100 ) end", - "case when (substr(( testcube . dim1 ), 3 ) = 'xyz' ) then avg((( testcube . msr2 )" - + " + ( testcube . msr3 ))) when (substr(( testcube . dim1 ), 3 ) = 'abc' ) then" - + " (avg(( testcube . msr4 )) / 100 ) end", - "case when (substr(ascii(( dim2chain . name )), 3 ) = 'xyz' ) then" - + " avg((( testcube . msr2 ) + ( testcube . msr3 ))) when (substr(ascii(( dim2chain . name )), 3 ) = 'abc' )" - + " then (avg(( testcube . msr4 )) / 100 ) end", - "case when (( testcube . substrexpr ) = 'xyz' ) then avg((( testcube . msr2 )" - + " + ( testcube . msr3 ))) when (( testcube . substrexpr ) = 'abc' ) then (avg(( testcube . msr4 )) / 100 )" + "avg((testcube.roundedmsr2))", + "avg((testcube.equalsums))", + "case when ((testcube.substrexpr) = 'xyz') then avg((testcube.msr5))" + + " when ((testcube.substrexpr) = 'abc') then (avg((testcube.msr4)) / 100) end", + "avg(round(((testcube.msr2) / 1000)))", + "avg(((testcube.msr3) + (testcube.msr4)))", + "avg((((testcube.msr3) + (testcube.msr2)) / 100))", + "case when (substr((testcube.dim1), 3) = 'xyz') then avg((testcube.msr5))" + + " when (substr((testcube.dim1), 3) = 'abc') then (avg((testcube.msr4)) / 100) end", + "case when (substr(ascii((dim2chain.name)), 3) = 'xyz') then" + + " avg((testcube.msr5)) when (substr(ascii((dim2chain.name)), 3) = 'abc') then" + + " (avg((testcube.msr4)) / 100) end", + "case when (substr((testcube.dim1), 3) = 'xyz') then avg(((testcube.msr2)" + + " + (testcube.msr3))) when (substr((testcube.dim1), 3) = 'abc') then" + + " (avg((testcube.msr4)) / 100) end", + "case when (substr(ascii((dim2chain.name)), 3) = 'xyz') then" + + " avg(((testcube.msr2) + (testcube.msr3))) when (substr(ascii((dim2chain.name)), 3) = 'abc')" + + " then (avg((testcube.msr4)) / 100) end", + "case when ((testcube.substrexpr) = 'xyz') then avg(((testcube.msr2)" + + " + (testcube.msr3))) when ((testcube.substrexpr) = 'abc') then (avg((testcube.msr4)) / 100)" + " end", - "case when (substr(( testcube . dim1 ), 3 ) = 'xyz' ) then avg((( testcube . msr2 )" - + " + ( testcube . msr3 ))) when (substr(( testcube . dim1 ), 3 ) = 'abc' ) then" - + " (avg(( testcube . msr4 )) / 100 ) end", - "case when (substr(ascii(( dim2chain . name )), 3 ) = 'xyz' ) then" - + " avg((( testcube . msr2 ) + ( testcube . msr3 ))) when (substr(ascii(( dim2chain . name )), 3 ) = 'abc' )" - + " then (avg(( testcube . msr4 )) / 100 ) end" + "case when (substr((testcube.dim1), 3) = 'xyz') then avg(((testcube.msr2)" + + " + (testcube.msr3))) when (substr((testcube.dim1), 3) = 'abc') then" + + " (avg((testcube.msr4)) / 100) end", + "case when (substr(ascii((dim2chain.name)), 3) = 'xyz') then" + + " avg(((testcube.msr2) + (testcube.msr3))) when (substr(ascii((dim2chain.name)), 3) = 'abc')" + + " then (avg((testcube.msr4)) / 100) end" ); - Set<String> actualExpressions = new HashSet<>(); for (ExprSpecContext esc : nestedExprQL.getExprCtx().getExpressionContext("nestedexpr", "testcube").getAllExprs()) { actualExpressions.add(HQLParser.getString(esc.getFinalAST())); @@ -95,13 +94,12 @@ public class TestExpressionContext extends TestQueryRewrite { conf); Assert.assertNotNull(nestedExprQL.getExprCtx()); Set<String> expectedExpressions = Sets.newHashSet( - "avg(( testcube . roundedmsr2 ))", - "avg(( testcube . equalsums ))", - "avg(round((( testcube . msr2 ) / 1000 )))", - "avg((( testcube . msr3 ) + ( testcube . msr4 )))", - "avg(((( testcube . msr3 ) + ( testcube . msr2 )) / 100 ))" + "avg((testcube.roundedmsr2))", + "avg((testcube.equalsums))", + "avg(round(((testcube.msr2) / 1000)))", + "avg(((testcube.msr3) + (testcube.msr4)))", + "avg((((testcube.msr3) + (testcube.msr2)) / 100))" ); - Set<String> actualExpressions = new HashSet<>(); for (ExprSpecContext esc : nestedExprQL.getExprCtx() .getExpressionContext("nestedexprwithtimes", "testcube").getAllExprs()) { http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/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 590d81b..e23290f 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 @@ -48,11 +48,13 @@ public class TestHQLParser { ASTNode node = HQLParser.parseHQL(query, conf); ASTNode groupby = HQLParser.findNodeByPath(node, TOK_INSERT, TOK_GROUPBY); - String expected = "a , f( b ), ( d + e )"; - Assert.assertEquals(expected, HQLParser.getString(groupby).trim()); + + String expected = "a, f(b), (d + e)"; + Assert.assertEquals(HQLParser.getString(groupby).trim(), expected); ASTNode orderby = HQLParser.findNodeByPath(node, TOK_INSERT, HiveParser.TOK_ORDERBY); - String expectedOrderBy = "a asc , g( b ) asc , e / 100 asc"; + + String expectedOrderBy = "a asc, g(b) asc, e / 100 asc"; System.out.println("###Actual order by:" + HQLParser.getString(orderby).trim()); Assert.assertEquals(expectedOrderBy, HQLParser.getString(orderby).trim()); } @@ -65,29 +67,29 @@ public class TestHQLParser { ASTNode select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT); String selectStr = HQLParser.getString(select).trim(); - String expectedSelect = "'abc' as `col1` , 'DEF' as `col2`"; - Assert.assertEquals(expectedSelect, selectStr); + String expectedSelect = "'abc' as `col1`, 'DEF' as `col2`"; + Assert.assertEquals(selectStr, expectedSelect); ASTNode where = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_WHERE); String whereStr = HQLParser.getString(where).trim(); - String expectedWhere = "(( col3 = 'GHI' ) and ( col4 = 'JKLmno' ))"; - Assert.assertEquals(expectedWhere, whereStr); + String expectedWhere = "((col3 = 'GHI') and (col4 = 'JKLmno'))"; + Assert.assertEquals(whereStr, expectedWhere); } @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, conf); ASTNode select = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT); String selectStr = HQLParser.getString(select); System.out.println("reconstructed clause "); System.out.println(selectStr); - Assert.assertEquals(selectStr.trim(), "case ((( col1 * 100 ) / 200 ) + 5 ) when 'ABC' then 'def' when 'EFG' " + Assert.assertEquals(selectStr.trim(), "case (((col1 * 100) / 200) + 5) when 'ABC' then 'def' when 'EFG' " + "then 'hij' else 'XyZ' end as `ComplexCaseStatement`"); - String q2 = "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' " + 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, conf); @@ -95,7 +97,8 @@ public class TestHQLParser { selectStr = HQLParser.getString(select); System.out.println("reconstructed clause 2"); System.out.println(selectStr); - Assert.assertEquals(selectStr.trim(), "case when ( col1 = 'abc' ) then 'def' when ( col1 = 'ghi' ) then 'jkl' " + + Assert.assertEquals(selectStr.trim(), "case when (col1 = 'abc') then 'def' when (col1 = 'ghi') then 'jkl' " + "else 'none' end as `Complex_Case_Statement_2`"); String q3 = "SELECT " + "CASE (col1 * 100)/200 + 5 " + "WHEN 'ABC' THEN 'def' " + "WHEN 'EFG' THEN 'hij' " @@ -106,10 +109,10 @@ public class TestHQLParser { selectStr = HQLParser.getString(select); System.out.println("reconstructed clause "); System.out.println(selectStr); - Assert.assertEquals(selectStr.trim(), "case ((( col1 * 100 ) / 200 ) + 5 ) when 'ABC' then 'def' when 'EFG' " + Assert.assertEquals(selectStr.trim(), "case (((col1 * 100) / 200) + 5) when 'ABC' then 'def' when 'EFG' " + "then 'hij' end as `ComplexCaseStatement`"); - String q4 = "SELECT " + "CASE WHEN col1 = 'abc' then 'def' " + "when col1 = 'ghi' then 'jkl' " + 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, conf); @@ -117,7 +120,7 @@ public class TestHQLParser { selectStr = HQLParser.getString(select); System.out.println("reconstructed clause 2"); System.out.println(selectStr); - Assert.assertEquals(selectStr.trim(), "case when ( col1 = 'abc' ) then 'def' when ( col1 = 'ghi' ) then 'jkl' end " + Assert.assertEquals(selectStr.trim(), "case when (col1 = 'abc') then 'def' when (col1 = 'ghi') then 'jkl' end " + "as `Complex_Case_Statement_2`"); } @@ -127,8 +130,12 @@ public class TestHQLParser { String q1 = "SELECT * FROM FOO WHERE col1 IS NULL"; ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); String whereStr = HQLParser.getString(where); - System.out.println(whereStr); - Assert.assertEquals("col1 is null", whereStr.trim()); + Assert.assertEquals(whereStr.trim(), "col1 is null"); + + String q2 = "SELECT * FROM FOO WHERE col1 IS NULL and col2 is not null"; + where = HQLParser.findNodeByPath(HQLParser.parseHQL(q2, conf), TOK_INSERT, TOK_WHERE); + whereStr = HQLParser.getString(where); + Assert.assertEquals(whereStr.trim(), "(col1 is null and col2 is not null)"); } @Test @@ -137,7 +144,7 @@ public class TestHQLParser { ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); String whereStr = HQLParser.getString(where); System.out.println(whereStr); - Assert.assertEquals("col1 is not null", whereStr.trim()); + Assert.assertEquals(whereStr.trim(), "col1 is not null"); } @Test @@ -146,7 +153,7 @@ public class TestHQLParser { ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); String whereStr = HQLParser.getString(where); System.out.println(whereStr); - Assert.assertEquals("col1 between 10 and 100", whereStr.trim()); + Assert.assertEquals(whereStr.trim(), "col1 between 10 and 100"); } @Test @@ -155,7 +162,7 @@ public class TestHQLParser { ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); String whereStr = HQLParser.getString(where); System.out.println(whereStr); - Assert.assertEquals("col1 not between 10 and 100", whereStr.trim()); + Assert.assertEquals(whereStr.trim(), "col1 not between 10 and 100"); } @Test @@ -165,8 +172,9 @@ public class TestHQLParser { ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), 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 )"; Assert.assertEquals(whereStr.trim(), expected); } @@ -177,7 +185,7 @@ public class TestHQLParser { ASTNode select = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_SELECT); String selectStr = HQLParser.getString(select); System.out.println(selectStr); - Assert.assertEquals(selectStr.trim(), "a [ 2 ], b [ 'key' ], ( c . d )"); + Assert.assertEquals(selectStr.trim(), "a[2], b['key'], (c.d)"); } @Test @@ -186,13 +194,24 @@ public class TestHQLParser { ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); String whereStr = HQLParser.getString(where); System.out.println(whereStr); - Assert.assertEquals(whereStr.trim(), "a in ( 'B' , 'C' , 'D' , 'E' , 'F' )"); + Assert.assertEquals(whereStr.trim(), "a in ('B' , 'C' , 'D' , 'E' , 'F')"); q1 = "SELECT * FROM FOO WHERE A NOT IN ('B', 'C', 'D', 'E', 'F')"; where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); whereStr = HQLParser.getString(where); System.out.println(whereStr); - Assert.assertEquals(whereStr.trim(), "a not in ( 'B' , 'C' , 'D' , 'E' , 'F' )"); + Assert.assertEquals(whereStr.trim(), "a not in ('B' , 'C' , 'D' , 'E' , 'F')"); + } + + @Test + public void testLiteralWithSpaces() throws Exception { + String q1 = "SELECT * FROM FOO WHERE A IN ('B X', 'C Y', 'D Z', 'E', 'F')"; + ASTNode where = HQLParser.findNodeByPath(HQLParser.parseHQL(q1, conf), TOK_INSERT, TOK_WHERE); + String whereStr = HQLParser.getString(where); + System.out.println(whereStr); + System.out.println("HQLParser.parseHQL(q1, conf)" + HQLParser.parseHQL(q1, conf).dump()); + System.out.println("where dump:" + where.dump()); + Assert.assertEquals(whereStr.trim(), "a in ('B X' , 'C Y' , 'D Z' , 'E' , 'F')"); } @Test @@ -234,7 +253,7 @@ public class TestHQLParser { = "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, conf); ASTNode temp = HQLParser.findNodeByPath(node, TOK_FROM, TOK_JOIN); - String expected = "table1 tab1 table tab2 (( tab1 . id ) = ( tab2 . id ))"; + String expected = "table1tab1tabletab2((tab1.id) = (tab2.id))"; Assert.assertEquals(HQLParser.getString(temp), expected); } @@ -279,7 +298,7 @@ public class TestHQLParser { select = HQLParser.findNodeByPath(ast, TOK_INSERT, TOK_SELECT); selectStr = HQLParser.getString(select); System.out.println(selectStr); - Assert.assertEquals(selectStr, "tab . * , ( tab2 . a ), ( tab2 . b )"); + Assert.assertEquals(selectStr, "tab.*, (tab2.a), (tab2.b)"); query = "select count(*) from tab"; ast = HQLParser.parseHQL(query, conf); @@ -293,7 +312,7 @@ public class TestHQLParser { select = HQLParser.findNodeByPath(ast, TOK_INSERT, TOK_SELECT); selectStr = HQLParser.getString(select); System.out.println(selectStr); - Assert.assertEquals("count( tab . * )", selectStr); + Assert.assertEquals("count(tab.*)", selectStr); } @Test @@ -313,7 +332,7 @@ public class TestHQLParser { System.out.println("genQuery2: " + genQuery2); Assert.assertFalse(genQuery2.contains("1 -")); - Assert.assertTrue(genQuery2.contains("- 1")); + Assert.assertTrue(genQuery2.contains("-1")); // Validate returned string is parseable HQLParser.printAST(HQLParser.findNodeByPath(HQLParser.parseHQL("SELECT " + genQuery2 + " FROM table1", conf), @@ -373,10 +392,10 @@ public class TestHQLParser { {"a or b", "a or b"}, {"a or b or c or d", "a or b or c or d"}, {"a and b and c and d", "a and b and c and d"}, - {"a and (b or c)", "a and ( b or c )"}, - {"a and (b or c or d) and (e or f) and (g and h)", "a and ( b or c or d ) and ( e or f ) and g and h"}, - // ambiguous, but uniquely understood, or > and. - {"a and b or c or d and e or f and g and h", "( a and b ) or c or ( d and e ) or ( f and g and h )"}, + {"a and (b or c)", "a and (b or c)"}, + {"a and (b or c or d) and (e or f) and (g and h)", "a and (b or c or d) and (e or f) and g and h"}, + // ambiguous, but uniquely understood, and > or. + {"a and b or c or d and e or f and g and h", "(a and b) or c or (d and e) or (f and g and h)"}, }; } @@ -412,7 +431,7 @@ public class TestHQLParser { @Test public void testGetDotAST() { - Assert.assertEquals(HQLParser.getString(HQLParser.getDotAST("tbl1", "col1")), "( tbl1 . col1 )"); + Assert.assertEquals(HQLParser.getString(HQLParser.getDotAST("tbl1", "col1")), "(tbl1.col1)"); } @DataProvider http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/lens-cube/src/test/java/org/apache/lens/cube/parse/join/TestBridgeTableJoinCtx.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/join/TestBridgeTableJoinCtx.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/join/TestBridgeTableJoinCtx.java index 06b9509..ca8a45c 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/join/TestBridgeTableJoinCtx.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/join/TestBridgeTableJoinCtx.java @@ -45,11 +45,11 @@ public class TestBridgeTableJoinCtx { public Object[][] filterReplace() { return new Object[][] { {"t1.c1 in ('XyZ', 'abc', 'PQR', 'lKg')", - "myfilter(( t1 . c1 ), 'XyZ' ) or myfilter(( t1 . c1 ), 'abc' )" - + " or myfilter(( t1 . c1 ), 'PQR' ) or myfilter(( t1 . c1 ), 'lKg' )", }, - {"t1.c1 = ('XyZ')", "myfilter(( t1 . c1 ), 'XyZ' )"}, - {"t1.c1 != ('XyZ')", "not myfilter(( t1 . c1 ), 'XyZ' )"}, - {"t1.c1 != x", "not myfilter(( t1 . c1 ), x )"}, + "myfilter((t1.c1), 'XyZ') or myfilter((t1.c1), 'abc')" + + " or myfilter((t1.c1), 'PQR') or myfilter((t1.c1), 'lKg')", }, + {"t1.c1 = ('XyZ')", "myfilter((t1.c1), 'XyZ')"}, + {"t1.c1 != ('XyZ')", "not myfilter((t1.c1), 'XyZ')"}, + {"t1.c1 != x", "not myfilter((t1.c1), x)"}, }; } @@ -86,37 +86,37 @@ public class TestBridgeTableJoinCtx { ASTNode orderBy = HQLParser.findNodeByPath(queryAST, TOK_INSERT, HiveParser.TOK_ORDERBY); List<String> expectedBridgeExprs = new ArrayList<>(); - expectedBridgeExprs.add(aggregator + "(( bt . c3 )) as balias0"); - expectedBridgeExprs.add(aggregator + "(f2(( bt . c4 ))) as balias1"); - expectedBridgeExprs.add(aggregator + "(f2(( bt . c3 ))) as balias2"); - expectedBridgeExprs.add(aggregator + "((( bt . c1 ) + ( bt . c2 ))) as balias3"); + expectedBridgeExprs.add(aggregator + "((bt.c3)) as balias0"); + expectedBridgeExprs.add(aggregator + "(f2((bt.c4))) as balias1"); + expectedBridgeExprs.add(aggregator + "(f2((bt.c3))) as balias2"); + expectedBridgeExprs.add(aggregator + "(((bt.c1) + (bt.c2))) as balias3"); selectCtx.processSelectAST(select); String modifiedSelect = HQLParser.getString(select); - assertEquals(modifiedSelect, "( t1 . c1 ), ( t2 . c2 ), ( bt . balias0 ), f1(( t1 . c2 )), ( bt . balias1 )," - + " ( bt . balias2 ), ( bt . balias3 )"); + assertEquals(modifiedSelect, "(t1.c1), (t2.c2), (bt.balias0), f1((t1.c2)), (bt.balias1)," + + " (bt.balias2), (bt.balias3)"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); selectCtx.processWhereAST(where, null, 0); String modifiedWhere = HQLParser.getString(where); - assertEquals(modifiedWhere, "((( t1 . c1 ) = x ) and test_filter(( bt . balias0 ), y ) and test_filter(( bt . " - + "balias4 ), 5 ) and (( t2 . c2 ) = 4 ) and test_filter(( bt . balias5 ), 6 ))"); - expectedBridgeExprs.add(aggregator + "(( bt . c6 )) as balias4"); - expectedBridgeExprs.add(aggregator + "(rand(( bt . c7 ))) as balias5"); + assertEquals(modifiedWhere, "(((t1.c1) = x) and test_filter((bt.balias0), y) and test_filter((bt.balias4), 5)" + + " and ((t2.c2) = 4) and test_filter((bt.balias5), 6))"); + expectedBridgeExprs.add(aggregator + "((bt.c6)) as balias4"); + expectedBridgeExprs.add(aggregator + "(rand((bt.c7))) as balias5"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); selectCtx.processGroupbyAST(groupBy); String modifiedGroupby = HQLParser.getString(groupBy); - assertEquals(modifiedGroupby, "( t1 . c1 ), ( bt . balias0 ), ( bt . balias6 ), ( bt . balias1 )"); - expectedBridgeExprs.add(aggregator + "(( bt . c8 )) as balias6"); + assertEquals(modifiedGroupby, "(t1.c1), (bt.balias0), (bt.balias6), (bt.balias1)"); + expectedBridgeExprs.add(aggregator + "((bt.c8)) as balias6"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); selectCtx.processOrderbyAST(orderBy); String modifiedOrderby = HQLParser.getString(orderBy); - assertEquals(modifiedOrderby, "t2 . c2 asc , bt . balias0 asc , bt . balias2 asc , bt . balias7 asc ," - + " bt . balias8 desc"); - expectedBridgeExprs.add(aggregator + "(( bt . c9 )) as balias7"); - expectedBridgeExprs.add(aggregator + "(( bt . c4 )) as balias8"); + assertEquals(modifiedOrderby, "t2.c2 asc, bt.balias0 asc, bt.balias2 asc, bt.balias7 asc," + + " bt.balias8 desc"); + expectedBridgeExprs.add(aggregator + "((bt.c9)) as balias7"); + expectedBridgeExprs.add(aggregator + "((bt.c4)) as balias8"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); } } http://git-wip-us.apache.org/repos/asf/lens/blob/4e822031/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 1aa7491..e71b507 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 @@ -247,9 +247,9 @@ public class TestColumnarSQLRewriter { SessionState.start(hconf); qtest.rewrite(query, conf, hconf); String expected = "sales_fact___fact.time_key in ( select time_dim .time_key from time_dim " - + "where ( time_dim. time_key ) between '2013-01-01' and '2013-01-31' ) and " + + "where (time_dim.time_key) between '2013-01-01' and '2013-01-31' ) and " + "sales_fact___fact.location_key in ( select location_dim .location_key from " - + "location_dim where (( location_dim. location_key ) = 'some-loc' ) ) and "; + + "location_dim where ((location_dim.location_key) = 'some-loc') ) and "; Assert.assertEquals(qtest.allSubQueries.toString().trim(), expected.trim()); } @@ -338,11 +338,11 @@ public class TestColumnarSQLRewriter { String rwq = qtest.rewrite(query, conf, hconf); String actual = qtest.aggColumn.toString(); - String expected = "[sum(( sales_fact___fact . dollars_sold )) as alias1, " - + "sum(( sales_fact___fact . dollars_sold )) as alias2, " - + "sum(( sales_fact___fact . units_sold )) as alias3, " - + "avg(( sales_fact___fact . dollars_sold )) as alias4, min(( sales_fact___fact . dollars_sold )) " - + "as alias5, max(( sales_fact___fact . dollars_sold )) as alias6]"; + String expected = "[sum((sales_fact___fact.dollars_sold)) as alias1, " + + "sum((sales_fact___fact.dollars_sold)) as alias2, " + + "sum((sales_fact___fact.units_sold)) as alias3, " + + "avg((sales_fact___fact.dollars_sold)) as alias4, min((sales_fact___fact.dollars_sold)) " + + "as alias5, max((sales_fact___fact.dollars_sold)) as alias6]"; Assert.assertEquals(expected, actual); } @@ -1274,19 +1274,19 @@ public class TestColumnarSQLRewriter { String fromStringAfterRewrite = HQLParser.getString(rewriter.fromAST); log.info("fromStringAfterRewrite:{}", fromStringAfterRewrite); - assertEquals(HQLParser.getString(rewriter.getSelectAST()).trim(), "( t1 . id1 ), ( t2 . id2 ), ( t3 . id3 )," - + " ( t1 . name1 ), ( t2 . name2 ), ( t3 . name3 ), count( 1 )", + assertEquals(HQLParser.getString(rewriter.getSelectAST()).trim(), "(t1.id1), (t2.id2), (t3.id3)," + + " (t1.name1), (t2.name2), (t3.name3), count(1)", "Found :" + HQLParser.getString(rewriter.getSelectAST())); - assertEquals(HQLParser.getString(rewriter.getWhereAST()).trim(), "(( t1 . id1 ) = 100 )", + assertEquals(HQLParser.getString(rewriter.getWhereAST()).trim(), "((t1.id1) = 100)", "Found: " + HQLParser.getString(rewriter.getWhereAST())); - assertEquals(HQLParser.getString(rewriter.getGroupByAST()).trim(), "( t2 . id2 )", + assertEquals(HQLParser.getString(rewriter.getGroupByAST()).trim(), "(t2.id2)", "Found: " + HQLParser.getString(rewriter.getGroupByAST())); - assertEquals(HQLParser.getString(rewriter.getOrderByAST()).trim(), "t3 . id3 asc", + assertEquals(HQLParser.getString(rewriter.getOrderByAST()).trim(), "t3.id3 asc", "Found: " + HQLParser.getString(rewriter.getOrderByAST())); - assertEquals(HQLParser.getString(rewriter.getHavingAST()).trim(), "(count(( t1 . id1 )) > 2 )", + assertEquals(HQLParser.getString(rewriter.getHavingAST()).trim(), "(count((t1.id1)) > 2)", "Found: " + HQLParser.getString(rewriter.getHavingAST())); - assertTrue(fromStringAfterRewrite.contains("( t1 . t2id ) = ( t2 . id2 )") - && fromStringAfterRewrite.contains("( t2 . t3id ) = ( t3 . id3 )"), fromStringAfterRewrite); + assertTrue(fromStringAfterRewrite.contains("(t1.t2id) = (t2.id2)") + && fromStringAfterRewrite.contains("(t2.t3id) = (t3.id3)"), fromStringAfterRewrite); assertFalse(fromStringAfterRewrite.contains(testDB), fromStringAfterRewrite); assertTrue(fromStringAfterRewrite.contains("testdb"), fromStringAfterRewrite); assertTrue(fromStringAfterRewrite.contains("testtable_1") && fromStringAfterRewrite.contains("testtable_2")