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/04/22 18:03:06 UTC

incubator-lens git commit: LENS-503: Add MaxCoveringFactResolver after fact partitions are resolved

Repository: incubator-lens
Updated Branches:
  refs/heads/master e39a466ca -> 6008ffb1c


LENS-503: Add MaxCoveringFactResolver after fact partitions are resolved


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

Branch: refs/heads/master
Commit: 6008ffb1c33bd31e5c29695d39935b1e9184ee85
Parents: e39a466
Author: Rajat Khandelwal <ra...@gmail.com>
Authored: Wed Apr 22 21:32:57 2015 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Wed Apr 22 21:32:57 2015 +0530

----------------------------------------------------------------------
 .../lens/cube/metadata/FactPartition.java       |   7 +-
 .../timeline/EndsAndHolesPartitionTimeline.java |   2 +
 .../timeline/RangesPartitionTimeline.java       |  11 ++
 .../timeline/StoreAllPartitionTimeline.java     |   2 +
 .../cube/parse/CandidateTablePruneCause.java    |  12 ++
 .../lens/cube/parse/CubeQueryContext.java       |   7 +-
 .../lens/cube/parse/CubeQueryRewriter.java      |  12 ++
 .../org/apache/lens/cube/parse/DateUtil.java    |   6 +-
 .../cube/parse/MaxCoveringFactResolver.java     | 139 ++++++++++++++
 .../lens/cube/parse/StorageTableResolver.java   |   5 +-
 .../apache/lens/cube/parse/CubeTestSetup.java   |  15 +-
 .../lens/cube/parse/TestAggregateResolver.java  |  17 +-
 .../lens/cube/parse/TestCubeRewriter.java       | 188 ++++++++++++-------
 .../apache/lens/cube/parse/TestDateUtil.java    | 149 +++++++++------
 .../lens/cube/parse/TestQueryMetrics.java       |  41 ++--
 .../lens/cube/parse/TestRewriterPlan.java       |  33 ++--
 16 files changed, 472 insertions(+), 174 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/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 44c6915..8a6dcba 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
