Repository: lens Updated Branches: refs/heads/master 6c4dba51b -> 09419a577
LENS-849: NPE with CandidateTableResolver with expression dimensions Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/09419a57 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/09419a57 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/09419a57 Branch: refs/heads/master Commit: 09419a577f6b4d4ac8890be10de7ddf256ef616b Parents: 6c4dba5 Author: Amareshwari Sriramadasu <amareshw...@gmail.com> Authored: Tue Oct 27 21:07:29 2015 +0530 Committer: Rajat Khandelwal <rajatgupt...@gmail.com> Committed: Tue Oct 27 21:07:30 2015 +0530 ---------------------------------------------------------------------- .../apache/lens/cube/parse/CandidateTableResolver.java | 12 +++++++----- .../java/org/apache/lens/cube/parse/CubeTestSetup.java | 2 ++ .../apache/lens/cube/parse/TestExpressionResolver.java | 13 ++++++++++++- .../java/org/apache/lens/cube/parse/TestQuery.java | 12 +++++++----- .../lens/driver/jdbc/TestColumnarSQLRewriter.java | 2 +- 5 files changed, 29 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/09419a57/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 f81f3d5..0ad7610 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 @@ -590,11 +590,13 @@ class CandidateTableResolver implements ContextRewriter { for (CandidateTable candidate : removedCandidates.get(dim)) { // check if evaluable expressions of this candidate are no more evaluable because dimension is not reachable // if no evaluable expressions exist, then remove the candidate - Iterator<ExprSpecContext> escIter = ec.getEvaluableExpressions().get(candidate).iterator(); - while (escIter.hasNext()) { - ExprSpecContext esc = escIter.next(); - if (esc.getExprDims().contains(dim)) { - escIter.remove(); + if (ec.getEvaluableExpressions().get(candidate) != null) { + Iterator<ExprSpecContext> escIter = ec.getEvaluableExpressions().get(candidate).iterator(); + while (escIter.hasNext()) { + ExprSpecContext esc = escIter.next(); + if (esc.getExprDims().contains(dim)) { + escIter.remove(); + } } } if (cubeql.getExprCtx().isEvaluable(col.getExprCol(), candidate)) { http://git-wip-us.apache.org/repos/asf/lens/blob/09419a57/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 705f19b..dc11b4c 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 @@ -698,6 +698,8 @@ public class CubeTestSetup { 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", null, null))); + exprs.add(new ExprColumn(new FieldSchema("msr2expr", "double", "nested expr"), "Nested expr", + new ExprSpec("case when cityStateName = 'xyz' then msr2 else 0 end", null, null))); exprs.add(new ExprColumn(new FieldSchema("nestedExprWithTimes", "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/09419a57/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java index 1cb22eb..e90603c 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java @@ -316,6 +316,17 @@ public class TestExpressionResolver extends TestQueryRewrite { } @Test + public void testExpressionFieldWithOtherFields() throws Exception { + // select with expression which requires dimension tables. And there is a candidate, which is removed because + // the other fields which require the dimension tables as expression ones, are not reachable and + // the expression is not evaluable on the candidate. + LensException th = + getLensExceptionInRewrite("select cityStateName, msr2expr, msr5, msr15 from testCube where " + + TWO_DAYS_RANGE, conf); + Assert.assertEquals(th.getErrorCode(), + LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE.getLensErrorInfo().getErrorCode()); + } + @Test public void testMaterializedExpressionPickingMaterializedValue() throws Exception { Configuration newConf = new Configuration(conf); newConf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2"); @@ -371,7 +382,7 @@ public class TestExpressionResolver extends TestQueryRewrite { // since zipdim is not available in storage C2, first expression should be have been pruned // And joining with statedim for second expression is not possible because of stateid missing in C2 tables // or citydim.name missing in c2 tables. - CubeQueryContext ctx = rewriteCtx("select citydim.name, cityaddress from" + " citydim", newConf); + CubeQueryContext ctx = rewriteCtx("select citydim.name, cityaddress from citydim", newConf); Assert.assertEquals(ctx.getDimPruningMsgs().get(ctx.getMetastoreClient().getDimension("citydim")) .get(ctx.getMetastoreClient().getDimensionTable("citytable")).size(), 1); CandidateTablePruneCause pruningMsg = http://git-wip-us.apache.org/repos/asf/lens/blob/09419a57/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQuery.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQuery.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQuery.java index 2707c4c..8e35ea9 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQuery.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQuery.java @@ -72,12 +72,14 @@ public class TestQuery { * Get the join query part, pre-join query and post-join query part from the trimmed query. * */ - if (trimmedQuery.indexOf(joinQueryPart) != -1) { + if (StringUtils.isNotBlank(joinQueryPart)) { this.preJoinQueryPart = trimmedQuery.substring(0, trimmedQuery.indexOf(joinQueryPart)); - if (getMinIndexOfClause() != -1) { - this.postJoinQueryPart = trimmedQuery.substring(getMinIndexOfClause()); - } + this.postJoinQueryPart = trimmedQuery.substring(getMinIndexOfClause()); prepareJoinStrings(trimmedQuery); + } else { + int minIndex = getMinIndexOfClause(); + this.preJoinQueryPart = trimmedQuery.substring(0, minIndex); + this.postJoinQueryPart = trimmedQuery.substring(minIndex); } } @@ -162,7 +164,7 @@ public class TestQuery { } minClauseIndex = clauseIndex < minClauseIndex ? clauseIndex : minClauseIndex; } - return minClauseIndex == Integer.MAX_VALUE ? -1 : minClauseIndex; + return (minClauseIndex == Integer.MAX_VALUE || minClauseIndex == -1) ? query.length() : minClauseIndex; } private int getMinIndexOfJoinType() { http://git-wip-us.apache.org/repos/asf/lens/blob/09419a57/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 149c450..758f549 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 @@ -435,7 +435,7 @@ public class TestColumnarSQLRewriter { String actual = qtest.rewrite(query, conf, hconf); String expected = "select ( sales_fact___fact . time_key ), ( time_dim___time_dim . day_of_week ), " - + "week((time_dim__time_dim . day )), " + + "week((time_dim___time_dim . day )), " + "date(( time_dim___time_dim . day )), ( item_dim___item_dim . item_key ), " + "case when (sum(alias2) = 0 ) then 0.0 else sum(alias2) end as `dollars_sold` , " + "format(sum(alias3), 4 ), format(avg(alias4), '##################.###' ), "