You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by pr...@apache.org on 2015/10/27 16:38:14 UTC

lens git commit: LENS-849: NPE with CandidateTableResolver with expression dimensions

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 <am...@gmail.com>
Authored: Tue Oct 27 21:07:29 2015 +0530
Committer: Rajat Khandelwal <ra...@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),  '##################.###' ), "