@@ -42,6 +42,9 @@ public class FactPartition implements Comparable<FactPartition> {
   @Setter
   private FactPartition containingPart;
   private final DateFormat partFormat;
+  @Getter
+  @Setter
+  private boolean found = false;
 
   public FactPartition(String partCol, Date partSpec, UpdatePeriod period,
     FactPartition containingPart, DateFormat partFormat) {
@@ -62,10 +65,6 @@ public class FactPartition implements Comparable<FactPartition> {
     return containingPart != null;
   }
 
-  public boolean found() {
-    return !getStorageTables().isEmpty();
-  }
-
   public String getFormattedPartSpec() {
     if (partFormat == null) {
       return getPartString();

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/EndsAndHolesPartitionTimeline.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/EndsAndHolesPartitionTimeline.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/EndsAndHolesPartitionTimeline.java
index 10b18e2..e52ed58 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/EndsAndHolesPartitionTimeline.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/EndsAndHolesPartitionTimeline.java
@@ -31,6 +31,7 @@ import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NonNull;
 import lombok.ToString;
 
@@ -40,6 +41,7 @@ import lombok.ToString;
  * which Timeline Class to use in it's params.
  */
 @Data
+@EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class EndsAndHolesPartitionTimeline extends PartitionTimeline {
   private TimePartition first;

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/RangesPartitionTimeline.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/RangesPartitionTimeline.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/RangesPartitionTimeline.java
index 8d80f0b..24f7f1a 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/RangesPartitionTimeline.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/RangesPartitionTimeline.java
@@ -34,6 +34,7 @@ import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
 /**
@@ -42,6 +43,7 @@ import lombok.ToString;
  * the second element of the tuple
  */
 @Data
+@EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class RangesPartitionTimeline extends PartitionTimeline {
   private List<TimePartitionRange> ranges = Lists.newArrayList();
@@ -231,4 +233,13 @@ public class RangesPartitionTimeline extends PartitionTimeline {
       }
     };
   }
+
+
+  public long getTimeCovered() {
+    long t = 0;
+    for (TimePartitionRange range : ranges) {
+      t += (range.getEnd().getDate().getTime() - range.getBegin().getDate().getTime());
+    }
+    return t;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/StoreAllPartitionTimeline.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/StoreAllPartitionTimeline.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/StoreAllPartitionTimeline.java
index 2364400..91e172f 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/StoreAllPartitionTimeline.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/StoreAllPartitionTimeline.java
@@ -30,6 +30,7 @@ import org.apache.commons.lang.StringUtils;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NonNull;
 import lombok.ToString;
 
@@ -38,6 +39,7 @@ import lombok.ToString;
  * Helps in test cases. In real life scenarios, this would be almost always end up causing out of memory error.
  */
 @Data
+@EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class StoreAllPartitionTimeline extends PartitionTimeline {
   TreeSet<TimePartition> allPartitions;

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/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 2c191fc..165525d 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
@@ -35,8 +35,11 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 
 public class CandidateTablePruneCause {
+
   public enum CandidateTablePruneCode {
     MORE_WEIGHT("Picked table had more weight than minimum."),
+    // partial data is enabled, another fact has more data.
+    LESS_DATA("Picked table has less data than the maximum"),
     // cube table has more partitions
     MORE_PARTITIONS("Picked table has more partitions than minimum"),
     // invalid cube table
@@ -194,6 +197,9 @@ public class CandidateTablePruneCause {
   // the columns that are missing default aggregate. only set in case of MISSING_DEFAULT_AGGREGATE
   private List<String> columnsMissingDefaultAggregate;
 
+  // time covered
+  private MaxCoveringFactResolver.TimeCovered maxTimeCovered;
+
   public CandidateTablePruneCause(CandidateTablePruneCode cause) {
     this.cause = cause;
   }
@@ -223,6 +229,12 @@ public class CandidateTablePruneCause {
     return cause;
   }
 
+  public static CandidateTablePruneCause lessData(MaxCoveringFactResolver.TimeCovered timeCovered) {
+    CandidateTablePruneCause cause = new CandidateTablePruneCause(CandidateTablePruneCode.LESS_DATA);
+    cause.setMaxTimeCovered(timeCovered);
+    return cause;
+  }
+
   public static CandidateTablePruneCause noColumnPartOfAJoinPath(final Collection<String> colSet) {
     CandidateTablePruneCause cause =
       new CandidateTablePruneCause(CandidateTablePruneCode.NO_COLUMN_PART_OF_A_JOIN_PATH);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/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 0df4b2e..b7c3ee9 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
@@ -1043,6 +1043,11 @@ public class CubeQueryContext {
    */
   public void pruneCandidateFactWithCandidateSet(CandidateTablePruneCode pruneCause) {
     // remove candidate facts that are not part of any covering set
+    pruneCandidateFactWithCandidateSet(new CandidateTablePruneCause(pruneCause));
+  }
+
+  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);
@@ -1051,7 +1056,7 @@ public class CubeQueryContext {
       CandidateFact cfact = i.next();
       if (!allCoveringFacts.contains(cfact)) {
         LOG.info("Not considering fact table:" + cfact + " as " + pruneCause);
-        addFactPruningMsgs(cfact.fact, new CandidateTablePruneCause(pruneCause));
+        addFactPruningMsgs(cfact.fact, pruneCause);
         i.remove();
       }
     }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/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 24c6ab1..e40df44 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
@@ -109,6 +109,17 @@ public class CubeQueryRewriter {
    * If LightestFact first flag is enabled, LightestFactResolver is applied
    * before StorageTableResolver.
    *
+   * MaxCoveringFactResolver runs just after all candidate facts' partitions
+   * are resolved. It then sees how much time range each fact set is able to cover
+   * and finds the maximum coverable range. It then prunes all fact sets that
+   * are covering less than that range. If fail on partial is true, then by the
+   * time this resolver runs, all the candidate fact sets cover full range.
+   * So there this resolver is a no-op. Same thing when fail on partial is false
+   * and no fact set has any data. This is most useful when facts actually have
+   * partial data. There it'll ensure the facts that are covering the maximum
+   * time range will be picked.
+   *
+   *
    * Once all rewriters are done, finally picks up one of the available
    * candidate sets to answer the query, after all the resolvers are done. Once
    * the final candidate fact set is picked, if number of elements in the fact
@@ -152,6 +163,7 @@ public class CubeQueryRewriter {
     }
     // Phase 2: resolve fact table partitions.
     rewriters.add(storageTableResolver);
+    rewriters.add(new MaxCoveringFactResolver(conf));
     if (!lightFactFirst) {
       rewriters.add(new LightestFactResolver(conf));
     }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/main/java/org/apache/lens/cube/parse/DateUtil.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/DateUtil.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/DateUtil.java
index a4988d4..82c43a7 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/DateUtil.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/DateUtil.java
@@ -214,7 +214,7 @@ public final class DateUtil {
     boolean hasFraction = false;
     switch (interval) {
     case YEARLY:
-      if (cal.get(Calendar.MONTH) != 1) {
+      if (cal.get(Calendar.MONTH) != 0) {
         hasFraction = true;
         break;
       }
@@ -263,7 +263,7 @@ public final class DateUtil {
     cal.setTime(toDate);
     switch (interval) {
     case YEARLY:
-      cal.set(Calendar.MONTH, 1);
+      cal.set(Calendar.MONTH, 0);
     case MONTHLY:
       cal.set(Calendar.DAY_OF_MONTH, 1);
     case DAILY:
@@ -273,12 +273,14 @@ public final class DateUtil {
     case MINUTELY:
       cal.set(Calendar.SECOND, 0);
     case SECONDLY:
+      cal.set(Calendar.MILLISECOND, 0);
       break;
     case WEEKLY:
       cal.set(Calendar.DAY_OF_WEEK, 1);
       cal.set(Calendar.HOUR_OF_DAY, 0);
       cal.set(Calendar.MINUTE, 0);
       cal.set(Calendar.SECOND, 0);
+      cal.set(Calendar.MILLISECOND, 0);
       break;
     }
     return cal.getTime();

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/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
new file mode 100644
index 0000000..e3a90d5
--- /dev/null
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/MaxCoveringFactResolver.java
@@ -0,0 +1,139 @@
+/**
+ * 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.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.lens.api.LensException;
+import org.apache.lens.cube.metadata.FactPartition;
+import org.apache.lens.cube.metadata.TimePartition;
+import org.apache.lens.cube.metadata.TimePartitionRange;
+import org.apache.lens.cube.metadata.UpdatePeriod;
+import org.apache.lens.cube.metadata.timeline.RangesPartitionTimeline;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+import com.google.common.collect.Maps;
+
+/**
+ * Prune candidate fact sets so that the facts except the ones that are covering maximum of range are pruned
+ */
+class MaxCoveringFactResolver implements ContextRewriter {
+  public static final Log LOG = LogFactory.getLog(MaxCoveringFactResolver.class.getName());
+  private final boolean failOnPartialData;
+
+  public MaxCoveringFactResolver(Configuration conf) {
+    this.failOnPartialData = conf.getBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, false);
+  }
+
+  @Override
+  public void rewriteContext(CubeQueryContext cubeql) throws SemanticException {
+    if (failOnPartialData) {
+      // if fail on partial data is true, by the time this resolver starts,
+      // all candidate fact sets are covering full time range. We can avoid
+      // redundant computation.
+      return;
+    }
+    if (cubeql.getCube() != null && !cubeql.getCandidateFactSets().isEmpty()) {
+      Map<Set<CandidateFact>, Long> factPartCount = Maps.newHashMap();
+      for (Set<CandidateFact> facts : cubeql.getCandidateFactSets()) {
+        factPartCount.put(facts, getTimeCovered(facts));
+      }
+      long maxTimeCovered = Collections.max(factPartCount.values());
+      TimeCovered timeCovered = new TimeCovered(maxTimeCovered);
+      for (Iterator<Set<CandidateFact>> i = cubeql.getCandidateFactSets().iterator(); i.hasNext();) {
+        Set<CandidateFact> facts = i.next();
+        if (factPartCount.get(facts) < maxTimeCovered) {
+          LOG.info("Not considering facts:" + facts + " from candidate fact tables as it covers less time than the max."
+            + "which is: " + timeCovered);
+          i.remove();
+        }
+      }
+      cubeql.pruneCandidateFactWithCandidateSet(CandidateTablePruneCause.lessData(timeCovered));
+    }
+  }
+
+  private long getTimeCovered(Set<CandidateFact> facts) {
+    UpdatePeriod smallest = UpdatePeriod.values()[UpdatePeriod.values().length - 1];
+    for (CandidateFact fact : facts) {
+      for (FactPartition part : fact.getPartsQueried()) {
+        if (part.getPeriod().compareTo(smallest) < 0) {
+          smallest = part.getPeriod();
+        }
+      }
+    }
+    RangesPartitionTimeline range = new RangesPartitionTimeline(null, smallest, null);
+    for (CandidateFact fact : facts) {
+      for (FactPartition part : fact.getPartsQueried()) {
+        if (part.isFound()) {
+          try {
+            TimePartitionRange subrange =
+              TimePartition.of(part.getPeriod(), part.getPartSpec()).singletonRange();
+            for (TimePartition partition : TimePartition.of(smallest, subrange.getBegin().getDate()).rangeUpto(
+              TimePartition.of(smallest, subrange.getEnd().getDate()))) {
+              range.add(partition);
+            }
+          } catch (LensException e) {
+            LOG.error("invalid partition: " + e);
+          }
+        }
+      }
+    }
+    return range.getTimeCovered();
+  }
+
+  public static class TimeCovered {
+    private final long days;
+    private final long hours;
+    private final long minutes;
+    private final long seconds;
+    private final long milliseconds;
+
+    public TimeCovered(long ms) {
+      milliseconds = ms % (24 * 60 * 60 * 1000);
+      long seconds = ms / (24 * 60 * 60 * 1000);
+      this.seconds = seconds % (24 * 60 * 60);
+      long minutes = seconds / (24 * 60 * 60);
+      this.minutes = minutes % (24 * 60);
+      long hours = minutes / (24 * 60);
+      this.hours = hours % 24;
+      this.days = hours / 24;
+    }
+
+    public String toString() {
+      return new StringBuilder()
+        .append(days)
+        .append(" days, ")
+        .append(hours)
+        .append(" hours, ")
+        .append(minutes)
+        .append(" minutes, ")
+        .append(seconds)
+        .append(" seconds, ")
+        .append(milliseconds)
+        .append(" milliseconds.").toString();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java
index ab2c3f9..70296aa 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java
@@ -462,7 +462,7 @@ class StorageTableResolver implements ContextRewriter {
       LOG.info("candidate storage tables for searching partitions: " + storageTbls);
       updateFactPartitionStorageTablesFrom(fact, part, storageTbls);
       LOG.info("Storage tables containing Partition " + part + " are: " + part.getStorageTables());
-      if (part.found()) {
+      if (part.isFound()) {
         LOG.info("Adding existing partition" + part);
         partitions.add(part);
         LOG.info("Looking for look ahead process time partitions for " + part);
@@ -490,7 +490,7 @@ class StorageTableResolver implements ContextRewriter {
               partWhereClauseFormat);
             updateFactPartitionStorageTablesFrom(fact, processTimePartition,
               part.getStorageTables());
-            if (processTimePartition.found()) {
+            if (processTimePartition.isFound()) {
               LOG.info("Finer parts not required for look-ahead partition :" + part);
             } else {
               LOG.info("Looked ahead process time partition " + processTimePartition + " is not found");
@@ -562,6 +562,7 @@ class StorageTableResolver implements ContextRewriter {
     for (String storageTableName : storageTableNames) {
       if (client.factPartitionExists(fact, part, storageTableName)) {
         part.getStorageTables().add(storageTableName);
+        part.setFound(true);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/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 3807068..5d9e97e 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
@@ -30,6 +30,7 @@ import org.apache.lens.cube.metadata.timeline.StoreAllPartitionTimeline;
 import org.apache.lens.server.api.LensConfConstants;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
@@ -101,10 +102,13 @@ public class CubeTestSetup {
   public static final Date TWO_MONTHS_BACK;
   public static final Date BEFORE_4_DAYS_START;
   public static final Date BEFORE_4_DAYS_END;
+  public static final Date THIS_YEAR_START;
+  public static final Date THIS_YEAR_END;
 
   // Time Ranges
   public static final String LAST_HOUR_TIME_RANGE;
   public static final String TWO_DAYS_RANGE;
+  public static final String THIS_YEAR_RANGE;
   public static final String TWO_MONTHS_RANGE_UPTO_MONTH;
   public static final String TWO_MONTHS_RANGE_UPTO_HOURS;
   public static final String TWO_DAYS_RANGE_BEFORE_4_DAYS;
@@ -148,11 +152,18 @@ public class CubeTestSetup {
     BEFORE_4_DAYS_END = cal.getTime();
     cal.add(Calendar.DAY_OF_MONTH, -2);
     BEFORE_4_DAYS_START = cal.getTime();
+
+
+    THIS_YEAR_START = DateUtils.truncate(NOW, UpdatePeriod.YEARLY.calendarField());
+    THIS_YEAR_END = DateUtils.addYears(THIS_YEAR_START, 1);
     TWO_DAYS_RANGE_BEFORE_4_DAYS =
       "time_range_in(dt, '" + CubeTestSetup.getDateUptoHours(BEFORE_4_DAYS_START) + "','"
         + CubeTestSetup.getDateUptoHours(BEFORE_4_DAYS_END) + "')";
 
+
     TWO_DAYS_RANGE = "time_range_in(dt, '" + getDateUptoHours(TWODAYS_BACK) + "','" + getDateUptoHours(NOW) + "')";
+    THIS_YEAR_RANGE =
+      "time_range_in(dt, '" + getDateUptoHours(THIS_YEAR_START) + "','" + getDateUptoHours(THIS_YEAR_END) + "')";
     TWO_MONTHS_RANGE_UPTO_MONTH =
       "time_range_in(dt, '" + getDateUptoMonth(TWO_MONTHS_BACK) + "','" + getDateUptoMonth(NOW) + "')";
     TWO_MONTHS_RANGE_UPTO_HOURS =
@@ -1226,9 +1237,11 @@ public class CubeTestSetup {
     s1.setPartCols(partCols);
     s1.setTimePartCols(timePartCols);
     storageAggregatePeriods.put(c1, updates);
+    storageAggregatePeriods.put(c3, updates);
 
     Map<String, StorageTableDesc> storageTables = new HashMap<String, StorageTableDesc>();
     storageTables.put(c1, s1);
+    storageTables.put(c3, s1);
 
     // create cube fact
     Map<String, String> properties = new HashMap<String, String>();
@@ -1247,7 +1260,7 @@ public class CubeTestSetup {
       Map<String, Date> timeParts = new HashMap<String, Date>();
       timeParts.put(TestCubeMetastoreClient.getDatePartitionKey(), temp);
       StoragePartitionDesc sPartSpec = new StoragePartitionDesc(fact2.getName(), timeParts, null, UpdatePeriod.HOURLY);
-      client.addPartition(sPartSpec, c1);
+      client.addPartition(sPartSpec, c3);
       cal.add(Calendar.HOUR_OF_DAY, 1);
       temp = cal.getTime();
     }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
index 71f328f..965ec94 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
@@ -38,11 +38,19 @@ public class TestAggregateResolver extends TestQueryRewrite {
   @BeforeTest
   public void setupDriver() throws Exception {
     conf = new Configuration();
-    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1,C2");
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, true);
     conf.setBoolean(CubeQueryConfUtil.ENABLE_SELECT_TO_GROUPBY, true);
     conf.setBoolean(CubeQueryConfUtil.ENABLE_GROUP_BY_TO_SELECT, true);
   }
+  private Configuration getConf() {
+    return new Configuration(conf);
+  }
+  private Configuration getConf(String storages) {
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, storages);
+    return conf;
+  }
 
   private CubeQueryContext rewrittenQuery;
 
@@ -138,7 +146,7 @@ public class TestAggregateResolver extends TestQueryRewrite {
       compareQueries(expected[i], hql);
     }
     aggregateFactSelectionTests(conf);
-    rawFactSelectionTests(conf);
+    rawFactSelectionTests(getConf("C1,C2"));
   }
 
   @Test
@@ -192,7 +200,7 @@ public class TestAggregateResolver extends TestQueryRewrite {
 
   @Test
   public void testAggregateResolverOff() throws SemanticException, ParseException {
-    Configuration conf2 = new Configuration(this.conf);
+    Configuration conf2 = getConf("C1,C2");
     conf2.setBoolean(CubeQueryConfUtil.DISABLE_AGGREGATE_RESOLVER, true);
 
     // Test if raw fact is selected for query with no aggregate function on a
@@ -207,8 +215,9 @@ public class TestAggregateResolver extends TestQueryRewrite {
       getExpectedQuery(cubeName, "SELECT testcube.cityid," + " testCube.msr2 from ", null, null,
         getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(expectedQL, hQL);
-
+    conf2.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     aggregateFactSelectionTests(conf2);
+    conf2.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1,C2");
     rawFactSelectionTests(conf2);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
index b85f60e..097f228 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
@@ -54,6 +54,21 @@ public class TestCubeRewriter extends TestQueryRewrite {
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AGGREGATE_RESOLVER, false);
     return conf;
   }
+  public Configuration getC1Conf() {
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
+    return conf;
+  }
+  public Configuration getC2Conf() {
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
+    return conf;
+  }
+  public Configuration getC3Conf() {
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C3");
+    return conf;
+  }
 
   @Test
   public void testQueryWithNow() throws Exception {
@@ -77,7 +92,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
   @Test
   public void testCubeQuery() throws Exception {
     CubeQueryContext rewrittenQuery =
-      rewriteCtx("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConf());
+      rewriteCtx("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getC2Conf());
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -87,20 +102,40 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     // Query with column life not in the range
     SemanticException th = getSemanticExceptionInRewrite(
-      "cube select SUM(newmeasure) from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+      "cube select SUM(newmeasure) from testCube" + " where " + TWO_DAYS_RANGE, getC2Conf());
     Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NOT_AVAILABLE_IN_RANGE.getErrorCode());
   }
 
   @Test
+  public void testMaxCoveringFact() throws Exception {
+    Configuration conf = getConf();
+    conf.setClass(CubeQueryConfUtil.TIME_RANGE_WRITER_CLASS, AbridgedTimeRangeWriter.class, TimeRangeWriter.class);
+    conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, false);
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1,C2,C4");
+    CubeQueryContext cubeQueryContext =
+      rewriteCtx("cube select" + " SUM(msr2) from testCube where " + THIS_YEAR_RANGE, conf);
+    PruneCauses<CubeFactTable> pruneCause = cubeQueryContext.getFactPruningMsgs();
+    int lessDataCauses = 0;
+    for (Map.Entry<CubeFactTable, List<CandidateTablePruneCause>> entry : pruneCause.entrySet()) {
+      for (CandidateTablePruneCause cause : entry.getValue()) {
+        if (cause.getCause().equals(CandidateTablePruneCode.LESS_DATA)) {
+          lessDataCauses++;
+        }
+      }
+    }
+    Assert.assertTrue(lessDataCauses > 0);
+  }
+
+  @Test
   public void testLightestFactFirst() throws Exception {
     // testFact is lighter than testFact2.
-    String hqlQuery = rewrite("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConf());
+    String hqlQuery = rewrite("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getC2Conf());
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    Configuration conf = getConf();
+    Configuration conf = getC1Conf();
     conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, true);
     hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
@@ -127,7 +162,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
   @Test
   public void testDerivedCube() throws SemanticException, ParseException {
     CubeQueryContext rewrittenQuery =
-      rewriteCtx("cube select" + " SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, getConf());
+      rewriteCtx("cube select" + " SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, getC2Conf());
     String expected =
       getExpectedQuery(CubeTestSetup.DERIVED_CUBE_NAME, "select sum(derivedCube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(CubeTestSetup.DERIVED_CUBE_NAME, "C2_testfact"));
@@ -169,41 +204,43 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
   @Test
   public void testCubeInsert() throws Exception {
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     String hqlQuery = rewrite("insert overwrite directory" + " '/tmp/test' select SUM(msr2) from testCube where "
-      + TWO_DAYS_RANGE, getConf());
+      + TWO_DAYS_RANGE, conf);
     String expected = "insert overwrite directory '/tmp/test' "
       + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite directory" + " '/tmp/test' cube select SUM(msr2) from testCube where "
-      + TWO_DAYS_RANGE, getConf());
+      + TWO_DAYS_RANGE, conf);
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite local directory" + " '/tmp/test' select SUM(msr2) from testCube where "
-      + TWO_DAYS_RANGE, getConf());
+      + TWO_DAYS_RANGE, conf);
     expected = "insert overwrite local directory '/tmp/test' "
       + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite local directory" + " '/tmp/test' cube select SUM(msr2) from testCube where "
-      + TWO_DAYS_RANGE, getConf());
+      + TWO_DAYS_RANGE, conf);
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite table temp" + " select SUM(msr2) from testCube where " + TWO_DAYS_RANGE,
-      getConf());
+      conf);
     expected = "insert overwrite table temp "
       + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite table temp" + " cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE,
-      getConf());
+      conf);
     compareQueries(expected, hqlQuery);
   }
 
-  static void compareQueries(String expected, String actual) {
+  static void compareQueries(String actual, String expected) {
     if (expected == null && actual == null) {
       return;
     } else if (expected == null) {
@@ -254,7 +291,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
   @Test
   public void testCubeWhereQuery() throws Exception {
     String hqlQuery, expected;
-    hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getC2Conf());
     expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -326,7 +363,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1,C2");
     hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
-      getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, getWhereForHourly2days("c2_testfact"));
+      getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, getWhereForHourly2days("c1_testfact2"));
     compareQueries(expected, hqlQuery);
   }
 
@@ -335,6 +372,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     Configuration conf = getConf();
     conf.set(CubeQueryConfUtil.getValidStorageTablesKey("testfact"), "C1_testFact,C2_testFact");
     conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact", "C1"), "DAILY");
+    conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact2", "C1"), "YEARLY");
     conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact", "C2"), "HOURLY");
     String hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
 
@@ -373,6 +411,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
     conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "");
     conf.set(CubeQueryConfUtil.getValidStorageTablesKey("testfact"), "");
     conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact", "C1"), "HOURLY");
+    conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact2", "C1"), "YEARLY");
+    conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact2_raw", "C3"), "YEARLY");
     conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact", "C2"), "DAILY");
     conf.set(CubeQueryConfUtil.getValidUpdatePeriodsKey("testfact", "C3"), "MONTHLY");
 
@@ -387,7 +427,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
         getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
           getWhereForMonthlyDailyAndHourly2months("c1_testfact", "c2_testfact", "c3_testFact"));
     }
-    compareQueries(expected, hqlQuery);
+    compareQueries(hqlQuery, expected);
 
     // monthly - c1,c2; daily - c1, hourly -c2
     conf.set(CubeQueryConfUtil.getValidStorageTablesKey("testfact"), "C1_testFact,C2_testFact");
@@ -396,8 +436,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     try {
       hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_MONTHS_RANGE_UPTO_HOURS, conf);
       System.out.println("union query:" + hqlQuery);
-      // TODO: uncomment the following once union query
-      // rewriting has been done
+      // TODO: uncomment the following once union query rewriting has been done
       // expected = getExpectedQuery(cubeName,
       // "select sum(testcube.msr2) FROM ", null, null,
       // getWhereForMonthlyDailyAndHourly2months("C1_testfact"));
@@ -419,12 +458,10 @@ public class TestCubeRewriter extends TestQueryRewrite {
         + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select countrydim.name, sum(testcube.msr2)" + " FROM ", " JOIN " + getDbName()
-          + "c3_statetable_partitioned statedim ON" + " testCube.stateid = statedim.id and statedim.dt = 'latest' JOIN "
-          + getDbName()
-          + "c3_countrytable_partitioned countrydim on statedim.countryid=countrydim.id and countrydim.dt='latest'",
+          + "c3_countrytable_partitioned countrydim on testcube.countryid=countrydim.id and countrydim.dt='latest'",
         "countrydim.region='asia'",
         " group by countrydim.name ", null,
-        getWhereForDailyAndHourly2days(cubeName, "C3_testfact"));
+        getWhereForHourly2days(cubeName, "C3_testfact2_raw"));
     compareQueries(hql, expected);
     hql = rewrite(
       "select statedim.name, statedim.countryid, msr2 from" + " testCube" + " where statedim.countryid = 5 and "
@@ -435,32 +472,34 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + "c3_statetable_partitioned statedim ON" + " testCube.stateid = statedim.id and statedim.dt = 'latest'",
         "statedim.countryid=5",
         " group by statedim.name, statedim.countryid", null,
-        getWhereForDailyAndHourly2days(cubeName, "C3_testfact"));
+        getWhereForHourly2days(cubeName, "C3_testfact2_raw"));
     compareQueries(hql, expected);
   }
 
   @Test
   public void testCubeJoinQuery() throws Exception {
     // q1
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     String hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " join citydim on testCube.cityid = citydim.id" + " where "
-        + TWO_DAYS_RANGE, getConf());
+        + TWO_DAYS_RANGE, conf);
     List<String> joinWhereConds = new ArrayList<String>();
-    joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest()));
+//    joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest()));
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2)" + " FROM ", " INNER JOIN " + getDbName()
-          + "c1_citytable citydim ON" + " testCube.cityid = citydim.id", null, null, joinWhereConds,
+          + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, null, joinWhereConds,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " join citydim on cityid = citydim.id" + " where " + TWO_DAYS_RANGE,
-        getConf());
+        conf);
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " join citydim on cityid = id" + " where " + TWO_DAYS_RANGE,
-        getConf());
+        getC2Conf());
     compareQueries(expected, hqlQuery);
 
     // q2
@@ -477,7 +516,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + "c1_statetable statedim" + " ON statedim.id = citydim.stateid AND "
           + "(statedim.dt = 'latest') RIGHT OUTER JOIN " + getDbName() + "c1_ziptable"
           + " zipdim ON citydim.zipcode = zipdim.code", null, " group by" + " statedim.name ", joinWhereConds,
-        getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
+        getWhereForHourly2days(cubeName, "C1_testfact2"));
     compareQueries(expected, hqlQuery);
 
     // q3
@@ -493,7 +532,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + "c1_citytable ct ON" + " tc.cityid = ct.id LEFT OUTER JOIN " + getDbName() + "c1_statetable st"
           + " ON st.id = ct.stateid and (st.dt = 'latest') " + "RIGHT OUTER JOIN " + getDbName() + "c1_ziptable"
           + " zt ON ct.zipcode = zt.code", null, " group by" + " st.name ", joinWhereConds,
-        getWhereForDailyAndHourly2days("tc", "C2_testfact"));
+        getWhereForHourly2days("tc", "C1_testfact2"));
     compareQueries(expected, hqlQuery);
 
     // q4
@@ -506,7 +545,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + getDbName() + "c1_citytable citydim ON" + " testCube.cityid = citydim.id and (citydim.dt = 'latest') "
           + " LEFT OUTER JOIN " + getDbName() + "c1_ziptable" + " zipdim ON citydim.zipcode = zipdim.code AND "
           + "(zipdim.dt = 'latest')", null, " group by" + " citydim.name ", null,
-        getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
+        getWhereForHourly2days(cubeName, "C1_testfact2"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
@@ -527,8 +566,10 @@ public class TestCubeRewriter extends TestQueryRewrite {
   @Test
   public void testCubeGroupbyWithConstantProjected() throws Exception {
     // check constants
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     String hqlQuery1 = rewrite("select cityid, 99, \"placeHolder\", -1001, SUM(msr2) from testCube" + " where "
-      + TWO_DAYS_RANGE, getConf());
+      + TWO_DAYS_RANGE, conf);
     String expected1 = getExpectedQuery(cubeName, "select testcube.cityid, 99, \"placeHolder\", -1001,"
         + " sum(testcube.msr2) FROM ", null, " group by testcube.cityid ",
       getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -537,7 +578,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     // check constants with expression
     String hqlQuery2 = rewrite(
       "select cityid, case when stateid = 'za' then \"Not Available\" end, 99, \"placeHolder\", -1001, "
-        + "SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+        + "SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
     String expected2 = getExpectedQuery(cubeName,
       "select testcube.cityid, case when testcube.stateid = 'za' then \"Not Available\" end, 99, \"placeHolder\","
         + " -1001, sum(testcube.msr2) FROM ", null,
@@ -549,7 +590,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String hqlQuery3 = rewrite(
       "select cityid,stateid + 99, 44 + stateid, stateid - 33, 999 - stateid, TRUE, FALSE, round(123.4567,2), "
         + "case when stateid='za' then 99 else -1001 end,  "
-        + "SUM(msr2), SUM(msr2 + 39), SUM(msr2) + 567 from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+        + "SUM(msr2), SUM(msr2 + 39), SUM(msr2) + 567 from testCube" + " where " + TWO_DAYS_RANGE, conf);
     String expected3 = getExpectedQuery(
       cubeName,
       "select testcube.cityid, testcube.stateid + 99, 44 + testcube.stateid, testcube.stateid - 33,"
@@ -566,36 +607,38 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
   @Test
   public void testCubeGroupbyQuery() throws Exception {
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     String hqlQuery =
       rewrite("select name, SUM(msr2) from" + " testCube join citydim on testCube.cityid = citydim.id where "
-        + TWO_DAYS_RANGE, getConf());
+        + TWO_DAYS_RANGE, conf);
     List<String> joinWhereConds = new ArrayList<String>();
-    joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest()));
+//    joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest()));
     String expected =
       getExpectedQuery(cubeName, "select citydim.name," + " sum(testcube.msr2) FROM ", "INNER JOIN " + getDbName()
-          + "c1_citytable citydim ON" + " testCube.cityid = citydim.id", null, " group by citydim.name ",
+          + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, " group by citydim.name ",
         joinWhereConds, getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " join citydim on testCube.cityid = citydim.id" + " where "
-        + TWO_DAYS_RANGE + " group by name", getConf());
+        + TWO_DAYS_RANGE + " group by name", conf);
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select cityid, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select cityid, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select testcube.cityid," + " sum(testcube.msr2) FROM ", null,
         " group by testcube.cityid ", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select round(cityid), SUM(msr2) from" + " testCube where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select round(cityid), SUM(msr2) from" + " testCube where " + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select round(testcube.cityid)," + " sum(testcube.msr2) FROM ", null,
         " group by round(testcube.cityid) ", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
-      rewrite("select SUM(msr2) from testCube" + "  where " + TWO_DAYS_RANGE + "group by round(zipcode)", getConf());
+      rewrite("select SUM(msr2) from testCube" + "  where " + TWO_DAYS_RANGE + "group by round(zipcode)", conf);
     expected =
       getExpectedQuery(cubeName, "select round(testcube.zipcode)," + " sum(testcube.msr2) FROM ", null,
         " group by round(testcube.zipcode) ", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -603,13 +646,13 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     hqlQuery =
       rewrite("select round(cityid), SUM(msr2) from" + " testCube where " + TWO_DAYS_RANGE + " group by zipcode",
-        getConf());
+        conf);
     expected =
       getExpectedQuery(cubeName, "select " + " round(testcube.cityid), sum(testcube.msr2) FROM ", null,
         " group by testcube.zipcode", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select round(cityid), SUM(msr2) from" + " testCube where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select round(cityid), SUM(msr2) from" + " testCube where " + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select " + " round(testcube.cityid), sum(testcube.msr2) FROM ", null,
         " group by round(testcube.cityid)", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -617,21 +660,21 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     hqlQuery =
       rewrite("select cityid, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE + " group by round(zipcode)",
-        getConf());
+        conf);
     expected =
       getExpectedQuery(cubeName, "select " + " testcube.cityid, sum(testcube.msr2) FROM ", null,
         " group by round(testcube.zipcode)", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
-      rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE + " group by round(zipcode)", getConf());
+      rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE + " group by round(zipcode)", conf);
     expected =
       getExpectedQuery(cubeName, "select round(testcube.zipcode)," + " sum(testcube.msr2) FROM ", null,
         " group by round(testcube.zipcode)", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     hqlQuery =
-      rewrite("select cityid, msr2 from testCube" + " where " + TWO_DAYS_RANGE + " group by round(zipcode)", getConf());
+      rewrite("select cityid, msr2 from testCube" + " where " + TWO_DAYS_RANGE + " group by round(zipcode)", conf);
     expected =
       getExpectedQuery(cubeName, "select " + " testcube.cityid, sum(testcube.msr2) FROM ", null,
         " group by round(testcube.zipcode)", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -639,15 +682,15 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     hqlQuery =
       rewrite("select round(zipcode) rzc," + " msr2 from testCube where " + TWO_DAYS_RANGE + " group by zipcode"
-        + " order by rzc", getConf());
+        + " order by rzc", conf);
     expected =
       getExpectedQuery(cubeName, "select round(testcube.zipcode) rzc," + " sum(testcube.msr2) FROM ", null,
         " group by testcube.zipcode  order by rzc asc", getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
     // rewrite with expressions
-    Configuration conf = getConf();
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, false);
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1, C2");
     hqlQuery =
       rewrite("SELECT citydim.name AS g1," + " CASE  WHEN citydim.name=='NULL'  THEN 'NULL' "
         + " WHEN citydim.name=='X'  THEN 'X-NAME' " + " WHEN citydim.name=='Y'  THEN 'Y-NAME' "
@@ -785,11 +828,11 @@ public class TestCubeRewriter extends TestQueryRewrite {
       + " on testCube.cityid = citydim.id where " + LAST_HOUR_TIME_RANGE;
 
     String expectedRewrittenQuery = "SELECT ( citydim . name ) as `Alias With Spaces` , sum(( testcube . msr2 )) "
-      + "testmeasure  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c1_citytable citydim ON "
+      + "testmeasure  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim ON "
       + "(( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
-      + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ) AND ((citydim.dt = 'latest')))) GROUP BY ( citydim . name )";
+      + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ))) GROUP BY ( citydim . name )";
 
-    String actualRewrittenQuery = rewrite(inputQuery, getConf());
+    String actualRewrittenQuery = rewrite(inputQuery, getC2Conf());
 
     Assert.assertEquals(actualRewrittenQuery, expectedRewrittenQuery);
   }
@@ -802,42 +845,42 @@ public class TestCubeRewriter extends TestQueryRewrite {
       + " on testCube.cityid = citydim.id where " + LAST_HOUR_TIME_RANGE;
 
     String expectedRewrittenQuery = "SELECT ( citydim . name ) as `Alias With Spaces` , sum(( testcube . msr2 )) "
-      + "testmeasure  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c1_citytable citydim ON "
+      + "testmeasure  FROM TestQueryRewrite.c2_testfact testcube inner JOIN TestQueryRewrite.c2_citytable citydim ON "
       + "(( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
-      + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ) AND ((citydim.dt = 'latest')))) GROUP BY ( citydim . name )";
+      + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ))) GROUP BY ( citydim . name )";
 
-    String actualRewrittenQuery = rewrite(inputQuery, getConf());
+    String actualRewrittenQuery = rewrite(inputQuery, getC2Conf());
 
     Assert.assertEquals(actualRewrittenQuery, expectedRewrittenQuery);
   }
 
   @Test
   public void testCubeQueryWithAilas() throws Exception {
-    String hqlQuery = rewrite("select SUM(msr2) m2 from" + " testCube where " + TWO_DAYS_RANGE, getConf());
+    String hqlQuery = rewrite("select SUM(msr2) m2 from" + " testCube where " + TWO_DAYS_RANGE, getC2Conf());
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2)" + " m2 FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select SUM(msr2) from testCube mycube" + " where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select SUM(msr2) from testCube mycube" + " where " + TWO_DAYS_RANGE, getC2Conf());
     expected =
       getExpectedQuery("mycube", "select sum(mycube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days("mycube", "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select SUM(testCube.msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select SUM(testCube.msr2) from testCube" + " where " + TWO_DAYS_RANGE, getC2Conf());
     expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select mycube.msr2 m2 from testCube" + " mycube where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select mycube.msr2 m2 from testCube" + " mycube where " + TWO_DAYS_RANGE, getC2Conf());
     expected =
       getExpectedQuery("mycube", "select sum(mycube.msr2) m2 FROM ", null, null,
         getWhereForDailyAndHourly2days("mycube", "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    hqlQuery = rewrite("select testCube.msr2 m2 from testCube" + " where " + TWO_DAYS_RANGE, getConf());
+    hqlQuery = rewrite("select testCube.msr2 m2 from testCube" + " where " + TWO_DAYS_RANGE, getC2Conf());
     expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) m2 FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -846,7 +889,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
   @Test
   public void testCubeWhereQueryForMonth() throws Exception {
-    String hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_MONTHS_RANGE_UPTO_HOURS, getConf());
+    String hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_MONTHS_RANGE_UPTO_HOURS, getC2Conf());
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForMonthlyDailyAndHourly2months("C2_testfact"));
@@ -892,7 +935,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
   public void testCubeWhereQueryForMonthUptoMonths() throws Exception {
     // this should consider only two month partitions.
     String hqlQuery = rewrite("select cityid, SUM(msr2) from testCube" + " where " + TWO_MONTHS_RANGE_UPTO_MONTH,
-      getConf());
+      getC2Conf());
     String expected =
       getExpectedQuery(cubeName, "select testcube.cityid," + " sum(testcube.msr2) FROM ", null,
         "group by testcube.cityid", getWhereForMonthly2months("c2_testfact"));
@@ -1086,9 +1129,10 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + " sum(testCube.msr2 < 1000) orderby testCube.cityid asc",
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact")),
     };
-
+    Configuration conf = getConf();
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     for (int i = 0; i < queries.length; i++) {
-      String hql = rewrite(queries[i], getConf());
+      String hql = rewrite(queries[i], conf);
       compareQueries(expectedQueries[i], hql);
     }
   }
@@ -1096,14 +1140,14 @@ public class TestCubeRewriter extends TestQueryRewrite {
   @Test
   public void testFactsWithInvalidColumns() throws Exception {
     String hqlQuery = rewrite("select dim1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE,
-      getConf());
+      getC1Conf());
     String expected =
       getExpectedQuery(cubeName, "select testcube.dim1, max(testcube.msr3), sum(testcube.msr2) FROM ", null,
         " group by testcube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_summary1"));
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, dim2, COUNT(msr4)," + " SUM(msr2), msr3 from testCube" + " where " + TWO_DAYS_RANGE,
-        getConf());
+        getC1Conf());
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, count(testcube.msr4),"
           + " sum(testcube.msr2), max(testcube.msr3) FROM ", null, " group by testcube.dim1, testcube.dim2",
