Repository: lens
Updated Branches:
  refs/heads/master d3e732c9f -> cb2529672


LENS-1427: ExpressionResolver is removing expressions if they are not 
answerable by *any* candidates


Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/cb252967
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/cb252967
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/cb252967

Branch: refs/heads/master
Commit: cb252967237a7e6c945a9031a3d417c18bc736cf
Parents: d3e732c
Author: Rajat Khandelwal <pro...@apache.org>
Authored: Tue Jun 6 15:37:41 2017 +0530
Committer: Rajat Khandelwal <rajatgupt...@gmail.com>
Committed: Tue Jun 6 15:37:41 2017 +0530

----------------------------------------------------------------------
 .../lens/cube/parse/ExpressionResolver.java     | 37 +++++++++-----------
 .../test/resources/schema/cubes/base/b1cube.xml |  2 +-
 .../test/resources/schema/cubes/base/b2cube.xml |  2 +-
 .../resources/schema/cubes/base/testcube.xml    |  2 +-
 4 files changed, 19 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/cb252967/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 7cad400..f38aa54 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
@@ -518,15 +518,14 @@ class ExpressionResolver implements ContextRewriter {
             }
             // Remove expressions for which denormalized columns are no more 
reachable
             esc.getDeNormCtx().pruneReferences(cubeql);
-            for (String table : 
esc.getDeNormCtx().getTableToRefCols().keySet()) {
-              Set<String> nonReachableFields = 
esc.getDeNormCtx().getNonReachableReferenceFields(table);
-              if (!nonReachableFields.isEmpty()) {
-                log.info("Removing expression {} as columns {} are not 
available", esc, nonReachableFields);
-                iterator.remove();
-                removedEsc.add(esc);
-                removed = true;
-                break;
-              }
+            if (!esc.getDeNormCtx().getTableToRefCols().isEmpty()
+              && esc.getDeNormCtx().getTableToRefCols().keySet().stream()
+              
.map(esc.getDeNormCtx()::getNonReachableReferenceFields).noneMatch(Set::isEmpty))
 {
+              log.info("Removing expression {} as all tables have non 
reachable fields", esc);
+              iterator.remove();
+              removedEsc.add(esc);
+              removed = true;
+              break;
             }
             if (removed) {
               continue;
@@ -630,19 +629,15 @@ class ExpressionResolver implements ContextRewriter {
         for (Map.Entry<String, Set<ExpressionContext>> ecEntry : 
exprCtx.allExprsQueried.entrySet()) {
           String expr = ecEntry.getKey();
           Set<ExpressionContext> ecSet = ecEntry.getValue();
-          for (ExpressionContext ec : ecSet) {
-            if (ec.getSrcTable().getName().equals(cubeql.getCube().getName())) 
{
-              for (Iterator<Candidate> sItr = 
cubeql.getCandidates().iterator(); sItr.hasNext();) {
-                Candidate cand = sItr.next();
-                if (!cand.isExpressionEvaluable(ec)) {
-                  log.info("Not considering Candidate :{} as {} is not 
evaluable", cand, ec.exprCol.getName());
-                  sItr.remove();
-                  cubeql.addCandidatePruningMsg(cand,
-                      
CandidateTablePruneCause.expressionNotEvaluable(ec.exprCol.getName()));
-                }
-              }
+          cubeql.getCandidates().removeIf(x-> {
+            if (ecSet.stream().noneMatch(x::isExpressionEvaluable)) {
+              log.info("Not considering Candidate :{} as {} is not evaluable", 
x, expr);
+              cubeql.addCandidatePruningMsg(x,
+                CandidateTablePruneCause.expressionNotEvaluable(expr));
+              return true;
             }
-          }
+            return false;
+          });
         }
       }
       // prune candidate dims without any valid expressions

http://git-wip-us.apache.org/repos/asf/lens/blob/cb252967/lens-cube/src/test/resources/schema/cubes/base/b1cube.xml
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/resources/schema/cubes/base/b1cube.xml 
b/lens-cube/src/test/resources/schema/cubes/base/b1cube.xml
index e3e9909..fd25982 100644
--- a/lens-cube/src/test/resources/schema/cubes/base/b1cube.xml
+++ b/lens-cube/src/test/resources/schema/cubes/base/b1cube.xml
@@ -178,7 +178,7 @@
       <expr_spec expr="cubecity.name"/>
     </expression>
     <expression _type="string" name="citysegmsr1" display_string="city 
segmsr1" description="city segmsr1 ">
-      <expr_spec expr="sum(case when cubecity.name = 'foo' then segmsr1 end)"/>
+      <expr_spec expr="sum(case when singlecolchainfield = 'foo' then segmsr1 
end)"/>
     </expression>
     <expression _type="double" name="msr8" display_string="Sixth Msr" 
description="measure expression">
       <expr_spec expr="msr2 + msr3"/>

http://git-wip-us.apache.org/repos/asf/lens/blob/cb252967/lens-cube/src/test/resources/schema/cubes/base/b2cube.xml
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/resources/schema/cubes/base/b2cube.xml 
b/lens-cube/src/test/resources/schema/cubes/base/b2cube.xml
index e5cf2c0..ca6bcd7 100644
--- a/lens-cube/src/test/resources/schema/cubes/base/b2cube.xml
+++ b/lens-cube/src/test/resources/schema/cubes/base/b2cube.xml
@@ -178,7 +178,7 @@
       <expr_spec expr="cubecity.name"/>
     </expression>
     <expression _type="string" name="citysegmsr1" display_string="city 
segmsr1" description="city segmsr1 ">
-      <expr_spec expr="sum(case when cubecity.name = 'foo' then segmsr1 end)"/>
+      <expr_spec expr="sum(case when singlecolchainfield = 'foo' then segmsr1 
end)"/>
     </expression>
     <expression _type="double" name="msr8" display_string="Sixth Msr" 
description="measure expression">
       <expr_spec expr="msr2 + msr3"/>

http://git-wip-us.apache.org/repos/asf/lens/blob/cb252967/lens-cube/src/test/resources/schema/cubes/base/testcube.xml
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/resources/schema/cubes/base/testcube.xml 
b/lens-cube/src/test/resources/schema/cubes/base/testcube.xml
index f123341..ef13700 100644
--- a/lens-cube/src/test/resources/schema/cubes/base/testcube.xml
+++ b/lens-cube/src/test/resources/schema/cubes/base/testcube.xml
@@ -165,7 +165,7 @@
       <expr_spec expr="cubecity.name"/>
     </expression>
     <expression _type="string" name="citysegmsr1" display_string="city 
segmsr1" description="city segmsr1 ">
-      <expr_spec expr="sum(case when cubecity.name = 'foo' then segmsr1 end)"/>
+      <expr_spec expr="sum(case when singlecolchainfield = 'foo' then segmsr1 
end)"/>
     </expression>
     <expression _type="double" name="msr8" display_string="Sixth Msr" 
description="measure expression">
       <expr_spec expr="msr2 + msr3"/>

Reply via email to