Repository: lens Updated Branches: refs/heads/master d5e923e25 -> 1b475f2ea
LENS-851 : Fix aliasing for non-aggregate functions in multi fact union query Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/1b475f2e Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/1b475f2e Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/1b475f2e Branch: refs/heads/master Commit: 1b475f2ea67a275b22248f677a08d5caec7f959a Parents: d5e923e Author: Rajat Khandelwal <pro...@apache.org> Authored: Fri Jan 8 14:53:17 2016 +0530 Committer: Amareshwari Sriramadasu <amareshw...@apache.org> Committed: Fri Jan 8 14:53:17 2016 +0530 ---------------------------------------------------------------------- .../java/org/apache/lens/cube/parse/HQLParser.java | 15 +++++++++++++++ .../cube/parse/SingleFactMultiStorageHQLContext.java | 2 +- .../org/apache/lens/cube/parse/TestCubeRewriter.java | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/1b475f2e/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 6c3d4c3..bfb65c7 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 @@ -732,6 +732,21 @@ public final class HQLParser { return false; } + public static boolean isNonAggregateFunctionAST(ASTNode node) { + int exprTokenType = node.getToken().getType(); + if (exprTokenType == HiveParser.TOK_FUNCTION || exprTokenType == HiveParser.TOK_FUNCTIONDI + || exprTokenType == HiveParser.TOK_FUNCTIONSTAR) { + assert (node.getChildCount() != 0); + if (node.getChild(0).getType() == HiveParser.Identifier) { + String functionName = BaseSemanticAnalyzer.unescapeIdentifier(node.getChild(0).getText()); + if (FunctionRegistry.getGenericUDAFResolver(functionName) == null) { + return true; + } + } + } + return false; + } + /** * @param node an ASTNode * @return true when input node is a SELECT AST Node. Otherwise, false. http://git-wip-us.apache.org/repos/asf/lens/blob/1b475f2e/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactMultiStorageHQLContext.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactMultiStorageHQLContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactMultiStorageHQLContext.java index e531e6b..ac56328 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactMultiStorageHQLContext.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactMultiStorageHQLContext.java @@ -185,7 +185,7 @@ public class SingleFactMultiStorageHQLContext extends UnionHQLContext { outerAST.addChild(dotAST); innerToOuterASTs.put(new HashableASTNode(innerSelectASTWithoutAlias), outerAST); return outerAST; - } else if (isTableColumnAST(astNode)) { + } else if (isTableColumnAST(astNode) || isNonAggregateFunctionAST(astNode)) { if (innerToOuterASTs.containsKey(new HashableASTNode(astNode))) { return innerToOuterASTs.get(new HashableASTNode(astNode)); } http://git-wip-us.apache.org/repos/asf/lens/blob/1b475f2e/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 f02cdb0..61fb73c 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 @@ -417,6 +417,21 @@ public class TestCubeRewriter extends TestQueryRewrite { } conf.setBoolean(CubeQueryConfUtil.ENABLE_STORAGES_UNION, true); + hqlQuery = rewrite("select ascii(cityid) as `City ID`, msr8, msr7 as `Third measure` " + + "from testCube where cityid = 'a' and zipcode = 'b' and " + TWO_MONTHS_RANGE_UPTO_HOURS, conf); + + expected = getExpectedUnionQuery(TEST_CUBE_NAME, storages, provider, + "SELECT testcube.alias0 as `City ID`, sum(testcube.alias1) + max(testcube.alias2), " + + "case when sum(testcube.alias1) = 0 then 0 else sum(testcube.alias3)/sum(testcube.alias1) end " + + "as `Third Measure`", + null, "group by testcube.alias0", + "select ascii(testcube.cityid) as `alias0`, sum(testcube.msr2) as `alias1`, " + + "max(testcube.msr3) as `alias2`, " + + "sum(case when testcube.cityid = 'x' then testcube.msr21 else testcube.msr22 end) as `alias3`", + "testcube.cityid = 'a' and testcube.zipcode = 'b'", "group by ascii(testcube.cityid)"); + + compareQueries(hqlQuery, expected); + hqlQuery = rewrite("select cityid as `City ID`, msr8, msr7 as `Third measure` " + "from testCube where cityid = 'a' and zipcode = 'b' and " + TWO_MONTHS_RANGE_UPTO_HOURS, conf);