@@ -1111,7 +1155,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, dim2, cityid, msr4," + " SUM(msr2), msr3 from testCube" + " where " + TWO_DAYS_RANGE,
-        getConf());
+        getC1Conf());
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, testcube.cityid,"
           + " count(testcube.msr4), sum(testcube.msr2), max(testcube.msr3) FROM ", null,
@@ -1264,7 +1308,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
   public void testCubeQueryWithMultipleRanges() throws Exception {
     String hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE + " OR "
-        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConf());
+        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getC2Conf());
 
     String expectedRangeWhere =
       getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", TWODAYS_BACK, NOW)
@@ -1276,14 +1320,14 @@ public class TestCubeRewriter extends TestQueryRewrite {
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE + " OR "
-        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConf());
+        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getC1Conf());
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, max(testcube.msr3), sum(testcube.msr2) FROM ", null,
         " group by testcube.dim1", expectedRangeWhere, "C1_summary1");
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, dim2, COUNT(msr4)," + " SUM(msr2), msr3 from testCube" + " where " + TWO_DAYS_RANGE
-        + " OR " + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConf());
+        + " OR " + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getC1Conf());
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, count(testcube.msr4),"
           + " sum(testcube.msr2), max(testcube.msr3) FROM ", null, " group by testcube.dim1, testcube.dim2",
