Deleted deprecated classes, Fixed Checkstyles, Fixed test cases, Fixed 
duplicate projections


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

Branch: refs/heads/lens-1381
Commit: 975fa2c2b110ebf8652bd0ce67cd86bb9ac35c03
Parents: 4af769e
Author: Sushil Mohanty,Puneet Gupta and Lavkesh Lahngir 
<sushilmoha...@apache.org>
Authored: Fri Feb 17 16:28:05 2017 +0530
Committer: Puneet <puneet.gu...@inmobi.com>
Committed: Fri Feb 17 16:28:05 2017 +0530

----------------------------------------------------------------------
 .../NoCandidateFactAvailableException.java      |   7 +-
 .../lens/cube/metadata/CubeMetastoreClient.java |   4 +-
 .../lens/cube/metadata/FactPartition.java       |   3 -
 .../lens/cube/parse/AggregateResolver.java      |   2 -
 .../org/apache/lens/cube/parse/Candidate.java   |  23 +-
 .../parse/CandidateCoveringSetsResolver.java    |  74 +++-
 .../apache/lens/cube/parse/CandidateFact.java   | 381 ----------------
 .../cube/parse/CandidateTablePruneCause.java    |  84 ++--
 .../lens/cube/parse/CandidateTableResolver.java |  22 +-
 .../apache/lens/cube/parse/CandidateUtil.java   |  78 ++--
 .../lens/cube/parse/CubeQueryContext.java       | 100 +----
 .../lens/cube/parse/CubeQueryRewriter.java      |   4 +-
 .../lens/cube/parse/DefaultAliasDecider.java    |   4 +-
 .../cube/parse/DenormalizationResolver.java     |  28 +-
 .../lens/cube/parse/ExpressionResolver.java     |   9 +-
 .../apache/lens/cube/parse/GroupbyResolver.java |   8 +-
 .../apache/lens/cube/parse/JoinCandidate.java   |  33 +-
 .../lens/cube/parse/LeastPartitionResolver.java |   2 +-
 .../cube/parse/MaxCoveringFactResolver.java     |   3 +-
 .../org/apache/lens/cube/parse/PruneCauses.java |   5 +-
 .../lens/cube/parse/QueriedPhraseContext.java   |  33 +-
 .../lens/cube/parse/StorageCandidate.java       | 192 +++++---
 .../lens/cube/parse/StorageTableResolver.java   |  43 +-
 .../lens/cube/parse/TimeRangeChecker.java       |   1 -
 .../apache/lens/cube/parse/UnionCandidate.java  |  24 +-
 .../lens/cube/parse/UnionQueryWriter.java       | 275 +++++++++---
 .../lens/cube/parse/join/AutoJoinContext.java   |   2 -
 .../apache/lens/driver/cube/RewriterPlan.java   |   1 -
 .../apache/lens/cube/parse/CubeTestSetup.java   |   7 +-
 .../lens/cube/parse/TestAggregateResolver.java  | 188 ++++----
 .../lens/cube/parse/TestBaseCubeQueries.java    | 433 ++++++++-----------
 .../lens/cube/parse/TestBridgeTableQueries.java | 115 ++---
 .../lens/cube/parse/TestCubeRewriter.java       | 204 +++++----
 .../cube/parse/TestDenormalizationResolver.java |  50 ++-
 .../lens/cube/parse/TestExpressionResolver.java |  12 +-
 .../lens/cube/parse/TestJoinResolver.java       |  22 +-
 .../lens/cube/parse/TestQueryMetrics.java       |  26 +-
 .../lens/cube/parse/TestRewriterPlan.java       |   2 -
 .../lens/cube/parse/TestTimeRangeResolver.java  |  58 ++-
 .../parse/TestTimeRangeWriterWithQuery.java     |  15 +-
 .../cube/parse/TestUnionAndJoinCandidates.java  |  23 +-
 .../lens/cube/parse/TestUnionQueries.java       |   1 -
 42 files changed, 1224 insertions(+), 1377 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/error/NoCandidateFactAvailableException.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/error/NoCandidateFactAvailableException.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/error/NoCandidateFactAvailableException.java
index 7d12762..301458f 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/error/NoCandidateFactAvailableException.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/error/NoCandidateFactAvailableException.java
@@ -18,7 +18,6 @@
  */
 package org.apache.lens.cube.error;
 
-import org.apache.lens.cube.metadata.CubeFactTable;
 import org.apache.lens.cube.parse.PruneCauses;
 import org.apache.lens.cube.parse.StorageCandidate;
 import org.apache.lens.server.api.error.LensException;
@@ -29,7 +28,11 @@ public class NoCandidateFactAvailableException extends 
LensException {
   private final PruneCauses<StorageCandidate> briefAndDetailedError;
 
   public NoCandidateFactAvailableException(PruneCauses<StorageCandidate> 
briefAndDetailedError) {
-    super(LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE.getLensErrorInfo(), 
briefAndDetailedError.getBriefCause());
+    this(briefAndDetailedError.getBriefCause(), briefAndDetailedError);
+  }
+
+  public NoCandidateFactAvailableException(String errMsg, 
PruneCauses<StorageCandidate> briefAndDetailedError) {
+    super(LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE.getLensErrorInfo(), 
errMsg);
     this.briefAndDetailedError = briefAndDetailedError;
   }
 

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
index 6c9cde2..aa2e9d1 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
@@ -938,14 +938,14 @@ public class CubeMetastoreClient {
     }
   }
 
-  private Date getStorageTableStartDate(String storageTable, String 
factTableName)
+  public Date getStorageTableStartDate(String storageTable, String 
factTableName)
     throws LensException {
     List<Date> startDates = getStorageTimes(storageTable, 
MetastoreUtil.getStoragetableStartTimesKey());
     startDates.add(getFactTable(factTableName).getStartTime());
     return Collections.max(startDates);
   }
 
