LENS-870 : Expressions in multi fact query is not rewritten properly
Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/09baa128 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/09baa128 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/09baa128 Branch: refs/heads/LENS-581 Commit: 09baa12880ba27c00323bbf881e9c69acb580117 Parents: d820c32 Author: Sushil Mohanty <[email protected]> Authored: Tue Nov 24 12:05:05 2015 +0530 Committer: Rajat Khandelwal <[email protected]> Committed: Tue Nov 24 12:05:05 2015 +0530 ---------------------------------------------------------------------- .../lens/cube/parse/CandidateTableResolver.java | 3 ++- .../lens/cube/parse/ExpressionResolver.java | 6 ++--- .../apache/lens/cube/parse/CubeTestSetup.java | 2 ++ .../lens/cube/parse/TestBaseCubeQueries.java | 27 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/09baa128/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java index 0ad7610..38ff5a4 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java @@ -272,7 +272,8 @@ class CandidateTableResolver implements ContextRewriter { if (!checkForColumnExists(cfact, queriedMsrs) && (cubeql.getQueriedExprsWithMeasures().isEmpty() || cubeql.getExprCtx().allNotEvaluable(cubeql.getQueriedExprsWithMeasures(), cfact))) { - log.info("Not considering fact table:{} as columns {} is not available", cfact, queriedMsrs); + log.info("Not considering fact table:{} as columns {},{} is not available", cfact, queriedMsrs, + cubeql.getQueriedExprsWithMeasures()); cubeql.addFactPruningMsgs(cfact.fact, CandidateTablePruneCause.columnNotFound(queriedMsrs, cubeql.getQueriedExprsWithMeasures())); toRemove = true; http://git-wip-us.apache.org/repos/asf/lens/blob/09baa128/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java index 1a347b2..200a48c 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java @@ -405,11 +405,11 @@ class ExpressionResolver implements ContextRewriter { */ public boolean allNotEvaluable(Set<String> exprs, CandidateTable cTable) { for (String expr : exprs) { - if (!isEvaluable(expr, cTable)) { - return true; + if (isEvaluable(expr, cTable)) { + return false; } } - return false; + return true; } public Collection<String> coveringExpressions(Set<String> exprs, CandidateTable cTable) { http://git-wip-us.apache.org/repos/asf/lens/blob/09baa128/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java index aa15a2c..999faa0 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java @@ -732,6 +732,8 @@ public class CubeTestSetup { "round(msr1/1000)")); exprs.add(new ExprColumn(new FieldSchema("roundedmsr2", "double", "rounded measure2"), "Rounded msr2", "round(msr2/1000)")); + exprs.add(new ExprColumn(new FieldSchema("flooredmsr12", "double", "floored measure12"), "Floored msr12", + "floor(msr12)")); exprs.add(new ExprColumn(new FieldSchema("nestedexpr", "double", "nested expr"), "Nested expr", new ExprSpec("avg(roundedmsr2)", null, null), new ExprSpec("avg(equalsums)", null, null), new ExprSpec("case when substrexpr = 'xyz' then avg(msr5) when substrexpr = 'abc' then avg(msr4)/100 end", http://git-wip-us.apache.org/repos/asf/lens/blob/09baa128/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 548bf5c..1ea22b7 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 @@ -226,6 +226,33 @@ public class TestBaseCubeQueries extends TestQueryRewrite { } @Test + public void testMultiFactQueryWithExpressionsFromMultipleFacts() throws Exception { + Configuration tConf = new Configuration(conf); + tConf.setBoolean(CubeQueryConfUtil.LIGHTEST_FACT_FIRST, true); + String hqlQuery = rewrite("select dim1, roundedmsr2, flooredmsr12 from basecube" + " where " + + TWO_DAYS_RANGE, tConf); + String expected1 = + getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, " + + "floor(sum(( basecube . msr12 ))) as `flooredmsr12` FROM ", null, + " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE")); + String expected2 = getExpectedQuery(cubeName, + "select basecube.dim1 as `dim1`, round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null, + " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE")); + TestCubeRewriter.compareContains(expected1, hqlQuery); + TestCubeRewriter.compareContains(expected2, hqlQuery); + String lower = hqlQuery.toLowerCase(); + assertTrue( + lower.startsWith("select coalesce(mq1.dim1, mq2.dim1) dim1, mq2.roundedmsr2 roundedmsr2, " + + "mq1.flooredmsr12 flooredmsr12 from ") + || lower.startsWith("select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.roundedmsr2 roundedmsr2, " + + "mq2.flooredmsr12 flooredmsr12" + + " from "), hqlQuery); + + assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.dim1 <=> mq2.dim1"), + hqlQuery); + } + + @Test public void testMultiFactQueryWithSingleCommonDimensionWithColumnsSwapped() throws Exception { // columns in select interchanged String hqlQuery = rewrite("select dim1, msr12, roundedmsr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