@@ -1291,7 +1335,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, dim2, cityid, count(msr4)," + " SUM(msr2), msr3 from testCube" + " where " + TWO_DAYS_RANGE
-        + " OR " + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConf());
+        + " OR " + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getC1Conf());
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, testcube.cityid,"
           + " count(testcube.msr4), sum(testcube.msr2), max(testcube.msr3) FROM ", null,
@@ -1324,7 +1368,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
       "SELECT SUM(msr2) from testCube left outer join citydim c1 on testCube.cityid = c1.id"
         + " left outer join statedim s1 on c1.stateid = s1.id"
         + " left outer join citydim c2 on s1.countryid = c2.id where " + TWO_DAYS_RANGE;
-    Configuration conf = getConf();
+    Configuration conf = getC1Conf();
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, true);
     String hqlQuery = rewrite(cubeQl, conf);
     String db = getDbName();
@@ -1336,8 +1380,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2)" + " FROM ", expectedJoin, null, null, null,
-        getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
-    compareQueries(expected, hqlQuery);
+        getWhereForHourly2days(cubeName, "C1_testfact2"));
+    compareQueries(hqlQuery, expected);
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDateUtil.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDateUtil.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDateUtil.java
index 9efd1f7..3df704d 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDateUtil.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDateUtil.java
@@ -18,16 +18,23 @@
  */
 package org.apache.lens.cube.parse;
 