-  private Date getStorageTableEndDate(String storageTable, String 
factTableName)
+  public Date getStorageTableEndDate(String storageTable, String factTableName)
     throws LensException {
     List<Date> endDates = getStorageTimes(storageTable, 
MetastoreUtil.getStoragetableEndTimesKey());
     endDates.add(getFactTable(factTableName).getEndTime());

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactPartition.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactPartition.java 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactPartition.java
index 86d6056..1694b80 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactPartition.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactPartition.java
@@ -30,7 +30,6 @@ import lombok.Getter;
 import lombok.Setter;
 
 @EqualsAndHashCode
-// TODO union : Change the class name To StoragePartition
 public class FactPartition implements Comparable<FactPartition> {
   @Getter
   private final String partCol;
@@ -40,8 +39,6 @@ public class FactPartition implements 
Comparable<FactPartition> {
   private final Set<String> storageTables = new LinkedHashSet<String>();
   @Getter
   private final UpdatePeriod period;
-
-  //TODO union : this is never set . Do we need this ?s
   @Getter
   @Setter
   private FactPartition containingPart;

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
index 79f38da..30b1a90 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
@@ -27,7 +27,6 @@ import java.util.Iterator;
 import org.apache.lens.cube.error.LensCubeErrorCode;
 import org.apache.lens.cube.metadata.CubeMeasure;
 import org.apache.lens.cube.metadata.ExprColumn;
-import 
org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode;
 import org.apache.lens.cube.parse.ExpressionResolver.ExprSpecContext;
 import org.apache.lens.server.api.error.LensException;
 
@@ -71,7 +70,6 @@ class AggregateResolver implements ContextRewriter {
       || hasMeasuresNotInDefaultAggregates(cubeql, cubeql.getHavingAST(), 
null, aggregateResolverDisabled)
       || hasMeasures(cubeql, cubeql.getWhereAST()) || hasMeasures(cubeql, 
cubeql.getGroupByAST())
       || hasMeasures(cubeql, cubeql.getOrderByAST())) {
-      //TODO union : Note : Pending : cube segmentation design may change the 
above assumption and Set<Candidate> can contain and mix of StorageCandidate and 
UnionSegmentCandidate. This step can then ignore UnionSegmentCandidate
       Iterator<Candidate> candItr = cubeql.getCandidates().iterator();
       while (candItr.hasNext()) {
         Candidate candidate = candItr.next();

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java
index 1987939..095a297 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java
@@ -1,6 +1,23 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.lens.cube.parse;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Set;
@@ -93,7 +110,7 @@ public interface Candidate {
    * 1. For a JoinCandidate, atleast one of the child candidates should be 
able to answer the expression
    * 2. For a UnionCandidate, all child candidates should answer the expression
    *
-   * @param expr
+   * @param expr     :Expression need to be evaluated for Candidate
    * @return
    */
   boolean isExpressionEvaluable(ExpressionResolver.ExpressionContext expr);
@@ -104,4 +121,4 @@ public interface Candidate {
    */
   Set<Integer> getAnswerableMeasurePhraseIndices();
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateCoveringSetsResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateCoveringSetsResolver.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateCoveringSetsResolver.java
index 6d85edf..a3a42ab 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateCoveringSetsResolver.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateCoveringSetsResolver.java
@@ -1,8 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.lens.cube.parse;
 
 import java.util.*;
 
-import org.apache.lens.cube.error.LensCubeErrorCode;
 import org.apache.lens.cube.metadata.TimeRange;
 import org.apache.lens.server.api.error.LensException;
 
@@ -31,9 +48,22 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
       finalCandidates.addAll(cubeql.getCandidates());
     }
     List<Candidate> timeRangeCoveringSet = 
resolveTimeRangeCoveringFactSet(cubeql, queriedMsrs, qpcList);
+//    if (timeRangeCoveringSet.isEmpty()) {
+//      throw new NoCandidateFactAvailableException(cubeql.getCube().getName()
+//        + " does not have any facts that can cover the requested time range 
" + cubeql.getTimeRanges().toString()
+//        + " and queried measure set " + getColumns(queriedMsrs).toString(),
+//        cubeql.getStoragePruningMsgs());
+//    }
+    log.info("Time covering candidates :{}", timeRangeCoveringSet);
     List<List<Candidate>> measureCoveringSets = 
resolveJoinCandidates(timeRangeCoveringSet, queriedMsrs, cubeql);
+//    if (measureCoveringSets.isEmpty()) {
+//      throw new NoCandidateFactAvailableException(cubeql.getCube().getName()
+//        + " does not have any facts that can cover the queried measure set "
+//        + getColumns(queriedMsrs).toString(),
+//        cubeql.getStoragePruningMsgs());
+//    }
     updateFinalCandidates(measureCoveringSets, cubeql);
-    log.info("Covering candidate sets :{}", finalCandidates);
+    log.info("Final Time and Measure covering candidates :{}", 
finalCandidates);
     cubeql.getCandidates().clear();
     cubeql.getCandidates().addAll(finalCandidates);
   }
@@ -50,7 +80,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
   }
 
   private void updateFinalCandidates(List<List<Candidate>> joinCandidates, 
CubeQueryContext cubeql) {
-    for (Iterator<List<Candidate>> itr = joinCandidates.iterator(); 
itr.hasNext(); ) {
+    for (Iterator<List<Candidate>> itr = joinCandidates.iterator(); 
itr.hasNext();) {
       List<Candidate> joinCandidate = itr.next();
       if (joinCandidate.size() == 1) {
         finalCandidates.add(joinCandidate.iterator().next());
@@ -61,7 +91,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
   }
 
   private boolean isCandidateCoveringTimeRanges(UnionCandidate uc, 
List<TimeRange> ranges) {
-    for (Iterator<TimeRange> itr = ranges.iterator(); itr.hasNext(); ) {
+    for (Iterator<TimeRange> itr = ranges.iterator(); itr.hasNext();) {
       TimeRange range = itr.next();
       if (!CandidateUtil.isTimeRangeCovered(uc.getChildren(), 
range.getFromDate(), range.getToDate())) {
         return false;
@@ -70,11 +100,12 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
     return true;
   }
 
-  private void pruneUnionCandidatesNotCoveringAllRanges(List<UnionCandidate> 
ucs, List<TimeRange> ranges) {
-    for (Iterator<UnionCandidate> itr = ucs.iterator(); itr.hasNext(); ) {
+  private void pruneUnionCandidatesNotCoveringAllRanges(List<UnionCandidate> 
ucs, CubeQueryContext cubeql) {
+    for (Iterator<UnionCandidate> itr = ucs.iterator(); itr.hasNext();) {
       UnionCandidate uc = itr.next();
-      if (!isCandidateCoveringTimeRanges(uc, ranges)) {
+      if (!isCandidateCoveringTimeRanges(uc, cubeql.getTimeRanges())) {
         itr.remove();
+        cubeql.addCandidatePruningMsg(uc, 
CandidateTablePruneCause.storageNotAvailableInRange(cubeql.getTimeRanges()));
       }
     }
   }
@@ -96,7 +127,8 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
         } else if (CandidateUtil.isPartiallyValidForTimeRanges(sc, 
cubeql.getTimeRanges())) {
           
allCandidatesPartiallyValid.add(CandidateUtil.cloneStorageCandidate(sc));
         } else {
-          //TODO union : Add cause
+          cubeql.addCandidatePruningMsg(sc, 
CandidateTablePruneCause.storageNotAvailableInRange(
+            cubeql.getTimeRanges()));
         }
       } else {
         throw new LensException("Not a StorageCandidate!!");
@@ -108,7 +140,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
     // Sort the Collection based on no of elements
     Collections.sort(unionCoveringSet, new 
CandidateUtil.ChildrenSizeBasedCandidateComparator<UnionCandidate>());
     // prune non covering sets
-    pruneUnionCandidatesNotCoveringAllRanges(unionCoveringSet, 
cubeql.getTimeRanges());
+    pruneUnionCandidatesNotCoveringAllRanges(unionCoveringSet, cubeql);
     // prune candidate set which doesn't contain any common measure i
     pruneUnionCoveringSetWithoutAnyCommonMeasure(unionCoveringSet, 
queriedMsrs, cubeql);
     // prune redundant covering sets
@@ -116,7 +148,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
     // pruing done in the previous steps, now create union candidates
     candidateSet.addAll(unionCoveringSet);
     updateQueriableMeasures(candidateSet, qpcList, cubeql);
-    return candidateSet ;
+    return candidateSet;
   }
 
   private boolean isMeasureAnswerablebyUnionCandidate(QueriedPhraseContext 
msr, Candidate uc,
@@ -137,7 +169,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
   private void 
pruneUnionCoveringSetWithoutAnyCommonMeasure(List<UnionCandidate> ucs,
       Set<QueriedPhraseContext> queriedMsrs,
       CubeQueryContext cubeql) throws LensException {
-    for (ListIterator<UnionCandidate> itr = ucs.listIterator(); itr.hasNext(); 
) {
+    for (ListIterator<UnionCandidate> itr = ucs.listIterator(); 
itr.hasNext();) {
       boolean toRemove = true;
       UnionCandidate uc = itr.next();
       for (QueriedPhraseContext msr : queriedMsrs) {
@@ -156,7 +188,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
     for (int i = 0; i < candidates.size(); i++) {
       UnionCandidate current = candidates.get(i);
       int j = i + 1;
-      for (ListIterator<UnionCandidate> itr = candidates.listIterator(j); 
itr.hasNext(); ) {
+      for (ListIterator<UnionCandidate> itr = candidates.listIterator(j); 
itr.hasNext();) {
         UnionCandidate next = itr.next();
         if (next.getChildren().containsAll(current.getChildren())) {
           itr.remove();
@@ -182,7 +214,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
         clonedI = clonedI >>> 1;
         --count;
       }
-      combinations.add(new UnionCandidate(individualCombinationList, cubeql ));
+      combinations.add(new UnionCandidate(individualCombinationList, cubeql));
     }
     return combinations;
   }
@@ -192,7 +224,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
     List<List<Candidate>> msrCoveringSets = new ArrayList<>();
     List<Candidate> ucSet = new ArrayList<>(unionCandidates);
     // Check if a single set can answer all the measures and exprsWithMeasures
-    for (Iterator<Candidate> i = ucSet.iterator(); i.hasNext(); ) {
+    for (Iterator<Candidate> i = ucSet.iterator(); i.hasNext();) {
       boolean evaluable = false;
       Candidate uc = i.next();
       for (QueriedPhraseContext msr : msrs) {
@@ -211,7 +243,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
     }
     // Sets that contain all measures or no measures are removed from 
iteration.
     // find other facts
-    for (Iterator<Candidate> i = ucSet.iterator(); i.hasNext(); ) {
+    for (Iterator<Candidate> i = ucSet.iterator(); i.hasNext();) {
       Candidate uc = i.next();
       i.remove();
       // find the remaining measures in other facts
@@ -238,7 +270,7 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
 
   private void updateQueriableMeasures(List<Candidate> cands,
       List<QueriedPhraseContext> qpcList, CubeQueryContext cubeql) throws 
LensException {
-    for (Candidate cand : cands ) {
+    for (Candidate cand : cands) {
       updateStorageCandidateQueriableMeasures(cand, qpcList, cubeql);
     }
   }
@@ -276,4 +308,12 @@ public class CandidateCoveringSetsResolver implements 
ContextRewriter {
       }
     }
   }
-}
\ No newline at end of file
+
+  private static Set<String> getColumns(Collection<QueriedPhraseContext> 
queriedPhraseContexts) {
+    Set<String> cols = new HashSet<>();
+    for (QueriedPhraseContext qur : queriedPhraseContexts) {
+      cols.addAll(qur.getColumns());
+    }
+    return cols;
+  }
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateFact.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateFact.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateFact.java
deleted file mode 100644
index ef7b9bc..0000000
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateFact.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.lens.cube.parse;
-
-import static org.apache.hadoop.hive.ql.parse.HiveParser.*;
-
-import java.util.*;
-
-import org.apache.lens.cube.metadata.*;
-import org.apache.lens.server.api.error.LensException;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.lib.Node;
-import org.apache.hadoop.hive.ql.parse.ASTNode;
-import org.apache.hadoop.hive.ql.parse.HiveParser;
-import org.apache.hadoop.hive.ql.session.SessionState;
-
-import org.antlr.runtime.CommonToken;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import lombok.Getter;
-import lombok.Setter;
-
-//TODO union : delete this class and use Candidate and StorageCandidtae
-/**
- * Holds context of a candidate fact table.
- */
-@Deprecated
-public class CandidateFact implements CandidateTable, QueryAST {
-  final CubeFactTable fact;
-  @Getter
-  private Set<String> storageTables;
-  @Getter
-  private int numQueriedParts = 0;
-  @Getter
-  private final Set<FactPartition> partsQueried = Sets.newHashSet();
-
-  private CubeInterface baseTable;
-  @Getter
-  @Setter
-  private ASTNode selectAST;
-  @Getter
-  @Setter
-  private ASTNode whereAST;
-  @Getter
-  @Setter
-  private ASTNode groupByAST;
-  @Getter
-  @Setter
-  private ASTNode havingAST;
-  @Getter
-  @Setter
-  private ASTNode joinAST;
-  @Getter
-  @Setter
-  private ASTNode orderByAST;
-  @Getter
-  @Setter
-  private Integer limitValue;
-  @Getter
-  private String fromString;
-  private final List<Integer> selectIndices = Lists.newArrayList();
-  private final List<Integer> dimFieldIndices = Lists.newArrayList();
-  private Collection<String> columns;
-  @Getter
-  private final Map<String, ASTNode> storgeWhereClauseMap = new HashMap<>();
-  @Getter
-  private final Map<String, String> storgeWhereStringMap = new HashMap<>();
-  @Getter
-  private final Map<TimeRange, Map<String, LinkedHashSet<FactPartition>>> 
rangeToStoragePartMap = new HashMap<>();
-  @Getter
-  private final Map<TimeRange, Map<String, String>> rangeToStorageWhereMap = 
new HashMap<>();
-  @Getter
-  @Setter
-  private Map<String, Map<String, Float>> dataCompletenessMap;
-
-  CandidateFact(CubeFactTable fact, CubeInterface cube) {
-    this.fact = fact;
-    this.baseTable = cube;
-  }
-
-  @Override
-  public String toString() {
-    return fact.toString();
-  }
-
-  public Collection<String> getColumns() {
-    if (columns == null) {
-      columns = fact.getValidColumns();
-      if (columns == null) {
-        columns = fact.getAllFieldNames();
-      }
-    }
-    return columns;
-  }
-
-  @Override
-  public Set<?> getParticipatingPartitions() {
-    return null;
-  }
-
-  public boolean isValidForTimeRange(TimeRange timeRange) {
-    return (!timeRange.getFromDate().before(fact.getStartTime())) && 
(!timeRange.getToDate().after(fact.getEndTime()));
-  }
-
-  public void addToHaving(ASTNode ast) {
-    if (getHavingAST() == null) {
-      setHavingAST(new ASTNode(new CommonToken(TOK_HAVING, "TOK_HAVING")));
-      getHavingAST().addChild(ast);
-      return;
-    }
-    ASTNode existingHavingAST = (ASTNode) getHavingAST().getChild(0);
-    ASTNode newHavingAST = new ASTNode(new CommonToken(KW_AND, "AND"));
-    newHavingAST.addChild(existingHavingAST);
-    newHavingAST.addChild(ast);
-    getHavingAST().setChild(0, newHavingAST);
-  }
-
-  public String addAndGetAliasFromSelect(ASTNode ast, AliasDecider 
aliasDecider) {
-    for (Node n : getSelectAST().getChildren()) {
-      ASTNode astNode = (ASTNode) n;
-      if (HQLParser.equalsAST(ast, (ASTNode) astNode.getChild(0))) {
-        if (astNode.getChildCount() > 1) {
-          return astNode.getChild(1).getText();
-        }
-        String alias = aliasDecider.decideAlias(astNode);
-        astNode.addChild(new ASTNode(new CommonToken(Identifier, alias)));
-        return alias;
-      }
-    }
-    // Not found, have to add to select
-    String alias = aliasDecider.decideAlias(ast);
-    ASTNode selectExprNode = new ASTNode(new CommonToken(TOK_SELEXPR));
-    selectExprNode.addChild(ast);
-    selectExprNode.addChild(new ASTNode(new CommonToken(Identifier, alias)));
-    getSelectAST().addChild(selectExprNode);
-    return alias;
-  }
-
-  void incrementPartsQueried(int incr) {
-    numQueriedParts += incr;
-  }
-
-  // copy ASTs from CubeQueryContext
-  public void copyASTs(CubeQueryContext cubeql) throws LensException {
-    setSelectAST(MetastoreUtil.copyAST(cubeql.getSelectAST()));
-    setWhereAST(MetastoreUtil.copyAST(cubeql.getWhereAST()));
-    if (cubeql.getJoinAST() != null) {
-      setJoinAST(MetastoreUtil.copyAST(cubeql.getJoinAST()));
-    }
-    if (cubeql.getGroupByAST() != null) {
-      setGroupByAST(MetastoreUtil.copyAST(cubeql.getGroupByAST()));
-    }
-  }
-
-
-  public ASTNode getStorageWhereClause(String storageTable) {
-    return storgeWhereClauseMap.get(storageTable);
-  }
-  public String getStorageWhereString(String storageTable) {
-    return storgeWhereStringMap.get(storageTable);
-  }
-
-  public boolean isExpressionAnswerable(ASTNode node, CubeQueryContext 
context) throws LensException {
-    return 
getColumns().containsAll(HQLParser.getColsInExpr(context.getAliasForTableName(context.getCube()),
 node));
-  }
-
-  /**
-   * Update the ASTs to include only the fields queried from this fact, in all 
the expressions
-   *
-   * @param cubeql
-   * @throws LensException
-   */
-  public void updateASTs(CubeQueryContext cubeql) throws LensException {
-    // update select AST with selected fields
-    int currentChild = 0;
-    for (int i = 0; i < cubeql.getSelectAST().getChildCount(); i++) {
-      ASTNode selectExpr = (ASTNode) this.selectAST.getChild(currentChild);
-      Set<String> exprCols = 
HQLParser.getColsInExpr(cubeql.getAliasForTableName(cubeql.getCube()), 
selectExpr);
-      if (getColumns().containsAll(exprCols)) {
-        selectIndices.add(i);
-        if (exprCols.isEmpty() // no direct fact columns
-          // does not have measure names
-          || (!containsAny(cubeql.getCube().getMeasureNames(), exprCols))) {
-          dimFieldIndices.add(i);
-        }
-        ASTNode aliasNode = HQLParser.findNodeByPath(selectExpr, Identifier);
-        String alias = cubeql.getSelectPhrases().get(i).getSelectAlias();
-        if (aliasNode != null) {
-          String queryAlias = aliasNode.getText();
-          if (!queryAlias.equals(alias)) {
-            // replace the alias node
-            ASTNode newAliasNode = new ASTNode(new 
CommonToken(HiveParser.Identifier, alias));
-            
this.selectAST.getChild(currentChild).replaceChildren(selectExpr.getChildCount()
 - 1,
-              selectExpr.getChildCount() - 1, newAliasNode);
-          }
-        } else {
-          // add column alias
-          ASTNode newAliasNode = new ASTNode(new 
CommonToken(HiveParser.Identifier, alias));
-          this.selectAST.getChild(currentChild).addChild(newAliasNode);
-        }
-      } else {
-        this.selectAST.deleteChild(currentChild);
-        currentChild--;
-      }
-      currentChild++;
-    }
-
-    // don't need to update where ast, since where is only on dim attributes 
and dim attributes
-    // are assumed to be common in multi fact queries.
-
-    // push down of having clauses happens just after this call in 
cubequerycontext
-  }
-
-  // The source set contains atleast one column in the colSet
-  static boolean containsAny(Collection<String> srcSet, Collection<String> 
colSet) {
-    if (colSet == null || colSet.isEmpty()) {
-      return true;
-    }
-    for (String column : colSet) {
-      if (srcSet.contains(column)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public String getStorageString(String alias) {
-    return StringUtils.join(storageTables, ",") + " " + alias;
-  }
-
-  @Override
-  public String getStorageName() {
-    return null;
-  }
-
-  public void setStorageTables(Set<String> storageTables) {
-    String database = SessionState.get().getCurrentDatabase();
-    // Add database name prefix for non default database
-    if (StringUtils.isNotBlank(database) && 
!"default".equalsIgnoreCase(database)) {
-      Set<String> storageTbls = new TreeSet<>();
-      Iterator<String> names = storageTables.iterator();
-      while (names.hasNext()) {
-        storageTbls.add(database + "." + names.next());
-      }
-      this.storageTables = storageTbls;
-    } else {
-      this.storageTables = storageTables;
-    }
-  }
-
-  @Override
-  public AbstractCubeTable getBaseTable() {
-    return (AbstractCubeTable) baseTable;
-  }
-
-  @Override
-  public CubeFactTable getTable() {
-    return fact;
-  }
-
-  @Override
-  public String getName() {
-    return fact.getName();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (!super.equals(obj)) {
-      return false;
-    }
-    CandidateFact other = (CandidateFact) obj;
-
-    if (this.getTable() == null) {
-      if (other.getTable() != null) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = super.hashCode();
-    result = prime * result + ((getTable() == null) ? 0 : 
getTable().getName().toLowerCase().hashCode());
-    return result;
-  }
-
-  public String getSelectString() {
-    return HQLParser.getString(selectAST);
-  }
-
-  public String getWhereString() {
-    if (whereAST != null) {
-      return HQLParser.getString(whereAST);
-    }
-    return null;
-  }
-
-  public String getHavingString() {
-    if (havingAST != null) {
-      return HQLParser.getString(havingAST);
-    }
-    return null;
-  }
-
-  @Override
-  public String getOrderByString() {
-    if (orderByAST != null) {
-      return HQLParser.getString(orderByAST);
-    }
-    return null;
-  }
-
-  /**
-   * @return the selectIndices
-   */
-  public List<Integer> getSelectIndices() {
-    return selectIndices;
-  }
-
-  /**
-   * @return the groupbyIndices
-   */
-  public List<Integer> getDimFieldIndices() {
-    return dimFieldIndices;
-  }
-
-  public String getGroupByString() {
-    if (groupByAST != null) {
-      return HQLParser.getString(groupByAST);
-    }
-    return null;
-  }
-
-  public Set<String> getTimePartCols(CubeQueryContext query) throws 
LensException {
-    Set<String> cubeTimeDimensions = baseTable.getTimedDimensions();
-    Set<String> timePartDimensions = new HashSet<String>();
-    String singleStorageTable = storageTables.iterator().next();
-    List<FieldSchema> partitionKeys = null;
-    partitionKeys = 
query.getMetastoreClient().getTable(singleStorageTable).getPartitionKeys();
-    for (FieldSchema fs : partitionKeys) {
-      if 
(cubeTimeDimensions.contains(CubeQueryContext.getTimeDimOfPartitionColumn(baseTable,
 fs.getName()))) {
-        timePartDimensions.add(fs.getName());
-      }
-    }
-    return timePartDimensions;
-  }
-
-  /*
-  public void updateFromString(CubeQueryContext query, Set<Dimension> 
queryDims,
-    Map<Dimension, CandidateDim> dimsToQuery) throws LensException {
-    fromString = "%s"; // to update the storage alias later
-    if (query.isAutoJoinResolved()) {
-      fromString =
-        query.getAutoJoinCtx().getFromString(fromString, this, queryDims, 
dimsToQuery,
-          query, this);
-    }
-  }
-  */
-}

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTablePruneCause.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTablePruneCause.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTablePruneCause.java
index cef8f37..c7f2047 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTablePruneCause.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTablePruneCause.java
@@ -38,25 +38,34 @@ import lombok.NoArgsConstructor;
 @JsonWriteNullProperties(false)
 @Data
 @NoArgsConstructor
-//TODO union: Since we are working on StoargeCandidates now, we might need 
some chnages here
 public class CandidateTablePruneCause {
 
   public enum CandidateTablePruneCode {
     // other fact set element is removed
     ELEMENT_IN_SET_PRUNED("Other candidate from measure covering set is 
pruned"),
-    FACT_NOT_AVAILABLE_IN_RANGE("No facts available for all of these time 
ranges: %s") {
-      @Override
+
+    COLUMN_NOT_FOUND("%s are not %s") {
       Object[] getFormatPlaceholders(Set<CandidateTablePruneCause> causes) {
-        Set<TimeRange> allRanges = Sets.newHashSet();
-        for (CandidateTablePruneCause cause : causes) {
-          allRanges.addAll(cause.getInvalidRanges());
+        if (causes.size() == 1) {
+          return new String[]{
+            "Columns " + causes.iterator().next().getMissingColumns(),
+            "present in any table",
+          };
+        } else {
+          List<List<String>> columnSets = new ArrayList<List<String>>();
+          for (CandidateTablePruneCause cause : causes) {
+            columnSets.add(cause.getMissingColumns());
+          }
+          return new String[]{
+            "Column Sets: " + columnSets,
+            "queriable together",
+          };
         }
-        return new Object[]{
-          allRanges.toString(),
-        };
       }
     },
-
+    // candidate table tries to get denormalized field from dimension and the
+    // referred dimension is invalid.
+    INVALID_DENORM_TABLE("Referred dimension is invalid in one of the 
candidate tables"),
 
     // Moved from Stoarge causes .
     //The storage is removed as its not set in property 
"lens.cube.query.valid.fact.<fact_name>.storagetables"
@@ -65,9 +74,7 @@ public class CandidateTablePruneCause {
     // STOARGE_TABLE_DOES_NOT_EXIST("Storage table does not exist"),
     // storage has no update periods queried. Commented as its not being used 
anywhere in master.
     // MISSING_UPDATE_PERIODS("Storage has no update periods"),
-    // no candidate update periods, update period cause will have why each
-    // update period is not a candidate
-    NO_CANDIDATE_UPDATE_PERIODS("Storage update periods are not candidate"),
+
     // storage table has no partitions queried
     NO_PARTITIONS("Storage table has no partitions"),
     // partition column does not exist
@@ -76,7 +83,20 @@ public class CandidateTablePruneCause {
     TIME_RANGE_NOT_ANSWERABLE("Range not answerable"),
     // storage is not supported by execution engine/driver
     UNSUPPORTED_STORAGE("Unsupported Storage"),
-    
+
+    STORAGE_NOT_AVAILABLE_IN_RANGE("No storages available for all of these 
time ranges: %s") {
+      @Override
+      Object[] getFormatPlaceholders(Set<CandidateTablePruneCause> causes) {
+        Set<TimeRange> allRanges = Sets.newHashSet();
+        for (CandidateTablePruneCause cause : causes) {
+          allRanges.addAll(cause.getInvalidRanges());
+        }
+        return new Object[]{
+          allRanges.toString(),
+        };
+      }
+    },
+
     // least weight not satisfied
     MORE_WEIGHT("Picked table had more weight than minimum."),
     // partial data is enabled, another fact has more data.
@@ -95,13 +115,10 @@ public class CandidateTablePruneCause {
         return new String[]{columns.toString()};
       }
     },
-    // candidate table tries to get denormalized field from dimension and the
-    // referred dimension is invalid.
-    INVALID_DENORM_TABLE("Referred dimension is invalid in one of the 
candidate tables"),
     // column not valid in cube table. Commented the below line as it's not 
being used in master.
     //COLUMN_NOT_VALID("Column not valid in cube table"),
     // column not found in cube table
-    COLUMN_NOT_FOUND("%s are not %s") {
+    DENORM_COLUMN_NOT_FOUND("%s are not %s") {
       Object[] getFormatPlaceholders(Set<CandidateTablePruneCause> causes) {
         if (causes.size() == 1) {
           return new String[]{
@@ -138,7 +155,13 @@ public class CandidateTablePruneCause {
         };
       }
     },
-    NO_FACT_UPDATE_PERIODS_FOR_GIVEN_RANGE("No fact update periods for given 
range"),
+    //Commented as its not used anymore.
+    //NO_FACT_UPDATE_PERIODS_FOR_GIVEN_RANGE("No fact update periods for given 
range"),
+
+    // no candidate update periods, update period cause will have why each
+    // update period is not a candidate
+    NO_CANDIDATE_UPDATE_PERIODS("Storage update periods are not valid for 
given time range"),
+
     NO_COLUMN_PART_OF_A_JOIN_PATH("No column part of a join path. Join 
columns: [%s]") {
       Object[] getFormatPlaceholders(Set<CandidateTablePruneCause> causes) {
         List<String> columns = new ArrayList<String>();
@@ -232,8 +255,6 @@ public class CandidateTablePruneCause {
   // the fact is not partitioned by part col of the time dim and time dim is 
not a dim attribute
   private Set<String> unsupportedTimeDims;
   // time covered
-  // TODO union : Fix this after MaxCoveringFactResolver chnaged wrt. Candidate
-  //private MaxCoveringFactResolver.TimeCovered maxTimeCovered;
   // ranges in which fact is invalid
   private List<TimeRange> invalidRanges;
 
@@ -247,8 +268,8 @@ public class CandidateTablePruneCause {
   }
 
   // Different static constructors for different causes.
-  public static CandidateTablePruneCause 
factNotAvailableInRange(List<TimeRange> ranges) {
-    CandidateTablePruneCause cause = new 
CandidateTablePruneCause(FACT_NOT_AVAILABLE_IN_RANGE);
+  public static CandidateTablePruneCause 
storageNotAvailableInRange(List<TimeRange> ranges) {
+    CandidateTablePruneCause cause = new 
CandidateTablePruneCause(STORAGE_NOT_AVAILABLE_IN_RANGE);
     cause.invalidRanges = ranges;
     return cause;
   }
@@ -258,22 +279,23 @@ public class CandidateTablePruneCause {
     return cause;
   }
 
-  public static CandidateTablePruneCause columnNotFound(Collection<String>... 
missingColumns) {
+  public static CandidateTablePruneCause 
columnNotFound(CandidateTablePruneCode pruneCode,
+      Collection<String>... missingColumns) {
     List<String> colList = new ArrayList<String>();
     for (Collection<String> missing : missingColumns) {
       colList.addAll(missing);
     }
-    CandidateTablePruneCause cause = new 
CandidateTablePruneCause(COLUMN_NOT_FOUND);
+    CandidateTablePruneCause cause = new CandidateTablePruneCause(pruneCode);
     cause.setMissingColumns(colList);
     return cause;
   }
 
-  public static CandidateTablePruneCause columnNotFound(String... columns) {
+  public static CandidateTablePruneCause 
columnNotFound(CandidateTablePruneCode pruneCode, String... columns) {
     List<String> colList = new ArrayList<String>();
     for (String column : columns) {
       colList.add(column);
     }
-    return columnNotFound(colList);
+    return columnNotFound(pruneCode, colList);
   }
 
   public static CandidateTablePruneCause expressionNotEvaluable(String... 
exprs) {
@@ -300,14 +322,6 @@ public class CandidateTablePruneCause {
     return cause;
   }
 
-  // TODO union : uncomment the below method after MaxCoveringFactResolver is 
fixed wrt. Candidate
-  /*
-  public static CandidateTablePruneCause 
lessData(MaxCoveringFactResolver.TimeCovered timeCovered) {
-    CandidateTablePruneCause cause = new CandidateTablePruneCause(LESS_DATA);
-    cause.setMaxTimeCovered(timeCovered);
-    return cause;
-  }
-*/
   public static CandidateTablePruneCause noColumnPartOfAJoinPath(final 
Collection<String> colSet) {
     CandidateTablePruneCause cause =
       new CandidateTablePruneCause(NO_COLUMN_PART_OF_A_JOIN_PATH);

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/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 7a885a2..2ab7f4b 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
@@ -58,7 +58,6 @@ class CandidateTableResolver implements ContextRewriter {
   public void rewriteContext(CubeQueryContext cubeql) throws LensException {
     if (checkForQueriedColumns) {
       log.debug("Dump queried columns:{}", cubeql.getTblAliasToColumns());
-      //TODO union : create StoargeCandidate s now in populateCandidateTables
       populateCandidateTables(cubeql);
       resolveCandidateFactTables(cubeql);
       resolveCandidateDimTables(cubeql);
@@ -74,7 +73,6 @@ class CandidateTableResolver implements ContextRewriter {
       if (cubeql.getAutoJoinCtx() != null) {
         // Before checking for candidate table columns, prune join paths 
containing non existing columns
         // in populated candidate tables
-        //TODO rewrite : commented below line to compile
         cubeql.getAutoJoinCtx().pruneAllPaths(cubeql.getCube(),
             CandidateUtil.getStorageCandidates(cubeql.getCandidates()), null);
         
cubeql.getAutoJoinCtx().pruneAllPathsForCandidateDims(cubeql.getCandidateDimTables());
@@ -84,8 +82,6 @@ class CandidateTableResolver implements ContextRewriter {
       // check for joined columns and denorm columns on refered tables
       resolveCandidateFactTablesForJoins(cubeql);
       resolveCandidateDimTablesForJoinsAndDenorms(cubeql);
-      // TODO union : below method can be deleted from CubeQueryContext
-      
//cubeql.pruneCandidateFactSet(CandidateTablePruneCode.INVALID_DENORM_TABLE);
       checkForQueriedColumns = true;
     }
   }
@@ -260,7 +256,7 @@ class CandidateTableResolver implements ContextRewriter {
         }
       }
       // Remove storage candidates based on whether they are valid or not.
-      for (Iterator<Candidate> i = cubeql.getCandidates().iterator(); 
i.hasNext(); ) {
+      for (Iterator<Candidate> i = cubeql.getCandidates().iterator(); 
i.hasNext();) {
         Candidate cand = i.next();
         if (cand instanceof StorageCandidate) {
           StorageCandidate sc = (StorageCandidate) cand;
@@ -287,7 +283,8 @@ class CandidateTableResolver implements ContextRewriter {
           for (QueriedPhraseContext qur : dimExprs) {
             if (!qur.isEvaluable(cubeql, sc)) {
               log.info("Not considering storage candidate:{} as columns {} are 
not available", sc, qur.getColumns());
-              cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(qur.getColumns()));
+              cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(
+                  CandidateTablePruneCode.COLUMN_NOT_FOUND, qur.getColumns()));
               toRemove = true;
               break;
             }
@@ -299,7 +296,8 @@ class CandidateTableResolver implements ContextRewriter {
           if (!checkForFactColumnExistsAndValidForRange(sc, queriedMsrs, 
cubeql)) {
             Set<String> columns = getColumns(queriedMsrs);
             log.info("Not considering storage candidate:{} as columns {} is 
not available", sc, columns);
-            cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(columns));
+            cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(
+                CandidateTablePruneCode.COLUMN_NOT_FOUND, columns));
             toRemove = true;
           }
 
@@ -312,7 +310,8 @@ class CandidateTableResolver implements ContextRewriter {
               if (optdim == null) {
                 log.info("Not considering storage candidate:{} as columns {} 
are not available", sc,
                     chain.getSourceColumns());
-                cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(chain.getSourceColumns()));
+                cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(
+                    CandidateTablePruneCode.COLUMN_NOT_FOUND, 
chain.getSourceColumns()));
                 toRemove = true;
                 break;
               }
@@ -540,7 +539,7 @@ class CandidateTableResolver implements ContextRewriter {
                   log.info("Not considering Storage:{} as its required 
optional dims are not reachable", candidate);
                   cubeql.getCandidates().remove(candidate);
                   cubeql.addStoragePruningMsg((StorageCandidate) candidate,
-                      CandidateTablePruneCause.columnNotFound(col));
+                      
CandidateTablePruneCause.columnNotFound(CandidateTablePruneCode.COLUMN_NOT_FOUND,
 col));
                   Collection<Candidate> prunedCandidates = CandidateUtil.
                       filterCandidates(cubeql.getCandidates(), 
(StorageCandidate) candidate);
                   cubeql.addCandidatePruningMsg(prunedCandidates,
@@ -551,7 +550,7 @@ class CandidateTableResolver implements ContextRewriter {
                 cubeql.getCandidateDimTables().get(((CandidateDim) 
candidate).getBaseTable()).remove(candidate);
                 cubeql.addDimPruningMsgs((Dimension) candidate.getBaseTable(),
                   (CubeDimensionTable) candidate.getTable(),
-                  CandidateTablePruneCause.columnNotFound(col));
+                  
CandidateTablePruneCause.columnNotFound(CandidateTablePruneCode.COLUMN_NOT_FOUND,
 col));
               }
             }
           }
@@ -650,7 +649,8 @@ class CandidateTableResolver implements ContextRewriter {
                   // check if it available as reference, if not remove the
                   // candidate
                   log.info("Not considering dimtable: {} as column {} is not 
available", cdim, col);
-                  cubeql.addDimPruningMsgs(dim, cdim.getTable(), 
CandidateTablePruneCause.columnNotFound(col));
+                  cubeql.addDimPruningMsgs(dim, cdim.getTable(), 
CandidateTablePruneCause.columnNotFound(
+                      CandidateTablePruneCode.COLUMN_NOT_FOUND, col));
                   i.remove();
                   break;
                 }

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateUtil.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateUtil.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateUtil.java
index 6cb7e3f..025a6ba 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateUtil.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateUtil.java
@@ -1,26 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for theJoinCandidate.java
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.lens.cube.parse;
 
+import static org.apache.hadoop.hive.ql.parse.HiveParser.Identifier;
+
 import java.util.*;
 
-import org.antlr.runtime.CommonToken;
-import org.apache.hadoop.hive.ql.parse.HiveParser;
-import org.apache.lens.cube.metadata.CubeMetastoreClient;
-import org.apache.lens.cube.metadata.FactPartition;
-import org.apache.lens.cube.metadata.MetastoreUtil;
-import org.apache.lens.cube.metadata.TimeRange;
+import org.apache.lens.cube.metadata.*;
 import org.apache.lens.server.api.error.LensException;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+
+import org.antlr.runtime.CommonToken;
 
 import com.google.common.collect.BoundType;
 import com.google.common.collect.Range;
 import com.google.common.collect.RangeSet;
 import com.google.common.collect.TreeRangeSet;
 
-import static org.apache.hadoop.hive.ql.parse.HiveParser.Identifier;
-
 /**
  * Placeholder for Util methods that will be required for {@link Candidate}
  */
@@ -113,21 +129,12 @@ public class CandidateUtil {
   }
 
   public static Set<StorageCandidate> getStorageCandidates(final Candidate 
candidate) {
-    return getStorageCandidates(new HashSet<Candidate>(1) {{
-      add(candidate);
-    }});
+    return getStorageCandidates(new HashSet<Candidate>(1) {{ add(candidate); 
}});
   }
 
-  /**
-   *
-   * @param candSet
-   * @param msrs
-   * @param cubeql
-   * @return
-   * @throws LensException
-   */
+
   public static Set<QueriedPhraseContext> coveredMeasures(Candidate candSet, 
Collection<QueriedPhraseContext> msrs,
-    CubeQueryContext cubeql) throws LensException {
+      CubeQueryContext cubeql) throws LensException {
     Set<QueriedPhraseContext> coveringSet = new HashSet<>();
     for (QueriedPhraseContext msr : msrs) {
       if (candSet.getChildren() == null) {
@@ -136,12 +143,12 @@ public class CandidateUtil {
         }
       } else {
         // TODO union : all candidates should answer
-          for (Candidate cand : candSet.getChildren()) {
-            if (msr.isEvaluable(cubeql, (StorageCandidate) cand)) {
-              coveringSet.add(msr);
-            }
+        for (Candidate cand : candSet.getChildren()) {
+          if (msr.isEvaluable(cubeql, (StorageCandidate) cand)) {
+            coveringSet.add(msr);
           }
         }
+      }
     }
     return coveringSet;
   }
@@ -190,6 +197,7 @@ public class CandidateUtil {
 
   /**
    * Gets all the Storage Candidates that participate in the collection of 
passed candidates
+   *
    * @param candidates
    * @return
    */
@@ -211,7 +219,7 @@ public class CandidateUtil {
     }
   }
 
-  public static StorageCandidate cloneStorageCandidate(StorageCandidate sc) {
+  public static StorageCandidate cloneStorageCandidate(StorageCandidate sc) 
throws LensException{
     return new StorageCandidate(sc);
   }
 
@@ -222,11 +230,10 @@ public class CandidateUtil {
     }
   }
 
-  private static final String baseQueryFormat = "SELECT %s FROM %s";
-
-  public static String buildHQLString(String select, String from, String 
where, String groupby, String orderby, String having,
-                                      Integer limit) {
+  private static final String BASE_QUERY_FORMAT = "SELECT %s FROM %s";
 
+  public static String buildHQLString(String select, String from, String where,
+      String groupby, String orderby, String having, Integer limit) {
     List<String> qstrs = new ArrayList<String>();
     qstrs.add(select);
     qstrs.add(from);
@@ -247,7 +254,7 @@ public class CandidateUtil {
     }
 
     StringBuilder queryFormat = new StringBuilder();
-    queryFormat.append(baseQueryFormat);
+    queryFormat.append(BASE_QUERY_FORMAT);
     if (!StringUtils.isBlank(where)) {
       queryFormat.append(" WHERE %s");
     }
@@ -307,15 +314,4 @@ public class CandidateUtil {
     }
     return false;
   }
-
-
-  public static Set<String> getMissingPartitions(StorageCandidate sc) {
-    Set<String> missingParts = new HashSet<>();
-    for (FactPartition part : sc.getParticipatingPartitions()) {
-      if (!part.isFound()) {
-        missingParts.add(part.toString()); //TODOD union . add approprite 
partition String
-      }
-    }
-    return missingParts;
-  }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryContext.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryContext.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryContext.java
index 470d6e7..f602c5f 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryContext.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryContext.java
@@ -36,7 +36,6 @@ import 
org.apache.lens.cube.error.NoCandidateDimAvailableException;
 import org.apache.lens.cube.error.NoCandidateFactAvailableException;
 import org.apache.lens.cube.metadata.*;
 import org.apache.lens.cube.metadata.join.TableRelationship;
-import 
org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode;
 import org.apache.lens.cube.parse.join.AutoJoinContext;
 import org.apache.lens.cube.parse.join.JoinClause;
 import org.apache.lens.cube.parse.join.JoinTree;
@@ -180,10 +179,6 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
   @Getter
   @Setter
   private DenormalizationResolver.DenormalizationContext deNormCtx;
-  //TODO union : deprecate factPruningMsgs
-  @Getter
-  @Deprecated
-  private PruneCauses<CubeFactTable> factPruningMsgs = new PruneCauses<>();
   @Getter
   private PruneCauses<StorageCandidate>  storagePruningMsgs = new 
PruneCauses<>();
   @Getter
@@ -346,7 +341,6 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
         return false;
       }
     } catch (LensException e) {
-      //TODO: check if catch can be removed
       return false;
     }
     return true;
@@ -486,26 +480,6 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
     return candidateDims;
   }
 
-  /**
-   * TODO union : deprecate this method and use
-   * {@link # addFactPruningMsg(CubeInterface, CubeFactTable, 
CandidateTablePruneCause)}
-   * or
-   * {@link #addStoragePruningMsg(StorageCandidate, CandidateTablePruneCause)}
-   * */
-  @Deprecated
-  public void addFactPruningMsgs(CubeFactTable fact, CandidateTablePruneCause 
factPruningMsg) {
-    throw new IllegalStateException("This method is deprecate");
-  }
-
-  //TODO union : not required as all the pruning happening at StorageCandidate
-  /*
-  public void addFactPruningMsg(CubeInterface cube, CubeFactTable fact, 
CandidateTablePruneCause factPruningMsg) {
-    log.info("Pruning fact {} with cause: {}", fact, factPruningMsg);
-    for (String storageName : fact.getStorages()) {
-      addStoragePruningMsg(new StorageCandidate(cube, fact, storageName), 
factPruningMsg);
-    }
-  }
-*/
   public void addCandidatePruningMsg(Collection<Candidate> 
candidateCollection, CandidateTablePruneCause pruneCause) {
     for (Candidate c : candidateCollection){
       addCandidatePruningMsg(c, pruneCause);
@@ -735,7 +709,8 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
     qb.getParseInfo().setDestLimit(getClause(), 0, value);
   }
 
-  private String getStorageStringWithAlias(StorageCandidate candidate, 
Map<Dimension, CandidateDim> dimsToQuery, String alias) {
+  private String getStorageStringWithAlias(StorageCandidate candidate, 
Map<Dimension,
+      CandidateDim> dimsToQuery, String alias) {
     if (cubeTbls.get(alias) instanceof CubeInterface) {
       return candidate.getAliasForTable(alias);
     } else {
@@ -815,7 +790,6 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
     }
   }
 
-  // TODO union : Reevaluate this method.
   void setNonexistingParts(Map<String, Set<String>> nonExistingParts) throws 
LensException {
     if (!nonExistingParts.isEmpty()) {
       ByteArrayOutputStream out = null;
@@ -912,7 +886,8 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
             }
           }
         }
-        log.error("Query rewrite failed due to NO_CANDIDATE_FACT_AVAILABLE, 
Cause {}", storagePruningMsgs.toJsonObject());
+        log.error("Query rewrite failed due to NO_CANDIDATE_FACT_AVAILABLE, 
Cause {}",
+            storagePruningMsgs.toJsonObject());
         throw new NoCandidateFactAvailableException(storagePruningMsgs);
       }
     }
@@ -922,7 +897,6 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
   private HQLContextInterface hqlContext;
 
   @Getter
-  //TODO union : This will be the final Candidate . private Candidate 
pickedCandidate
   private Candidate pickedCandidate;
   @Getter
   private Collection<CandidateDim> pickedDimTables;
@@ -956,10 +930,9 @@ public class CubeQueryContext extends TracksQueriedColumns 
implements QueryAST {
 
     Map<StorageCandidate, Set<Dimension>> factDimMap = new HashMap<>();
     if (cand != null) {
-      // copy ASTs for each storage candidate
+      // Set the default queryAST for StorageCandidate and copy child ASTs 
from cubeql.
+      // Later in the rewrite flow each Storage candidate will modify them 
accordingly.
       for (StorageCandidate sc : scSet) {
-        // Set the default queryAST for StorageCandidate and copy child ASTs 
from cubeql.
-        // Later in the rewrite flow each Storage candidate will modify them 
accordingly.
         sc.setQueryAst(DefaultQueryAST.fromStorageCandidate(sc, this));
         CandidateUtil.copyASTs(this, sc.getQueryAst());
         factDimMap.put(sc, new HashSet<>(dimsToQuery.keySet()));
@@ -1046,10 +1019,10 @@ public class CubeQueryContext extends 
TracksQueriedColumns implements QueryAST {
     } else if (cand instanceof StorageCandidate) {
       StorageCandidate sc = (StorageCandidate) cand;
       sc.updateAnswerableSelectColumns(this);
-      return getInsertClause() + sc.toHQL();
+      return getInsertClause() + sc.toHQL(factDimMap.get(sc));
     } else {
       UnionQueryWriter uqc = new UnionQueryWriter(cand, this);
-      return getInsertClause() + uqc.toHQL();
+      return getInsertClause() + uqc.toHQL(factDimMap);
     }
   }
 
@@ -1232,63 +1205,6 @@ public class CubeQueryContext extends 
TracksQueriedColumns implements QueryAST {
     queriedExprsWithMeasures.addAll(exprs);
   }
 
-  /**
-   * Prune candidate fact sets with respect to available candidate facts.
-   * <p></p>
-   * Prune a candidate set, if any of the fact is missing.
-   *
-   */
-  //TODO union : deprecated
-  @Deprecated
-  /*
-  public void pruneCandidateFactSet(CandidateTablePruneCode pruneCause) {
-    // remove candidate fact sets that have missing facts
-    for (Iterator<Set<CandidateFact>> i = candidateFactSets.iterator(); 
i.hasNext();) {
-      Set<CandidateFact> cfacts = i.next();
-      if (!candidateFacts.containsAll(cfacts)) {
-        log.info("Not considering fact table set:{} as they have non candidate 
tables and facts missing because of {}",
-          cfacts, pruneCause);
-        i.remove();
-      }
-    }
-    // prune candidate facts
-    
pruneCandidateFactWithCandidateSet(CandidateTablePruneCode.ELEMENT_IN_SET_PRUNED);
-  }
-*/
-  /**
-   * Prune candidate fact with respect to available candidate fact sets.
-   * <p></p>
-   * If candidate fact is not present in any of the candidate fact sets, 
remove it.
-   *
-   * @param pruneCause
-   */
-/*
-  public void pruneCandidateFactWithCandidateSet(CandidateTablePruneCode 
pruneCause) {
-    // remove candidate facts that are not part of any covering set
-    pruneCandidateFactWithCandidateSet(new 
CandidateTablePruneCause(pruneCause));
-  }
-*/
-  //TODO union : deprecated
-  /*
-  @Deprecated
-
-  public void pruneCandidateFactWithCandidateSet(CandidateTablePruneCause 
pruneCause) {
-    // remove candidate facts that are not part of any covering set
-    Set<CandidateFact> allCoveringFacts = new HashSet<CandidateFact>();
-    for (Set<CandidateFact> set : candidateFactSets) {
-      allCoveringFacts.addAll(set);
-    }
-    for (Iterator<CandidateFact> i = candidateFacts.iterator(); i.hasNext();) {
-      CandidateFact cfact = i.next();
-      if (!allCoveringFacts.contains(cfact)) {
-        log.info("Not considering fact table:{} as {}", cfact, pruneCause);
-        addFactPruningMsgs(cfact.fact, pruneCause);
-        i.remove();
-      }
-    }
-  }
-*/
-
   public void addQueriedTimeDimensionCols(final String timeDimColName) {
 
     checkArgument(StringUtils.isNotBlank(timeDimColName));

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
index abd909f..4dd3d00 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
@@ -142,6 +142,7 @@ public class CubeQueryRewriter {
     DenormalizationResolver denormResolver = new DenormalizationResolver(conf);
     CandidateTableResolver candidateTblResolver = new 
CandidateTableResolver(conf);
     StorageTableResolver storageTableResolver = new StorageTableResolver(conf);
+    // Resolve expressions
     rewriters.add(exprResolver);
     // De-normalized columns resolved
     rewriters.add(denormResolver);
@@ -154,7 +155,8 @@ public class CubeQueryRewriter {
     rewriters.add(new GroupbyResolver(conf));
     rewriters.add(new FieldValidator());
     rewriters.add(storageTableResolver);
-    //TODO union: Add CoveringSetResolver which creates UnionCandidates and 
JoinCandidates. Some code form candidateTblResolver(phase 2) to be moved to 
CoveringSetResolver
+    //TODO union: Add CoveringSetResolver which creates UnionCandidates and 
JoinCandidates.
+    //TODO union: Some code form candidateTblResolver(phase 2) to be moved to 
CoveringSetResolver
     //TODO union: AggregateResolver,GroupbyResolver,FieldValidator before 
CoveringSetResolver
     // Resolve joins and generate base join tree
     rewriters.add(new JoinResolver(conf));

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/DefaultAliasDecider.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/DefaultAliasDecider.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/DefaultAliasDecider.java
index cd44235..c8bf787 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/DefaultAliasDecider.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/DefaultAliasDecider.java
@@ -18,10 +18,10 @@
  */
 package org.apache.lens.cube.parse;
 
-import lombok.Getter;
-import lombok.Setter;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
 
+import lombok.Getter;
+import lombok.Setter;
 
 public class DefaultAliasDecider implements AliasDecider {
   @Getter

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
index 646dbd6..bb29034 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
@@ -240,13 +240,13 @@ public class DenormalizationResolver implements 
ContextRewriter {
     private void replaceReferencedColumns(StorageCandidate sc, boolean 
replaceFact) throws LensException {
       QueryAST ast = cubeql;
       boolean factRefExists = sc != null && tableToRefCols.get(sc.getName()) 
!= null && !tableToRefCols.get(sc
-        .getName()).isEmpty();
+          .getName()).isEmpty();
       if (replaceFact && factRefExists) {
         ast = sc.getQueryAst();
       }
       resolveClause(cubeql, ast.getSelectAST());
       if (factRefExists) {
-          resolveClause(cubeql, sc.getQueryAst().getWhereAST());
+        resolveClause(cubeql, sc.getQueryAst().getWhereAST());
       } else {
         resolveClause(cubeql, ast.getWhereAST());
       }
@@ -347,18 +347,17 @@ public class DenormalizationResolver implements 
ContextRewriter {
         for (Iterator<StorageCandidate> i =
              
CandidateUtil.getStorageCandidates(cubeql.getCandidates()).iterator(); 
i.hasNext();) {
           StorageCandidate sc = i.next();
-          //TODO union : is this happening in pahse 1 or 2 ?
-          //TODO union : If phase 2, the below code will not work. Move to 
phase1 in that case
-            if (denormCtx.tableToRefCols.containsKey(sc.getFact().getName())) {
-              for (ReferencedQueriedColumn refcol : 
denormCtx.tableToRefCols.get(sc.getFact().getName())) {
-                if 
(denormCtx.getReferencedCols().get(refcol.col.getName()).isEmpty()) {
-                  log.info("Not considering storage candidate :{} as column {} 
is not available", sc, refcol.col);
-                  cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(refcol.col.getName()));
-                  Collection<Candidate> prunedCandidates = 
CandidateUtil.filterCandidates(cubeql.getCandidates(), sc);
-                  cubeql.addCandidatePruningMsg(prunedCandidates,
-                      new 
CandidateTablePruneCause(CandidateTablePruneCode.ELEMENT_IN_SET_PRUNED));
-                }
+          if (denormCtx.tableToRefCols.containsKey(sc.getFact().getName())) {
+            for (ReferencedQueriedColumn refcol : 
denormCtx.tableToRefCols.get(sc.getFact().getName())) {
+              if 
(denormCtx.getReferencedCols().get(refcol.col.getName()).isEmpty()) {
+                log.info("Not considering storage candidate :{} as column {} 
is not available", sc, refcol.col);
+                cubeql.addStoragePruningMsg(sc, 
CandidateTablePruneCause.columnNotFound(
+                    CandidateTablePruneCode.DENORM_COLUMN_NOT_FOUND, 
refcol.col.getName()));
+                Collection<Candidate> prunedCandidates = 
CandidateUtil.filterCandidates(cubeql.getCandidates(), sc);
+                cubeql.addCandidatePruningMsg(prunedCandidates,
+                    new 
CandidateTablePruneCause(CandidateTablePruneCode.ELEMENT_IN_SET_PRUNED));
               }
+            }
           }
         }
         if (cubeql.getCandidates().size() == 0) {
@@ -376,7 +375,8 @@ public class DenormalizationResolver implements 
ContextRewriter {
                 if 
(denormCtx.getReferencedCols().get(refcol.col.getName()).isEmpty()) {
                   log.info("Not considering dim table:{} as column {} is not 
available", cdim, refcol.col);
                   cubeql.addDimPruningMsgs(dim, cdim.dimtable,
-                    
CandidateTablePruneCause.columnNotFound(refcol.col.getName()));
+                    
CandidateTablePruneCause.columnNotFound(CandidateTablePruneCode.DENORM_COLUMN_NOT_FOUND,
+                        refcol.col.getName()));
                   i.remove();
                 }
               }

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/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 0cf4b1c..82113af 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
@@ -25,7 +25,6 @@ import java.util.*;
 
 import org.apache.lens.cube.metadata.*;
 import org.apache.lens.cube.metadata.ExprColumn.ExprSpec;
-import 
org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode;
 import org.apache.lens.cube.parse.HQLParser.ASTNodeVisitor;
 import org.apache.lens.cube.parse.HQLParser.TreeNode;
 import org.apache.lens.server.api.error.LensException;
@@ -450,7 +449,7 @@ class ExpressionResolver implements ContextRewriter {
       throws LensException {
       replaceAST(cubeql, queryAST.getSelectAST());
       if (sc != null) {
-          replaceAST(cubeql, sc.getQueryAst().getWhereAST());
+        replaceAST(cubeql, sc.getQueryAst().getWhereAST());
       } else {
         replaceAST(cubeql, queryAST.getWhereAST());
       }
@@ -652,11 +651,13 @@ class ExpressionResolver implements ContextRewriter {
           for (ExpressionContext ec : ecSet) {
             if (ec.getSrcTable().getName().equals(cubeql.getCube().getName())) 
{
               if (cubeql.getQueriedExprsWithMeasures().contains(expr)) {
-                for (Iterator<Candidate> sItr = 
cubeql.getCandidates().iterator(); sItr.hasNext(); ) {
+                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()));
                   }
                 }
               } else {
@@ -672,11 +673,11 @@ class ExpressionResolver implements ContextRewriter {
                         
CandidateTablePruneCause.expressionNotEvaluable(ec.exprCol.getName()));
                   }
                 }
+              }
             }
           }
         }
       }
-    }
       // prune candidate dims without any valid expressions
       if (cubeql.getDimensions() != null && !cubeql.getDimensions().isEmpty()) 
{
         for (Dimension dim : cubeql.getDimensions()) {

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/GroupbyResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/GroupbyResolver.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/GroupbyResolver.java
index 6ccf3d8..c9dc7b2 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/GroupbyResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/GroupbyResolver.java
@@ -18,13 +18,11 @@
  */
 package org.apache.lens.cube.parse;
 
-import static org.apache.hadoop.hive.ql.parse.HiveParser.*;
 import static 
org.apache.lens.cube.parse.ColumnResolver.addColumnsForSelectExpr;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import static org.apache.hadoop.hive.ql.parse.HiveParser.*;
+
+import java.util.*;
 
 import org.apache.lens.cube.metadata.AbstractBaseTable;
 import org.apache.lens.server.api.error.LensException;

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinCandidate.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinCandidate.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinCandidate.java
index d89e7b4..fa3ba8f 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinCandidate.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinCandidate.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.lens.cube.parse;
 
 import java.util.*;
@@ -55,16 +73,17 @@ public class JoinCandidate implements Candidate {
   public boolean contains(Candidate candidate) {
     if (this.equals(candidate)) {
       return true;
-    } else
+    } else {
       return childCandidate1.contains(candidate) || 
childCandidate2.contains(candidate);
+    }
   }
 
   @Override
   public Collection<Candidate> getChildren() {
-    return new ArrayList() {{
-      add(childCandidate1);
-      add(childCandidate2);
-    }};
+    ArrayList<Candidate> joinCandidates = new ArrayList<>();
+    joinCandidates.add(childCandidate1);
+    joinCandidates.add(childCandidate2);
+    return joinCandidates;
   }
 
   /**
@@ -73,7 +92,7 @@ public class JoinCandidate implements Candidate {
    */
   @Override
   public boolean evaluateCompleteness(TimeRange timeRange, TimeRange 
parentTimeRange, boolean failOnPartialData)
-      throws LensException {
+    throws LensException {
     return this.childCandidate1.evaluateCompleteness(timeRange, 
parentTimeRange, failOnPartialData)
         && this.childCandidate2.evaluateCompleteness(timeRange, 
parentTimeRange, failOnPartialData);
   }
@@ -114,4 +133,4 @@ public class JoinCandidate implements Candidate {
   private String getToString() {
     return this.toStr = "JOIN[" + childCandidate1.toString() + ", " + 
childCandidate2.toString() + "]";
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/LeastPartitionResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/LeastPartitionResolver.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/LeastPartitionResolver.java
index cb1cd65..153df24 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/LeastPartitionResolver.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/LeastPartitionResolver.java
@@ -52,7 +52,7 @@ class LeastPartitionResolver implements ContextRewriter {
 
       double minPartitions = Collections.min(factPartCount.values());
 
-      for (Iterator<Candidate> i = cubeql.getCandidates().iterator(); 
i.hasNext(); ) {
+      for (Iterator<Candidate> i = cubeql.getCandidates().iterator(); 
i.hasNext();) {
         Candidate candidate = i.next();
         if (factPartCount.get(candidate) > minPartitions) {
           log.info("Not considering Candidate:{} as it requires more 
partitions to be" + " queried:{} minimum:{}",

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/MaxCoveringFactResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/MaxCoveringFactResolver.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/MaxCoveringFactResolver.java
index 2522d92..4664cde 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/MaxCoveringFactResolver.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/MaxCoveringFactResolver.java
@@ -95,8 +95,7 @@ class MaxCoveringFactResolver implements ContextRewriter {
         }
       }
     }
-    //  
cubeql.pruneCandidateFactWithCandidateSet(CandidateTablePruneCause.lessData(null));
-
+    
//cubeql.pruneCandidateFactWithCandidateSet(CandidateTablePruneCause.lessData(null));
   }
 
   private void resolveByDataCompleteness(CubeQueryContext cubeql) {

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/PruneCauses.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/PruneCauses.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/PruneCauses.java
index c17e5bf..0c6465a 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/PruneCauses.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/PruneCauses.java
@@ -23,7 +23,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.lens.cube.metadata.AbstractCubeTable;
 import 
org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode;
 
 import org.apache.commons.lang.StringUtils;
@@ -101,9 +100,9 @@ public class PruneCauses<T> extends HashMap<T, 
List<CandidateTablePruneCause>> {
       }
     }
     Map<CandidateTablePruneCause, String> maxCauseMap = Maps.newHashMap();
-    for (Map.Entry<CandidateTablePruneCause, List<T>> entry: 
getReversed().entrySet()) {
+    for (Map.Entry<CandidateTablePruneCause, List<T>> entry : 
getReversed().entrySet()) {
       if (entry.getKey().getCause().equals(maxCause)) {
-          maxCauseMap.put(entry.getKey(), StringUtils.join(entry.getValue(), 
","));
+        maxCauseMap.put(entry.getKey(), StringUtils.join(entry.getValue(), 
","));
       }
     }
     return maxCause.getBriefError(maxCauseMap.keySet());

http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/main/java/org/apache/lens/cube/parse/QueriedPhraseContext.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/QueriedPhraseContext.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/QueriedPhraseContext.java
index b011e47..832b7a4 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/QueriedPhraseContext.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/QueriedPhraseContext.java
@@ -101,7 +101,6 @@ class QueriedPhraseContext extends TracksQueriedColumns 
implements TrackQueriedC
   }
 
   /**
-   * TODO union: change CandidateFact to StorageCandidate. Let the callers 
typecast and send for now.
    * @param cubeQl
    * @param sc
    * @return
@@ -139,7 +138,7 @@ class QueriedPhraseContext extends TracksQueriedColumns 
implements TrackQueriedC
 
   private static boolean isColumnAvailableInRange(final TimeRange range, Date 
startTime, Date endTime) {
     return (isColumnAvailableFrom(range.getFromDate(), startTime)
-      && isColumnAvailableTill(range.getToDate(), endTime));
+        && isColumnAvailableTill(range.getToDate(), endTime));
   }
 
   private static boolean isColumnAvailableFrom(@NonNull final Date date, Date 
startTime) {
@@ -151,7 +150,7 @@ class QueriedPhraseContext extends TracksQueriedColumns 
implements TrackQueriedC
   }
 
   public static boolean isFactColumnValidForRange(CubeQueryContext cubeql, 
StorageCandidate sc, String col) {
-    for(TimeRange range : cubeql.getTimeRanges()) {
+    for (TimeRange range : cubeql.getTimeRanges()) {
       if (!isColumnAvailableInRange(range, getFactColumnStartTime(sc, col), 
getFactColumnEndTime(sc, col))) {
         return false;
       }
@@ -161,32 +160,32 @@ class QueriedPhraseContext extends TracksQueriedColumns 
implements TrackQueriedC
 
   public static Date getFactColumnStartTime(StorageCandidate sc, String 
factCol) {
     Date startTime = null;
-      for (String key : sc.getTable().getProperties().keySet()) {
-        if (key.contains(MetastoreConstants.FACT_COL_START_TIME_PFX)) {
-          String propCol = StringUtils.substringAfter(key, 
MetastoreConstants.FACT_COL_START_TIME_PFX);
-          if (factCol.equals(propCol)) {
-            startTime = sc.getTable().getDateFromProperty(key, false, true);
-          }
+    for (String key : sc.getTable().getProperties().keySet()) {
+      if (key.contains(MetastoreConstants.FACT_COL_START_TIME_PFX)) {
+        String propCol = StringUtils.substringAfter(key, 
MetastoreConstants.FACT_COL_START_TIME_PFX);
+        if (factCol.equals(propCol)) {
+          startTime = sc.getTable().getDateFromProperty(key, false, true);
         }
       }
+    }
     return startTime;
   }
 
   public static Date getFactColumnEndTime(StorageCandidate sc, String factCol) 
{
     Date endTime = null;
-      for (String key : sc.getTable().getProperties().keySet()) {
-        if (key.contains(MetastoreConstants.FACT_COL_END_TIME_PFX)) {
-          String propCol = StringUtils.substringAfter(key, 
MetastoreConstants.FACT_COL_END_TIME_PFX);
-          if (factCol.equals(propCol)) {
-            endTime = sc.getTable().getDateFromProperty(key, false, true);
-          }
+    for (String key : sc.getTable().getProperties().keySet()) {
+      if (key.contains(MetastoreConstants.FACT_COL_END_TIME_PFX)) {
+        String propCol = StringUtils.substringAfter(key, 
MetastoreConstants.FACT_COL_END_TIME_PFX);
+        if (factCol.equals(propCol)) {
+          endTime = sc.getTable().getDateFromProperty(key, false, true);
         }
       }
-  return endTime;
+    }
+    return endTime;
   }
 
   static boolean checkForColumnExistsAndValidForRange(StorageCandidate sc, 
String column, CubeQueryContext cubeql) {
-    return (sc.getColumns().contains(column) &&  
isFactColumnValidForRange(cubeql, sc, column));
+    return (sc.getColumns().contains(column) && 
isFactColumnValidForRange(cubeql, sc, column));
   }
 
 }

Reply via email to