-import static org.apache.lens.cube.parse.DateUtil.resolveDate;
+import static org.apache.lens.cube.metadata.UpdatePeriod.*;
+import static org.apache.lens.cube.parse.DateUtil.*;
 
+import static org.apache.commons.lang.time.DateUtils.addMilliseconds;
+
+import static org.testng.Assert.assertEquals;
+
+import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 
+import org.apache.lens.cube.parse.DateUtil.*;
+
 import org.apache.commons.lang.time.DateUtils;
 
-import org.testng.Assert;
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
@@ -43,6 +50,15 @@ public class TestDateUtil {
   };
 
   public static final SimpleDateFormat DATE_FMT = new SimpleDateFormat("yyyy-MMM-dd");
+  public static final String ABS_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss:SSS";
+
+  public static final ThreadLocal<DateFormat> ABS_DATE_PARSER =
+    new ThreadLocal<DateFormat>() {
+      @Override
+      protected SimpleDateFormat initialValue() {
+        return new SimpleDateFormat(ABS_DATE_FORMAT);
+      }
+    };
 
   private Date[] pairs;
 
@@ -61,121 +77,121 @@ public class TestDateUtil {
   @Test
   public void testMonthsBetween() throws Exception {
     int i = 0;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
-      new DateUtil.CoveringInfo(1, true),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
+      new CoveringInfo(1, true),
       "2013-Jan-01 to 2013-Jan-31");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
-      new DateUtil.CoveringInfo(5, true),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
+      new CoveringInfo(5, true),
       "2013-Jan-01 to 2013-May-31");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
-      new DateUtil.CoveringInfo(12, true),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
+      new CoveringInfo(12, true),
       "2013-Jan-01 to 2013-Dec-31");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(2, false),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(2, false),
       "2013-Feb-01 to 2013-Apr-25");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(12, true),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(12, true),
       "2012-Feb-01 to 2013-Feb-01");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(24, true),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(24, true),
       "2011-Feb-01 to 2013-Feb-01");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "2013-Jan-02 to 2013-Feb-02");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(1, false),
+    assertEquals(getMonthlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(1, false),
       "2013-Jan-02 to 2013-Mar-02");
   }
 
   @Test
   public void testQuartersBetween() throws Exception {
     int i = 0;
-    Assert.assertEquals(DateUtil.getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "2013-Jan-01 to 2013-Jan-31");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(1, false),
+    assertEquals(getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(1, false),
       "2013-Jan-01 to 2013-May-31");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getQuarterlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
-      new DateUtil.CoveringInfo(4, true),
+    assertEquals(getQuarterlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
+      new CoveringInfo(4, true),
       "2013-Jan-01 to 2013-Dec-31");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "2013-Feb-01 to 2013-Apr-25");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(3, false),
+    assertEquals(getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(3, false),
       "2012-Feb-01 to 2013-Feb-01");
 
     i += 2;
-    Assert.assertEquals(DateUtil.getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(7, false),
+    assertEquals(getQuarterlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(7, false),
       "2011-Feb-01 to 2013-Feb-01");
   }
 
   @Test
   public void testYearsBetween() throws Exception {
     int i = 0;
-    Assert.assertEquals(DateUtil.getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "" + pairs[i] + "->" + pairs[i + 1]);
 
     i += 2;
-    Assert.assertEquals(DateUtil.getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "" + pairs[i] + "->" + pairs[i + 1]);
 
     i += 2;
-    Assert.assertEquals(DateUtil.getYearlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
-      new DateUtil.CoveringInfo(1, true), ""
+    assertEquals(getYearlyCoveringInfo(pairs[i], DateUtils.round(pairs[i + 1], Calendar.MONTH)),
+      new CoveringInfo(1, true), ""
         + pairs[i] + "->" + pairs[i + 1]);
 
     i += 2;
-    Assert.assertEquals(DateUtil.getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "" + pairs[i] + "->" + pairs[i + 1]);
 
     i += 2;
-    Assert.assertEquals(DateUtil.getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(0, false),
+    assertEquals(getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(0, false),
       "" + pairs[i] + "->" + pairs[i + 1]);
 
     i += 2;
-    Assert.assertEquals(DateUtil.getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new DateUtil.CoveringInfo(1, false),
+    assertEquals(getYearlyCoveringInfo(pairs[i], pairs[i + 1]), new CoveringInfo(1, false),
       "" + pairs[i] + "->" + pairs[i + 1]);
   }
 
   @Test
   public void testWeeksBetween() throws Exception {
-    DateUtil.CoveringInfo weeks;
+    CoveringInfo weeks;
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-26"), DATE_FMT.parse("2013-Jun-2"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(1, true), "2013-May-26 to 2013-Jun-2");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-26"), DATE_FMT.parse("2013-Jun-2"));
+    assertEquals(weeks, new CoveringInfo(1, true), "2013-May-26 to 2013-Jun-2");
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-27"), DATE_FMT.parse("2013-Jun-3"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(0, false), "2013-May-26 to 2013-Jun-2");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-27"), DATE_FMT.parse("2013-Jun-3"));
+    assertEquals(weeks, new CoveringInfo(0, false), "2013-May-26 to 2013-Jun-2");
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-27"), DATE_FMT.parse("2013-Jun-9"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(1, false), "2013-May-26 to 2013-Jun-2");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-27"), DATE_FMT.parse("2013-Jun-9"));
+    assertEquals(weeks, new CoveringInfo(1, false), "2013-May-26 to 2013-Jun-2");
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-27"), DATE_FMT.parse("2013-Jun-1"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(0, false), "2013-May-27 to 2013-Jun-1");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-27"), DATE_FMT.parse("2013-Jun-1"));
+    assertEquals(weeks, new CoveringInfo(0, false), "2013-May-27 to 2013-Jun-1");
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-25"), DATE_FMT.parse("2013-Jun-2"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(1, false), "2013-May-25 to 2013-Jun-1");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-25"), DATE_FMT.parse("2013-Jun-2"));
+    assertEquals(weeks, new CoveringInfo(1, false), "2013-May-25 to 2013-Jun-1");
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-26"), DATE_FMT.parse("2013-Jun-9"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(2, true), "2013-May-26 to 2013-Jun-8");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-26"), DATE_FMT.parse("2013-Jun-9"));
+    assertEquals(weeks, new CoveringInfo(2, true), "2013-May-26 to 2013-Jun-8");
 
-    weeks = DateUtil.getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-26"), DATE_FMT.parse("2013-Jun-10"));
-    Assert.assertEquals(weeks, new DateUtil.CoveringInfo(2, false), "2013-May-26 to 2013-Jun-10");
+    weeks = getWeeklyCoveringInfo(DATE_FMT.parse("2013-May-26"), DATE_FMT.parse("2013-Jun-10"));
+    assertEquals(weeks, new CoveringInfo(2, false), "2013-May-26 to 2013-Jun-10");
   }
 
   @Test
@@ -189,22 +205,45 @@ public class TestDateUtil {
     System.out.print("@@ testDateStr=" + testDateStr + " parsed date=" + testDate);
 
     // Tests without a diff, just resolve now with different granularity
-    Assert.assertEquals(testDateStr, sdf.format(resolveDate("now", testDate)));
-    Assert.assertEquals("2014/01/01-00.00.00.000", sdf.format(resolveDate("now.year", testDate)));
-    Assert.assertEquals("2014/09/01-00.00.00.000", sdf.format(resolveDate("now.month", testDate)));
+    assertEquals(testDateStr, sdf.format(resolveDate("now", testDate)));
+    assertEquals("2014/01/01-00.00.00.000", sdf.format(resolveDate("now.year", testDate)));
+    assertEquals("2014/09/01-00.00.00.000", sdf.format(resolveDate("now.month", testDate)));
     // Start of week resolves to Sunday
-    Assert.assertEquals("2014/09/21-00.00.00.000", sdf.format(resolveDate("now.week", testDate)));
-    Assert.assertEquals("2014/09/23-00.00.00.000", sdf.format(resolveDate("now.day", testDate)));
-    Assert.assertEquals("2014/09/23-12.00.00.000", sdf.format(resolveDate("now.hour", testDate)));
-    Assert.assertEquals("2014/09/23-12.02.00.000", sdf.format(resolveDate("now.minute", testDate)));
-    Assert.assertEquals("2014/09/23-12.02.05.000", sdf.format(resolveDate("now.second", testDate)));
+    assertEquals("2014/09/21-00.00.00.000", sdf.format(resolveDate("now.week", testDate)));
+    assertEquals("2014/09/23-00.00.00.000", sdf.format(resolveDate("now.day", testDate)));
+    assertEquals("2014/09/23-12.00.00.000", sdf.format(resolveDate("now.hour", testDate)));
+    assertEquals("2014/09/23-12.02.00.000", sdf.format(resolveDate("now.minute", testDate)));
+    assertEquals("2014/09/23-12.02.05.000", sdf.format(resolveDate("now.second", testDate)));
 
     // Tests with a diff
-    Assert.assertEquals("2014/09/22-00.00.00.000", sdf.format(resolveDate("now.day -1day", testDate)));
-    Assert.assertEquals("2014/09/23-10.00.00.000", sdf.format(resolveDate("now.hour -2hour", testDate)));
-    Assert.assertEquals("2014/09/24-12.00.00.000", sdf.format(resolveDate("now.hour +24hour", testDate)));
-    Assert.assertEquals("2015/01/01-00.00.00.000", sdf.format(resolveDate("now.year +1year", testDate)));
-    Assert.assertEquals("2014/02/01-00.00.00.000", sdf.format(resolveDate("now.year +1month", testDate)));
+    assertEquals("2014/09/22-00.00.00.000", sdf.format(resolveDate("now.day -1day", testDate)));
+    assertEquals("2014/09/23-10.00.00.000", sdf.format(resolveDate("now.hour -2hour", testDate)));
+    assertEquals("2014/09/24-12.00.00.000", sdf.format(resolveDate("now.hour +24hour", testDate)));
+    assertEquals("2015/01/01-00.00.00.000", sdf.format(resolveDate("now.year +1year", testDate)));
+    assertEquals("2014/02/01-00.00.00.000", sdf.format(resolveDate("now.year +1month", testDate)));
   }
 
+  @Test
+  public void testFloorDate() throws ParseException {
+    Date date = ABS_DATE_PARSER.get().parse("2015-01-01T00:00:00:000Z");
+    Date curDate = date;
+    for (int i = 0; i < 284; i++) {
+      assertEquals(getFloorDate(curDate, YEARLY), date);
+      curDate = addMilliseconds(curDate, 111111111);
+    }
+    assertEquals(getFloorDate(curDate, YEARLY), DateUtils.addYears(date, 1));
+    assertEquals(getFloorDate(date, WEEKLY), ABS_DATE_PARSER.get().parse("2014-12-28T00:00:00:000Z"));
+  }
+
+  @Test
+  public void testCeilDate() throws ParseException {
+    Date date = ABS_DATE_PARSER.get().parse("2015-12-26T06:30:15:040Z");
+    assertEquals(getCeilDate(date, YEARLY), ABS_DATE_PARSER.get().parse("2016-01-01T00:00:00:000Z"));
+    assertEquals(getCeilDate(date, MONTHLY), ABS_DATE_PARSER.get().parse("2016-01-01T00:00:00:000Z"));
+    assertEquals(getCeilDate(date, DAILY), ABS_DATE_PARSER.get().parse("2015-12-27T00:00:00:000Z"));
+    assertEquals(getCeilDate(date, HOURLY), ABS_DATE_PARSER.get().parse("2015-12-26T07:00:00:000Z"));
+    assertEquals(getCeilDate(date, MINUTELY), ABS_DATE_PARSER.get().parse("2015-12-26T06:31:00:000Z"));
+    assertEquals(getCeilDate(date, SECONDLY), ABS_DATE_PARSER.get().parse("2015-12-26T06:30:16:000Z"));
+    assertEquals(getCeilDate(date, WEEKLY), ABS_DATE_PARSER.get().parse("2015-12-27T00:00:00:000Z"));
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
index 5cf76ca..4304f94 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
@@ -45,25 +45,26 @@ public class TestQueryMetrics extends TestQueryRewrite {
     MetricRegistry reg = LensMetricsRegistry.getStaticRegistry();
 
     Assert.assertTrue(reg.getGauges().keySet().containsAll(Arrays.asList(
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ExpressionResolver-ITER-0",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ColumnResolver-ITER-1",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AliasReplacer-ITER-2",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-3",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-4",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AggregateResolver-ITER-5",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.GroupbyResolver-ITER-6",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.FieldValidator-ITER-7",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.JoinResolver-ITER-8",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimerangeResolver-ITER-9",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-10",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-11",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-12",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-13",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-14",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-15",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LeastPartitionResolver-ITER-16",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-17",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestDimensionResolver-ITER-18"
-    )));
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AggregateResolver-ITER-5",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AliasReplacer-ITER-2",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-10",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-4",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ColumnResolver-ITER-1",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-16",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-3",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ExpressionResolver-ITER-0",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.FieldValidator-ITER-7",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.GroupbyResolver-ITER-6",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.JoinResolver-ITER-8",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LeastPartitionResolver-ITER-17",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestDimensionResolver-ITER-19",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-14",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-18",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.MaxCoveringFactResolver-ITER-13",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-11",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-12",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-15",
+        "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimerangeResolver-ITER-9")
+    ));
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/6008ffb1/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java
index 544f4a0..f039977 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java
@@ -38,17 +38,24 @@ public class TestRewriterPlan extends TestQueryRewrite {
   Configuration conf = new Configuration();
 
   TestRewriterPlan() {
-    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1,C2");
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, false);
     conf.setBoolean(CubeQueryConfUtil.ENABLE_SELECT_TO_GROUPBY, true);
     conf.setBoolean(CubeQueryConfUtil.ENABLE_GROUP_BY_TO_SELECT, true);
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AGGREGATE_RESOLVER, false);
   }
+  private Configuration getConf(){
+    return new Configuration(conf);
+  }
+  private Configuration getConf(String storages) {
+    Configuration c = getConf();
+    c.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, storages);
+    return c;
+  }
 
   @Test
   public void testPlanExtractionForSimpleQuery() throws Exception {
     // simple query
-    CubeQueryContext ctx = rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, conf);
+    CubeQueryContext ctx = rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConf("C2"));
     ctx.toHQL();
     RewriterPlan plan = new RewriterPlan(Collections.singleton(ctx));
     Assert.assertNotNull(plan);
@@ -64,18 +71,18 @@ public class TestRewriterPlan extends TestQueryRewrite {
   public void testPlanExtractionForComplexQuery() throws Exception {
     // complex query
     CubeQueryContext ctx = rewriteCtx("cube select citydim.name, SUM(msr2) from testCube where citydim.name != \"XYZ\""
-      + " and " + TWO_DAYS_RANGE + " having sum(msr2) > 1000 order by citydim.name limit 50", conf);
+      + " and " + TWO_DAYS_RANGE + " having sum(msr2) > 1000 order by citydim.name limit 50", getConf("C1,C2"));
     ctx.toHQL();
     RewriterPlan plan = new RewriterPlan(Collections.singleton(ctx));
     Assert.assertNotNull(plan);
     Assert.assertFalse(plan.getTablesQueried().isEmpty());
-    Assert.assertTrue(plan.getTablesQueried().contains("TestQueryRewrite.c2_testfact"));
+    Assert.assertTrue(plan.getTablesQueried().contains("TestQueryRewrite.c1_testfact2"));
     Assert.assertTrue(plan.getTablesQueried().contains("TestQueryRewrite.c1_citytable"));
-    Assert.assertEquals(plan.getTableWeights().get("TestQueryRewrite.c2_testfact"), 1.0);
+    Assert.assertEquals(plan.getTableWeights().get("TestQueryRewrite.c1_testfact2"), 1.0);
     Assert.assertEquals(plan.getTableWeights().get("TestQueryRewrite.c1_citytable"), 100.0);
     Assert.assertFalse(plan.getPartitions().isEmpty());
-    Assert.assertFalse(plan.getPartitions().get("testfact").isEmpty());
-    Assert.assertTrue(plan.getPartitions().get("testfact").size() > 1);
+    Assert.assertFalse(plan.getPartitions().get("testfact2").isEmpty());
+    Assert.assertTrue(plan.getPartitions().get("testfact2").size() > 1);
     Assert.assertFalse(plan.getPartitions().get("citytable").isEmpty());
     Assert.assertEquals(plan.getPartitions().get("citytable").size(), 1);
   }
@@ -83,21 +90,21 @@ public class TestRewriterPlan extends TestQueryRewrite {
   @Test
   public void testPlanExtractionForMultipleQueries() throws Exception {
     // simple query
-    CubeQueryContext ctx1 = rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, conf);
+    CubeQueryContext ctx1 = rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConf("C1,C2"));
     ctx1.toHQL();
     CubeQueryContext ctx2 = rewriteCtx("cube select citydim.name, SUM(msr2) from testCube where citydim.name != \"XYZ\""
-      + " and " + TWO_DAYS_RANGE + " having sum(msr2) > 1000 order by citydim.name limit 50", conf);
+      + " and " + TWO_DAYS_RANGE + " having sum(msr2) > 1000 order by citydim.name limit 50", getConf("C1,C2"));
     ctx2.toHQL();
     RewriterPlan plan = new RewriterPlan(Arrays.asList(ctx1, ctx2));
     Assert.assertNotNull(plan);
     Assert.assertFalse(plan.getTablesQueried().isEmpty());
-    Assert.assertTrue(plan.getTablesQueried().contains("TestQueryRewrite.c2_testfact"));
+    Assert.assertTrue(plan.getTablesQueried().contains("TestQueryRewrite.c1_testfact2"));
     Assert.assertTrue(plan.getTablesQueried().contains("TestQueryRewrite.c1_citytable"));
-    Assert.assertEquals(plan.getTableWeights().get("TestQueryRewrite.c2_testfact"), 1.0);
+    Assert.assertEquals(plan.getTableWeights().get("TestQueryRewrite.c1_testfact2"), 1.0);
     Assert.assertEquals(plan.getTableWeights().get("TestQueryRewrite.c1_citytable"), 100.0);
     Assert.assertFalse(plan.getPartitions().isEmpty());
-    Assert.assertFalse(plan.getPartitions().get("testfact").isEmpty());
-    Assert.assertTrue(plan.getPartitions().get("testfact").size() > 1);
+    Assert.assertFalse(plan.getPartitions().get("testfact2").isEmpty());
+    Assert.assertTrue(plan.getPartitions().get("testfact2").size() > 1);
     Assert.assertFalse(plan.getPartitions().get("citytable").isEmpty());
     Assert.assertEquals(plan.getPartitions().get("citytable").size(), 1);
   }