You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2015/05/14 06:40:03 UTC

[1/2] incubator-lens git commit: LENS-198 : Allow timed dimensions of cube to be non-partitioned columns as well (Rajat Khandelwal via amareshwari)

Repository: incubator-lens
Updated Branches:
  refs/heads/master 6f8ad2186 -> dc1fafa91


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
index b1d7a32..e61d807 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
@@ -19,25 +19,36 @@
 
 package org.apache.lens.cube.parse;
 
+import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.MISSING_PARTITIONS;
 import static org.apache.lens.cube.parse.CubeTestSetup.*;
+import static org.apache.lens.cube.parse.DateUtil.*;
+import static org.apache.lens.cube.parse.TestCubeRewriter.compareQueries;
+
+import static org.apache.hadoop.hive.ql.parse.HiveParser.KW_AND;
 
 import static org.testng.Assert.*;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.lens.cube.metadata.UpdatePeriod;
+import org.apache.lens.server.api.error.LensException;
+
+import org.apache.commons.lang.time.DateUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.ql.ErrorMsg;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
 
+import org.antlr.runtime.CommonToken;
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
-public class TestBaseCubeQueries extends TestQueryRewrite {
+import lombok.Getter;
 
+public class TestBaseCubeQueries extends TestQueryRewrite {
+  @Getter
   private Configuration conf;
   private final String cubeName = CubeTestSetup.BASE_CUBE_NAME;
 
@@ -141,19 +152,19 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     String expected =
       getExpectedQuery(cubeName, "select basecube.dim1, SUM(basecube.msr1) FROM ", null, " group by basecube.dim1",
         getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
-    TestCubeRewriter.compareQueries(expected, hqlQuery);
+    compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("select dim1, SUM(msr1), msr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select basecube.dim1, SUM(basecube.msr1), basecube.msr2 FROM ", null,
         " group by basecube.dim1", getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
-    TestCubeRewriter.compareQueries(expected, hqlQuery);
+    compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("select dim1, roundedmsr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select basecube.dim1, round(sum(basecube.msr2)/1000) FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
-    TestCubeRewriter.compareQueries(expected, hqlQuery);
+    compareQueries(expected, hqlQuery);
 
     hqlQuery =
       rewrite("select booleancut, msr2 from basecube" + " where " + TWO_DAYS_RANGE + " and substrexpr != 'XYZ'", conf);
@@ -162,13 +173,13 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
           + " sum(basecube.msr2) FROM ", null, " and substr(basecube.dim1, 3) != 'XYZ' "
           + "group by basecube.dim1 != 'x' AND basecube.dim2 != 10",
         getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
-    TestCubeRewriter.compareQueries(expected, hqlQuery);
+    compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("select dim1, msr12 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
       getExpectedQuery(cubeName, "select basecube.dim1, sum(basecube.msr12) FROM ", null, " group by basecube.dim1",
         getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
-    TestCubeRewriter.compareQueries(expected, hqlQuery);
+    compareQueries(expected, hqlQuery);
   }
 
   @Test
@@ -388,4 +399,74 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
         .startsWith("select coalesce(mq1.expr1, mq2.expr1) expr1, mq1.msr2 msr2, mq2.expr3 expr3 from "));
     assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"));
   }
+
+  @Test
+  public void testFallbackPartCol() throws Exception {
+    Configuration conf = getConfWithStorages("C1,C2,C3,C4");
+    conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, false);
+    String hql, expected;
+    // Prefer fact that has a storage with part col on queried time dim
+    hql = rewrite("cube select msr12 from basecube where " + TWO_DAYS_RANGE, conf);
+    expected = getExpectedQuery(BASE_CUBE_NAME, "select sum(basecube.msr12) FROM ", null, null,
+      getWhereForDailyAndHourly2days(BASE_CUBE_NAME, "c1_testfact2_base"));
+    compareQueries(hql, expected);
+
+    // If going to fallback timedim, and partitions are missing, then error should be missing partition on that
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C4");
+    conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, true);
+    SemanticException exc =
+      getSemanticExceptionInRewrite("cube select msr12 from basecube where " + TWO_DAYS_RANGE, conf);
+    PruneCauses.BriefAndDetailedError pruneCause = extractPruneCause(exc);
+    assertTrue(pruneCause.getBrief().contains("Missing partitions"));
+    assertEquals(pruneCause.getDetails().get("testfact2_base").iterator().next().getCause(), MISSING_PARTITIONS);
+    assertEquals(pruneCause.getDetails().get("testfact2_base").iterator().next().getMissingPartitions().size(), 1);
+    assertEquals(
+      pruneCause.getDetails().get("testfact2_base").iterator().next().getMissingPartitions().iterator().next(),
+      "ttd:["
+        + UpdatePeriod.SECONDLY.format().format(DateUtils.addDays(DateUtils.truncate(TWODAYS_BACK, Calendar.HOUR), -10))
+        + ", " + UpdatePeriod.SECONDLY.format().format(DateUtils.addDays(DateUtils.truncate(NOW, Calendar.HOUR), 10))
+        + ")");
+
+    // fail on partial false. Should go to fallback column. Also testing transitivity of timedim relations
+    conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, false);
+    hql = rewrite("cube select msr12 from basecube where " + TWO_DAYS_RANGE, conf);
+    String dTimeWhereClause = "basecube.d_time >= '" + HIVE_QUERY_DATE_PARSER.get().format(ABSDATE_PARSER.get().parse(
+      getAbsDateFormatString(getDateUptoHours(
+        TWODAYS_BACK)))) + "' and "
+      + "basecube.d_time < '" + HIVE_QUERY_DATE_PARSER.get().format(ABSDATE_PARSER.get().parse(
+        getAbsDateFormatString(getDateUptoHours(NOW))));
+    String pTimeWhereClause = "basecube.processing_time >= '"
+      + HIVE_QUERY_DATE_PARSER.get().format(ABSDATE_PARSER.get().parse(
+        getAbsDateFormatString(getDateUptoHours(
+          DateUtils.addDays(TWODAYS_BACK, -5))))) + "' and "
+        + "basecube.processing_time < '" + HIVE_QUERY_DATE_PARSER.get().format(ABSDATE_PARSER.get().parse(
+          getAbsDateFormatString(getDateUptoHours(DateUtils.addDays(NOW, 5)))));
+    expected = getExpectedQuery(BASE_CUBE_NAME, "select sum(basecube.msr12) FROM ", null,
+        " and " + dTimeWhereClause + " and " + pTimeWhereClause,
+      getWhereForDailyAndHourly2daysWithTimeDim(BASE_CUBE_NAME, "ttd",
+        DateUtils.addDays(TWODAYS_BACK, -10), DateUtils.addDays(NOW, 10), "c4_testfact2_base"));
+    compareQueries(hql, expected);
+
+    // Multiple timedims in single query. test that
+    CubeQueryContext ctx =
+      rewriteCtx("cube select msr12 from basecube where " + TWO_DAYS_RANGE + " and " + TWO_DAYS_RANGE_TTD, conf);
+    assertEquals(ctx.getCandidateFactSets().size(), 1);
+    assertEquals(ctx.getCandidateFactSets().iterator().next().size(), 1);
+    CandidateFact cfact = ctx.getCandidateFactSets().iterator().next().iterator().next();
+    assertEquals(cfact.getRangeToWhereClause().size(), 2);
+    for(Map.Entry<TimeRange, String> entry: cfact.getRangeToWhereClause().entrySet()) {
+      if (entry.getKey().getPartitionColumn().equals("dt")) {
+        ASTNode parsed = HQLParser.parseExpr(entry.getValue());
+        assertEquals(parsed.getToken().getType(), KW_AND);
+        assertTrue(entry.getValue().substring(((CommonToken) parsed.getToken()).getStopIndex() + 1).toLowerCase()
+          .contains(dTimeWhereClause));
+        assertFalse(entry.getValue().substring(0, ((CommonToken) parsed.getToken()).getStartIndex()).toLowerCase()
+          .contains("and"));
+      } else if (entry.getKey().getPartitionColumn().equals("ttd")) {
+        assertFalse(entry.getValue().toLowerCase().contains("and"));
+      } else {
+        throw new LensException("Unexpected");
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 c915353..44826bd 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
@@ -19,12 +19,14 @@
 
 package org.apache.lens.cube.parse;
 
+import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.*;
 import static org.apache.lens.cube.parse.CubeTestSetup.*;
 
+import static org.testng.Assert.*;
+
 import java.util.*;
 
 import org.apache.lens.cube.metadata.*;
-import org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode;
 import org.apache.lens.cube.parse.CandidateTablePruneCause.SkipStorageCause;
 import org.apache.lens.cube.parse.CandidateTablePruneCause.SkipStorageCode;
 import org.apache.lens.server.api.error.LensException;
@@ -39,67 +41,59 @@ import org.apache.hadoop.hive.ql.parse.ParseException;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse;
 
-import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
 public class TestCubeRewriter extends TestQueryRewrite {
 
   private final String cubeName = CubeTestSetup.TEST_CUBE_NAME;
 
-  public Configuration getConf() {
-    Configuration conf = new Configuration();
+  private Configuration conf;
+
+  @BeforeTest
+  public void setupDriver() throws Exception {
+    conf = new Configuration();
     conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1,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);
     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;
+
+  @Override
+  public Configuration getConf() {
+    return new Configuration(conf);
   }
 
   @Test
   public void testQueryWithNow() throws Exception {
     SemanticException e = getSemanticExceptionInRewrite(
-      "select SUM(msr2) from testCube where" + " time_range_in(dt, 'NOW - 2DAYS', 'NOW')", getConf());
-    Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE.getErrorCode());
+      "select SUM(msr2) from testCube where" + " time_range_in(d_time, 'NOW - 2DAYS', 'NOW')", getConf());
+    assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE.getErrorCode());
   }
 
   @Test
   public void testCandidateTables() throws Exception {
     SemanticException th = getSemanticExceptionInRewrite(
       "select dim12, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConf());
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.COLUMN_NOT_FOUND.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.COLUMN_NOT_FOUND.getErrorCode());
 
     // this query should through exception because invalidMsr is invalid
     th = getSemanticExceptionInRewrite(
       "SELECT cityid, invalidMsr from testCube " + " where " + TWO_DAYS_RANGE, getConf());
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.COLUMN_NOT_FOUND.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.COLUMN_NOT_FOUND.getErrorCode());
   }
 
   @Test
   public void testCubeQuery() throws Exception {
     CubeQueryContext rewrittenQuery =
-      rewriteCtx("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getC2Conf());
+      rewriteCtx("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConfWithStorages("C2"));
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, rewrittenQuery.toHQL());
     System.out.println("Non existing parts:" + rewrittenQuery.getNonExistingParts());
-    Assert.assertNotNull(rewrittenQuery.getNonExistingParts());
+    assertNotNull(rewrittenQuery.getNonExistingParts());
   }
 
   @Test
@@ -114,24 +108,25 @@ public class TestCubeRewriter extends TestQueryRewrite {
     int lessDataCauses = 0;
     for (Map.Entry<CubeFactTable, List<CandidateTablePruneCause>> entry : pruneCause.entrySet()) {
       for (CandidateTablePruneCause cause : entry.getValue()) {
-        if (cause.getCause().equals(CandidateTablePruneCode.LESS_DATA)) {
+        if (cause.getCause().equals(LESS_DATA)) {
           lessDataCauses++;
         }
       }
     }
-    Assert.assertTrue(lessDataCauses > 0);
+    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, getC2Conf());
+    String hqlQuery = rewrite("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConfWithStorages(
+      "C2"));
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(expected, hqlQuery);
 
-    Configuration conf = getC1Conf();
+    Configuration conf = getConfWithStorages("C1");
     conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, true);
     hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
     expected =
@@ -143,32 +138,32 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     SemanticException th = getSemanticExceptionInRewrite(
       "select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf);
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE.getErrorCode());
     PruneCauses.BriefAndDetailedError pruneCauses = extractPruneCause(th);
-    int endIndex = CandidateTablePruneCode.MISSING_PARTITIONS.errorFormat.length() - 3;
-    Assert.assertEquals(
+    int endIndex = MISSING_PARTITIONS.errorFormat.length() - 3;
+    assertEquals(
       pruneCauses.getBrief().substring(0, endIndex),
-      CandidateTablePruneCode.MISSING_PARTITIONS.errorFormat.substring(0, endIndex)
+      MISSING_PARTITIONS.errorFormat.substring(0, endIndex)
     );
-    Assert.assertEquals(pruneCauses.getDetails().get("testfact").size(), 1);
-    Assert.assertEquals(pruneCauses.getDetails().get("testfact").iterator().next().getCause(),
-      CandidateTablePruneCode.MISSING_PARTITIONS);
+    assertEquals(pruneCauses.getDetails().get("testfact").size(), 1);
+    assertEquals(pruneCauses.getDetails().get("testfact").iterator().next().getCause(),
+      MISSING_PARTITIONS);
   }
 
   @Test
   public void testDerivedCube() throws SemanticException, ParseException, LensException {
     CubeQueryContext rewrittenQuery =
-      rewriteCtx("cube select" + " SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, getC2Conf());
+      rewriteCtx("cube select" + " SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, getConfWithStorages("C2"));
     String expected =
       getExpectedQuery(CubeTestSetup.DERIVED_CUBE_NAME, "select sum(derivedCube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(CubeTestSetup.DERIVED_CUBE_NAME, "C2_testfact"));
     compareQueries(expected, rewrittenQuery.toHQL());
     System.out.println("Non existing parts:" + rewrittenQuery.getNonExistingParts());
-    Assert.assertNotNull(rewrittenQuery.getNonExistingParts());
+    assertNotNull(rewrittenQuery.getNonExistingParts());
 
     SemanticException th = getSemanticExceptionInRewrite(
       "select SUM(msr4) from derivedCube" + " where " + TWO_DAYS_RANGE, getConf());
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.COLUMN_NOT_FOUND.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.COLUMN_NOT_FOUND.getErrorCode());
 
     // test join
     Configuration conf = getConf();
@@ -204,9 +199,9 @@ public class TestCubeRewriter extends TestQueryRewrite {
     conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
     String hqlQuery = rewrite("insert overwrite directory" + " '/tmp/test' select SUM(msr2) from testCube where "
       + TWO_DAYS_RANGE, conf);
+    Map<String, String> wh = getWhereForDailyAndHourly2days(cubeName, "C2_testfact");
     String expected = "insert overwrite directory '/tmp/test' "
-      + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
-        getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
+      + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, wh);
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite directory" + " '/tmp/test' cube select SUM(msr2) from testCube where "
@@ -215,9 +210,9 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     hqlQuery = rewrite("insert overwrite local directory" + " '/tmp/test' select SUM(msr2) from testCube where "
       + TWO_DAYS_RANGE, conf);
+    wh = getWhereForDailyAndHourly2days(cubeName, "C2_testfact");
     expected = "insert overwrite local directory '/tmp/test' "
-      + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
-        getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
+      + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, wh);
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite local directory" + " '/tmp/test' cube select SUM(msr2) from testCube where "
@@ -226,9 +221,9 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     hqlQuery = rewrite("insert overwrite table temp" + " select SUM(msr2) from testCube where " + TWO_DAYS_RANGE,
       conf);
+    wh = getWhereForDailyAndHourly2days(cubeName, "C2_testfact");
     expected = "insert overwrite table temp "
-      + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
-        getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
+      + getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, wh);
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("insert overwrite table temp" + " cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE,
@@ -240,9 +235,9 @@ public class TestCubeRewriter extends TestQueryRewrite {
     if (expected == null && actual == null) {
       return;
     } else if (expected == null) {
-      Assert.fail();
+      fail();
     } else if (actual == null) {
-      Assert.fail("Rewritten query is null");
+      fail("Rewritten query is null");
     }
     String expectedTrimmed = expected.replaceAll("\\W", "");
     String actualTrimmed = actual.replaceAll("\\W", "");
@@ -257,16 +252,16 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
       System.err.println("__FAILED__ " + method + "\n\tExpected: " + expected + "\n\t---------\n\tActual: " + actual);
     }
-    Assert.assertTrue(expectedTrimmed.equalsIgnoreCase(actualTrimmed));
+    assertTrue(expectedTrimmed.equalsIgnoreCase(actualTrimmed));
   }
 
   static void compareContains(String expected, String actual) {
     if (expected == null && actual == null) {
       return;
     } else if (expected == null) {
-      Assert.fail();
+      fail();
     } else if (actual == null) {
-      Assert.fail("Rewritten query is null");
+      fail("Rewritten query is null");
     }
     String expectedTrimmed = expected.replaceAll("\\W", "");
     String actualTrimmed = actual.replaceAll("\\W", "");
@@ -281,13 +276,13 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
       System.err.println("__FAILED__ " + method + "\n\tExpected: " + expected + "\n\t---------\n\tActual: " + actual);
     }
-    Assert.assertTrue(actualTrimmed.toLowerCase().contains(expectedTrimmed.toLowerCase()));
+    assertTrue(actualTrimmed.toLowerCase().contains(expectedTrimmed.toLowerCase()));
   }
 
   @Test
   public void testCubeWhereQuery() throws Exception {
     String hqlQuery, expected;
-    hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getC2Conf());
+    hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConfWithStorages("C2"));
     expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -481,7 +476,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
       rewrite("select SUM(msr2) from testCube" + " join citydim on testCube.cityid = citydim.id" + " where "
         + 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()
           + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, null, joinWhereConds,
@@ -495,7 +491,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " join citydim on cityid = id" + " where " + TWO_DAYS_RANGE,
-        getC2Conf());
+        getConfWithStorages("C2"));
     compareQueries(expected, hqlQuery);
 
     // q2
@@ -556,7 +552,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     SemanticException th = getSemanticExceptionInRewrite(
       "select name, SUM(msr2) from testCube" + " join citydim" + " where " + TWO_DAYS_RANGE
         + " group by name", getConf());
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_JOIN_CONDITION_AVAIABLE.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_JOIN_CONDITION_AVAIABLE.getErrorCode());
   }
 
   @Test
@@ -609,7 +605,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
       rewrite("select name, SUM(msr2) from" + " testCube join citydim on testCube.cityid = citydim.id where "
         + 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()
           + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, " group by citydim.name ",
@@ -829,9 +826,9 @@ public class TestCubeRewriter extends TestQueryRewrite {
       + "(( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
       + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ))) GROUP BY ( citydim . name )";
 
-    String actualRewrittenQuery = rewrite(inputQuery, getC2Conf());
+    String actualRewrittenQuery = rewrite(inputQuery, getConfWithStorages("C2"));
 
-    Assert.assertEquals(actualRewrittenQuery, expectedRewrittenQuery);
+    assertEquals(actualRewrittenQuery, expectedRewrittenQuery);
   }
 
   @Test
@@ -846,38 +843,41 @@ public class TestCubeRewriter extends TestQueryRewrite {
       + "(( testcube . cityid ) = ( citydim . id )) WHERE (((( testcube . dt ) =  '"
       + CubeTestSetup.getDateUptoHours(LAST_HOUR) + "' ))) GROUP BY ( citydim . name )";
 
-    String actualRewrittenQuery = rewrite(inputQuery, getC2Conf());
+    String actualRewrittenQuery = rewrite(inputQuery, getConfWithStorages("C2"));
 
-    Assert.assertEquals(actualRewrittenQuery, expectedRewrittenQuery);
+    assertEquals(actualRewrittenQuery, expectedRewrittenQuery);
   }
 
   @Test
   public void testCubeQueryWithAilas() throws Exception {
-    String hqlQuery = rewrite("select SUM(msr2) m2 from" + " testCube where " + TWO_DAYS_RANGE, getC2Conf());
+    String hqlQuery = rewrite("select SUM(msr2) m2 from" + " testCube where " + TWO_DAYS_RANGE, getConfWithStorages(
+      "C2"));
     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, getC2Conf());
+    hqlQuery = rewrite("select SUM(msr2) from testCube mycube" + " where " + TWO_DAYS_RANGE, getConfWithStorages("C2"));
     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, getC2Conf());
+    hqlQuery =
+      rewrite("select SUM(testCube.msr2) from testCube" + " where " + TWO_DAYS_RANGE, getConfWithStorages("C2"));
     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, getC2Conf());
+    hqlQuery = rewrite("select mycube.msr2 m2 from testCube" + " mycube where " + TWO_DAYS_RANGE, getConfWithStorages(
+      "C2"));
     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, getC2Conf());
+    hqlQuery = rewrite("select testCube.msr2 m2 from testCube" + " where " + TWO_DAYS_RANGE, getConfWithStorages("C2"));
     expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) m2 FROM ", null, null,
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
@@ -886,7 +886,8 @@ 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, getC2Conf());
+    String hqlQuery =
+      rewrite("select SUM(msr2) from testCube" + " where " + TWO_MONTHS_RANGE_UPTO_HOURS, getConfWithStorages("C2"));
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null,
         getWhereForMonthlyDailyAndHourly2months("C2_testfact"));
@@ -900,31 +901,27 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     SemanticException e = getSemanticExceptionInRewrite(
       "select SUM(msr2) from testCube" + " where " + TWO_MONTHS_RANGE_UPTO_HOURS, conf);
-    Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE.getErrorCode());
+    assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE.getErrorCode());
     PruneCauses.BriefAndDetailedError pruneCauses = extractPruneCause(e);
 
-    Assert.assertEquals(
-      pruneCauses.getBrief().substring(0, CandidateTablePruneCode.MISSING_PARTITIONS.errorFormat.length() - 3),
-      CandidateTablePruneCode.MISSING_PARTITIONS.errorFormat.substring(0,
-        CandidateTablePruneCode.MISSING_PARTITIONS.errorFormat.length() - 3));
-
-    Assert.assertEquals(pruneCauses.getDetails().get("testfact").iterator().next().getCause(),
-      CandidateTablePruneCode.MISSING_PARTITIONS);
-    Assert.assertEquals(pruneCauses.getDetails().get("testfactmonthly").iterator().next().getCause(),
-      CandidateTablePruneCode.NO_FACT_UPDATE_PERIODS_FOR_GIVEN_RANGE);
-    Assert.assertEquals(pruneCauses.getDetails().get("testfact2").iterator().next().getCause(),
-      CandidateTablePruneCode.MISSING_PARTITIONS);
-    Assert.assertEquals(pruneCauses.getDetails().get("testfact2_raw").iterator().next().getCause(),
-      CandidateTablePruneCode.MISSING_PARTITIONS);
-    Assert.assertEquals(pruneCauses.getDetails().get("cheapfact").iterator().next().getCause(),
-      CandidateTablePruneCode.NO_CANDIDATE_STORAGES);
-    Assert.assertEquals(pruneCauses.getDetails().get("summary1,summary2,summary3").iterator().next().getCause(),
-      CandidateTablePruneCode.MISSING_PARTITIONS);
-    Assert.assertEquals(pruneCauses.getDetails().get("summary4").iterator().next()
-      .getCause(), CandidateTablePruneCode.NO_CANDIDATE_STORAGES);
-    Assert.assertEquals(pruneCauses.getDetails().get("summary4").iterator().next()
+    assertEquals(
+      pruneCauses.getBrief().substring(0, MISSING_PARTITIONS.errorFormat.length() - 3),
+      MISSING_PARTITIONS.errorFormat.substring(0,
+        MISSING_PARTITIONS.errorFormat.length() - 3));
+
+    assertEquals(pruneCauses.getDetails().get("summary1,summary2,testfact2_raw,summary3,testfact").iterator()
+      .next().getCause(), MISSING_PARTITIONS);
+    assertEquals(pruneCauses.getDetails().get("testfactmonthly").iterator().next().getCause(),
+      NO_FACT_UPDATE_PERIODS_FOR_GIVEN_RANGE);
+    assertEquals(pruneCauses.getDetails().get("testfact2").iterator().next().getCause(),
+      MISSING_PARTITIONS);
+    assertEquals(pruneCauses.getDetails().get("cheapfact").iterator().next().getCause(),
+      NO_CANDIDATE_STORAGES);
+    assertEquals(pruneCauses.getDetails().get("summary4").iterator().next()
+      .getCause(), NO_CANDIDATE_STORAGES);
+    assertEquals(pruneCauses.getDetails().get("summary4").iterator().next()
       .getStorageCauses().values().iterator().next().getCause(), SkipStorageCode.PART_COL_DOES_NOT_EXIST);
-    Assert.assertEquals(pruneCauses.getDetails().get("summary4").iterator().next()
+    assertEquals(pruneCauses.getDetails().get("summary4").iterator().next()
       .getStorageCauses().values().iterator().next().getNonExistantPartCols(), Arrays.asList("dt"));
   }
 
@@ -932,7 +929,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,
-      getC2Conf());
+      getConfWithStorages("C2"));
     String expected =
       getExpectedQuery(cubeName, "select testcube.cityid," + " sum(testcube.msr2) FROM ", null,
         "group by testcube.cityid", getWhereForMonthly2months("c2_testfact"));
@@ -956,9 +953,9 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     // state table is present on c1 with partition dumps and partitions added
     SemanticException e = getSemanticExceptionInRewrite("select name, capital from statedim ", conf);
-    Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_DIM_AVAILABLE.getErrorCode());
-    Assert.assertEquals(extractPruneCause(e), new PruneCauses.BriefAndDetailedError(
-      CandidateTablePruneCode.NO_CANDIDATE_STORAGES.errorFormat,
+    assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.NO_CANDIDATE_DIM_AVAILABLE.getErrorCode());
+    assertEquals(extractPruneCause(e), new PruneCauses.BriefAndDetailedError(
+      NO_CANDIDATE_STORAGES.errorFormat,
       new HashMap<String, List<CandidateTablePruneCause>>() {
         {
           put("statetable", Arrays.asList(CandidateTablePruneCause.noCandidateStorages(
@@ -986,7 +983,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     expected =
       getExpectedQuery("statedim", "select statedim.name," + " statedim.capital from ", null, "c1_statetable", true);
     compareQueries(expected, rewrittenQuery.toHQL());
-    Assert.assertNotNull(rewrittenQuery.getNonExistingParts());
+    assertNotNull(rewrittenQuery.getNonExistingParts());
 
     // run a query with time range function
     hqlQuery = rewrite("select name, stateid from citydim where " + TWO_DAYS_RANGE, conf);
@@ -1097,13 +1094,13 @@ public class TestCubeRewriter extends TestQueryRewrite {
         + TWO_DAYS_RANGE;
 
     SemanticException th = getSemanticExceptionInRewrite(query, getConf());
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.AMBIGOUS_CUBE_COLUMN.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.AMBIGOUS_CUBE_COLUMN.getErrorCode());
 
     String q2 =
       "SELECT ambigdim2 from citydim join" + " statedim on citydim.stateid = statedim.id join countrydim on"
         + " statedim.countryid = countrydim.id";
     th = getSemanticExceptionInRewrite(q2, getConf());
-    Assert.assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.AMBIGOUS_DIM_COLUMN.getErrorCode());
+    assertEquals(th.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.AMBIGOUS_DIM_COLUMN.getErrorCode());
   }
 
   @Test
@@ -1137,14 +1134,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,
-      getC1Conf());
+      getConfWithStorages("C1"));
     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,
-        getC1Conf());
+        getConfWithStorages("C1"));
     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",
@@ -1152,7 +1149,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,
-        getC1Conf());
+        getConfWithStorages("C1"));
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, testcube.cityid,"
           + " count(testcube.msr4), sum(testcube.msr2), max(testcube.msr3) FROM ", null,
@@ -1172,7 +1169,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String expected =
       getExpectedQuery(cubeName, "select testcube.dim1, max(testcube.msr3), sum(testcube.msr2) FROM ", null,
         " group by testcube.dim1", getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary1"),
-        getNotLatestConditions(cubeName, "it", "C2_summary1"));
+        null);
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, dim2, COUNT(msr4)," + " SUM(msr2), msr3 from testCube" + " where " + twoDaysITRange,
@@ -1181,7 +1178,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, count(testcube.msr4),"
           + " sum(testcube.msr2), max(testcube.msr3) FROM ", null, " group by testcube.dim1, testcube.dim2",
         getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary2"),
-        getNotLatestConditions(cubeName, "it", "C2_summary2"));
+        null);
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, dim2, cityid, count(msr4)," + " SUM(msr2), msr3 from testCube" + " where "
@@ -1191,7 +1188,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
           + " count(testcube.msr4), sum(testcube.msr2), max(testcube.msr3) FROM ", null,
         " group by testcube.dim1, testcube.dim2, testcube.cityid",
         getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary3"),
-        getNotLatestConditions(cubeName, "it", "C2_summary3"));
+        null);
     compareQueries(expected, hqlQuery);
   }
 
@@ -1209,7 +1206,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String expected = getExpectedQuery(cubeName, "select testcube.dim1, max(testcube.msr3), sum(testcube.msr2) FROM ",
       null, "or (( testcube.it ) == 'default')) and ((testcube.dim1) > 1000)" + " group by testcube.dim1",
       getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary1"),
-      getNotLatestConditions(cubeName, "it", "C2_summary1"));
+      null);
     compareQueries(expected, hqlQuery);
 
     hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE + " OR ("
@@ -1218,8 +1215,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String expecteddtRangeWhere1 =
       getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", TWODAYS_BACK, NOW)
         + " OR ("
-        + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", CubeTestSetup.BEFORE_4_DAYS_START,
-          CubeTestSetup.BEFORE_4_DAYS_END) + ")";
+        + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", BEFORE_4_DAYS_START, BEFORE_4_DAYS_END) + ")";
     expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, " AND testcube.dt='default'",
         expecteddtRangeWhere1, "c2_testfact");
@@ -1229,8 +1225,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
       "("
         + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", TWODAYS_BACK, NOW)
         + " AND testcube.dt='dt1') OR "
-        + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", CubeTestSetup.BEFORE_4_DAYS_START,
-          CubeTestSetup.BEFORE_4_DAYS_END);
+        + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", BEFORE_4_DAYS_START, BEFORE_4_DAYS_END);
     hqlQuery =
       rewrite("select SUM(msr2) from testCube" + " where (" + TWO_DAYS_RANGE + " AND dt='dt1') OR ("
         + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS + " AND dt='default')", getConf());
@@ -1269,7 +1264,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String expected = getExpectedQuery(cubeName, "select testcube.dim1, max(testcube.msr3), sum(testcube.msr2) FROM ",
       null, " GROUP BY ( testcube . dim1 )",
       getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary1"),
-      getNotLatestConditions(cubeName, "it", "C2_summary1"));
+      null);
     // TODO compare queries
     // compareQueries(expected, hqlQuery);
     hqlQuery =
@@ -1305,26 +1300,25 @@ 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, getC2Conf());
+        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConfWithStorages("C2"));
 
     String expectedRangeWhere =
       getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", TWODAYS_BACK, NOW)
         + " OR "
-        + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", CubeTestSetup.BEFORE_4_DAYS_START,
-          CubeTestSetup.BEFORE_4_DAYS_END);
+        + getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "dt", BEFORE_4_DAYS_START, BEFORE_4_DAYS_END);
     String expected =
       getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, expectedRangeWhere, "c2_testfact");
     compareQueries(expected, hqlQuery);
     hqlQuery =
       rewrite("select dim1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE + " OR "
-        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getC1Conf());
+        + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConfWithStorages("C1"));
     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, getC1Conf());
+        + " OR " + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConfWithStorages("C1"));
     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",
@@ -1332,7 +1326,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, getC1Conf());
+        + " OR " + CubeTestSetup.TWO_DAYS_RANGE_BEFORE_4_DAYS, getConfWithStorages("C1"));
     expected =
       getExpectedQuery(cubeName, "select testcube.dim1, testcube,dim2, testcube.cityid,"
           + " count(testcube.msr4), sum(testcube.msr2), max(testcube.msr3) FROM ", null,
@@ -1365,7 +1359,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 = getC1Conf();
+    Configuration conf = getConfWithStorages("C1");
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, true);
     String hqlQuery = rewrite(cubeQl, conf);
     String db = getDbName();
@@ -1391,15 +1385,15 @@ public class TestCubeRewriter extends TestQueryRewrite {
     Cube cube = (Cube) client.getCube(cubeName);
 
     ReferencedDimAtrribute col = (ReferencedDimAtrribute) cube.getColumnByName("cdim2");
-    Assert.assertNotNull(col);
+    assertNotNull(col);
 
     final String query = "SELECT cycledim1.name, msr2 FROM testCube where " + TWO_DAYS_RANGE;
     try {
       CubeQueryContext context = rewriteCtx(query, testConf);
       System.out.println("TestJoinPathTimeRange: " + context.toHQL());
-      Assert.fail("Expected query to fail because of invalid column life");
+      fail("Expected query to fail because of invalid column life");
     } catch (SemanticException exc) {
-      Assert.assertEquals(exc.getCanonicalErrorMsg(), ErrorMsg.NO_JOIN_PATH);
+      assertEquals(exc.getCanonicalErrorMsg(), ErrorMsg.NO_JOIN_PATH);
     } finally {
       // Add old column back
       cube.alterDimension(col);
@@ -1417,7 +1411,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     cube.alterDimension(newDim2);
     client.alterCube(cubeName, cube);
     String hql = rewrite(query, testConf);
-    Assert.assertNotNull(hql);
+    assertNotNull(hql);
   }
 
   @Test
@@ -1425,13 +1419,13 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String query = "SELECT sum(msr2) as `a measure` from testCube where " + TWO_DAYS_RANGE;
     try {
       String hql = rewrite(query, getConf());
-      Assert.assertNotNull(hql);
+      assertNotNull(hql);
       // test that quotes are preserved
-      Assert.assertTrue(hql.contains("`a measure`"));
+      assertTrue(hql.contains("`a measure`"));
       System.out.println("@@ hql: " + hql);
     } catch (NullPointerException npe) {
       npe.printStackTrace();
-      Assert.fail("Not expecting null pointer exception");
+      fail("Not expecting null pointer exception");
     }
   }
 
@@ -1453,15 +1447,15 @@ public class TestCubeRewriter extends TestQueryRewrite {
     CubeQueryContext context = rewriter.rewrite(query);
     String hql = context.toHQL();
     System.out.println("@@" + hql);
-    Assert.assertTrue(hql.contains("ttd") && hql.contains("full_hour"));
+    assertTrue(hql.contains("ttd") && hql.contains("full_hour"));
 
-    Assert.assertTrue(context.shouldReplaceTimeDimWithPart());
+    assertTrue(context.shouldReplaceTimeDimWithPart());
 
     String partCol = context.getPartitionColumnOfTimeDim("test_time_dim");
-    Assert.assertEquals("ttd", partCol);
+    assertEquals("ttd", partCol);
 
     String timeDimCol = context.getTimeDimOfPartitionColumn("ttd");
-    Assert.assertEquals("test_time_dim".toLowerCase(), timeDimCol);
+    assertEquals("test_time_dim".toLowerCase(), timeDimCol);
 
     // Rewrite with setting disabled
     hconf.setBoolean(CubeQueryConfUtil.REPLACE_TIMEDIM_WITH_PART_COL, false);
@@ -1469,7 +1463,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     context = rewriter.rewrite(query);
     hql = context.toHQL();
     System.out.println("@@2 " + hql);
-    Assert.assertTrue(!hql.contains("ttd") && hql.contains("full_hour"));
+    assertTrue(!hql.contains("ttd") && hql.contains("full_hour"));
   }
 
   @Test
@@ -1477,10 +1471,10 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String query = "SELECT msr2 as msr2 from testCube WHERE " + TWO_DAYS_RANGE;
     try {
       String hql = rewrite(query, getConf());
-      Assert.assertNotNull(hql);
+      assertNotNull(hql);
       System.out.println("@@HQL " + hql);
     } catch (NullPointerException npe) {
-      Assert.fail(npe.getMessage());
+      fail(npe.getMessage());
       npe.printStackTrace();
     }
   }
@@ -1489,7 +1483,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
   public void testDimAttributeQueryWithFact() throws Exception {
     String query = "select count (distinct dim1) from testCube where " + TWO_DAYS_RANGE;
     String hql = rewrite(query, getConf());
-    Assert.assertTrue(hql.contains("summary1"));
+    assertTrue(hql.contains("summary1"));
   }
 
   @Test
@@ -1499,7 +1493,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     conf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, false);
     String hql = rewrite(query, conf);
     System.out.println("@@ HQL = " + hql);
-    Assert.assertNotNull(hql);
+    assertNotNull(hql);
   }
 
   @Test
@@ -1532,8 +1526,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     // Run explain on this command, it should pass successfully.
     CommandProcessorResponse inExplainResponse = runExplain(hqlWithInClause, conf);
-    Assert.assertNotNull(inExplainResponse);
-    Assert.assertTrue(hqlWithInClause.contains("in"));
+    assertNotNull(inExplainResponse);
+    assertTrue(hqlWithInClause.contains("in"));
 
     // Test 2 - check for single part column
     // Verify for large number of partitions, single column. This is just to check if we don't see
@@ -1545,8 +1539,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
 
     String largePartRewrittenQuery = rewrite(largePartQuery, largeConf);
     CommandProcessorResponse response = runExplain(largePartRewrittenQuery, largeConf);
-    Assert.assertNotNull(response);
-    Assert.assertTrue(largePartRewrittenQuery.contains("in"));
+    assertNotNull(response);
+    assertTrue(largePartRewrittenQuery.contains("in"));
   }
 
   private CommandProcessorResponse runExplain(String hql, HiveConf conf) throws Exception {
@@ -1560,7 +1554,7 @@ public class TestCubeRewriter extends TestQueryRewrite {
     for (Object explainRow : explainResult) {
       // Print the following to stdout to check partition output.
       // Not parsing the output because it will slow down the test
-      Assert.assertNotNull(explainRow.toString());
+      assertNotNull(explainRow.toString());
     }
 
     return response;

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 3df704d..14e56fb 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,6 +18,8 @@
  */
 package org.apache.lens.cube.parse;
 
+import static java.util.Calendar.DAY_OF_MONTH;
+
 import static org.apache.lens.cube.metadata.UpdatePeriod.*;
 import static org.apache.lens.cube.parse.DateUtil.*;
 
@@ -28,16 +30,22 @@ import static org.testng.Assert.assertEquals;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.Set;
 
 import org.apache.lens.cube.parse.DateUtil.*;
 
 import org.apache.commons.lang.time.DateUtils;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
 
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
+import com.beust.jcommander.internal.Sets;
+import com.google.common.collect.Lists;
+
 /**
  * Unit tests for cube DateUtil class TestDateUtil.
  */
@@ -246,4 +254,34 @@ public class TestDateUtil {
     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"));
   }
+
+  @Test
+  public void testTimeDiff() throws SemanticException {
+    ArrayList<String> minusFourDays =
+      Lists.newArrayList("-4 days", "-4days", "-4day", "-4 day", "- 4days", "- 4 day");
+    ArrayList<String> plusFourDays =
+      Lists.newArrayList("+4 days", "4 days", "+4days", "4day", "4 day", "+ 4days", "+ 4 day", "+4 day");
+    Set<TimeDiff> diffs = Sets.newHashSet();
+    for (String diffStr : minusFourDays) {
+      diffs.add(TimeDiff.parseFrom(diffStr));
+    }
+    assertEquals(diffs.size(), 1);
+    TimeDiff minusFourDaysDiff = diffs.iterator().next();
+    assertEquals(minusFourDaysDiff.quantity, -4);
+    assertEquals(minusFourDaysDiff.calendarField, DAY_OF_MONTH);
+
+    diffs.clear();
+    for (String diffStr : plusFourDays) {
+      diffs.add(TimeDiff.parseFrom(diffStr));
+    }
+    assertEquals(diffs.size(), 1);
+    TimeDiff plusFourDaysDiff = diffs.iterator().next();
+    assertEquals(plusFourDaysDiff.quantity, 4);
+    assertEquals(plusFourDaysDiff.calendarField, DAY_OF_MONTH);
+    Date now = new Date();
+    assertEquals(minusFourDaysDiff.offsetFrom(plusFourDaysDiff.offsetFrom(now)), now);
+    assertEquals(plusFourDaysDiff.offsetFrom(minusFourDaysDiff.offsetFrom(now)), now);
+    assertEquals(minusFourDaysDiff.negativeOffsetFrom(now), plusFourDaysDiff.offsetFrom(now));
+    assertEquals(minusFourDaysDiff.offsetFrom(now), plusFourDaysDiff.negativeOffsetFrom(now));
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java
index 29240b6..71ed1a8 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java
@@ -61,7 +61,7 @@ public class TestDenormalizationResolver extends TestQueryRewrite {
     String expecteddim2big1 =
       getExpectedQuery(cubeName, "select testcube.dim2big1," + " max(testcube.msr3), sum(testcube.msr2) FROM ", null,
         " group by testcube.dim2big1", getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary4"),
-        getNotLatestConditions(cubeName, "it", "C2_summary4"));
+        null);
     TestCubeRewriter.compareQueries(expecteddim2big1, hqlQuery);
     // with another table
     hqlQuery = rewrite("select dim2big1, citydim.name, max(msr3)," + " msr2 from testCube" + " where " + twoDaysITRange,
@@ -71,14 +71,14 @@ public class TestDenormalizationResolver extends TestQueryRewrite {
         + getDbName() + "c1_citytable citydim " + "on testcube.cityid = citydim.id and citydim.dt = 'latest' ", null,
       " group by testcube.dim2big1, citydim.name", null,
       getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary4"),
-      getNotLatestConditions(cubeName, "it", "C2_summary4"));
+      null);
     TestCubeRewriter.compareQueries(expecteddim2big1WithAnotherTable, hqlQuery);
 
     hqlQuery = rewrite("select dim2big2, max(msr3)," + " msr2 from testCube" + " where " + twoDaysITRange, conf);
     String expecteddim2big2 =
       getExpectedQuery(cubeName, "select testcube.dim2big2, max(testcube.msr3), sum(testcube.msr2) FROM ", null,
         " group by testcube.dim2big2", getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary4"),
-        getNotLatestConditions(cubeName, "it", "C2_summary4"));
+        null);
     TestCubeRewriter.compareQueries(expecteddim2big2, hqlQuery);
 
     hqlQuery =
@@ -91,7 +91,7 @@ public class TestDenormalizationResolver extends TestQueryRewrite {
           + getDbName() + "c2_testdim3tbl testdim3 on " + "testdim2.testdim3id = testdim3.id", null,
         " group by testdim3.name, (testcube.dim2big1)", null,
         getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary4"),
-        getNotLatestConditions(cubeName, "it", "C2_summary4"));
+        null);
     TestCubeRewriter.compareQueries(expected, hqlQuery);
 
     Configuration conf2 = new Configuration(conf);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
index 06de5cd..994a244 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
@@ -44,6 +44,16 @@ public abstract class TestQueryRewrite {
   private static CubeTestSetup setup;
   private static HiveConf hconf = new HiveConf(TestQueryRewrite.class);
 
+  public Configuration getConf() {
+    return hconf;
+  }
+
+  public Configuration getConfWithStorages(String storages) {
+    Configuration conf = new Configuration(getConf());
+    conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, storages);
+    return conf;
+  }
+
   @BeforeSuite
   public static void setup() throws Exception {
     SessionState.start(hconf);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 79d9be3..0805fb5 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
@@ -34,8 +34,10 @@ import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-public class TestRewriterPlan extends TestQueryRewrite {
+import lombok.Getter;
 
+public class TestRewriterPlan extends TestQueryRewrite {
+  @Getter
   Configuration conf = new Configuration();
 
   TestRewriterPlan() {
@@ -44,19 +46,12 @@ public class TestRewriterPlan extends TestQueryRewrite {
     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, getConf("C2"));
+    Configuration conf = getConfWithStorages("C2");
+    CubeQueryContext ctx = rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, conf);
     ctx.toHQL();
     RewriterPlan plan = new RewriterPlan(Collections.singleton(ctx));
     Assert.assertNotNull(plan);
@@ -71,8 +66,9 @@ public class TestRewriterPlan extends TestQueryRewrite {
   @Test
   public void testPlanExtractionForComplexQuery() throws Exception {
     // complex query
+    Configuration conf = getConfWithStorages("C1,C2");
     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", getConf("C1,C2"));
+      + " and " + TWO_DAYS_RANGE + " having sum(msr2) > 1000 order by citydim.name limit 50", conf);
     ctx.toHQL();
     RewriterPlan plan = new RewriterPlan(Collections.singleton(ctx));
     Assert.assertNotNull(plan);
@@ -91,10 +87,11 @@ 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, getConf("C1,C2"));
+    Configuration conf = getConfWithStorages("C1,C2");
+    CubeQueryContext ctx1 = rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, conf);
     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", getConf("C1,C2"));
+      + " and " + TWO_DAYS_RANGE + " having sum(msr2) > 1000 order by citydim.name limit 50", conf);
     ctx2.toHQL();
     RewriterPlan plan = new RewriterPlan(Arrays.asList(ctx1, ctx2));
     Assert.assertNotNull(plan);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeExtractor.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeExtractor.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeExtractor.java
index bd51971..26836fe 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeExtractor.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeExtractor.java
@@ -61,7 +61,7 @@ public class TestTimeRangeExtractor extends TestQueryRewrite {
 
   @Test
   public void testTimeRangeValidation() throws Exception {
-    String timeRange2 = " time_range_in(dt, '" + dateNow + "','" + dateTwoDaysBack + "')";
+    String timeRange2 = " time_range_in(d_time, '" + dateNow + "','" + dateTwoDaysBack + "')";
     try {
       // this should throw exception because from date is after to date
       driver.rewrite("SELECT cityid, testCube.msr2 from" + " testCube where " + timeRange2);
@@ -74,7 +74,7 @@ public class TestTimeRangeExtractor extends TestQueryRewrite {
 
   @Test
   public void testEqualTimeRangeValidation() throws Exception {
-    String equalTimeRange = " time_range_in(dt, '" + dateNow + "','" + dateNow + "')";
+    String equalTimeRange = " time_range_in(d_time, '" + dateNow + "','" + dateNow + "')";
     try {
       // this should throw exception because from date and to date are same
       driver.rewrite("SELECT cityid, testCube.msr2 from" + " testCube where " + equalTimeRange);
@@ -87,7 +87,7 @@ public class TestTimeRangeExtractor extends TestQueryRewrite {
 
   @Test
   public void testNoNPE() throws Exception {
-    String timeRange = " time_range_in(dt, '" + dateTwoDaysBack + "','" + dateNow + "')";
+    String timeRange = " time_range_in(d_time, '" + dateTwoDaysBack + "','" + dateNow + "')";
     String q1 = "SELECT cityid, testCube.msr2 from testCube where " + timeRange + " AND cityid IS NULL";
     rewrite(driver, q1);
     q1 = "SELECT cityid, testCube.msr2 from testCube where cityid IS NULL AND " + timeRange;
@@ -97,7 +97,7 @@ public class TestTimeRangeExtractor extends TestQueryRewrite {
   @Test
   public void testTimeRangeASTPosition() throws Exception {
     // check that time range can be any child of AND
-    String timeRange = " time_range_in(dt, '" + dateTwoDaysBack + "','" + dateNow + "')";
+    String timeRange = " time_range_in(d_time, '" + dateTwoDaysBack + "','" + dateNow + "')";
     String q1 = "SELECT cityid, testCube.msr2 from testCube where " + timeRange + " AND cityid=1";
     CubeQueryContext cubeql = driver.rewrite(q1);
     String hql = cubeql.toHQL();
@@ -106,7 +106,7 @@ public class TestTimeRangeExtractor extends TestQueryRewrite {
   @Test
   public void testPartitionColNameExtract() throws Exception {
     String q2 =
-      "SELECT cityid, testCube.msr3 from testCube where cityid=1 AND " + " time_range_in(dt, '" + dateTwoDaysBack
+      "SELECT cityid, testCube.msr3 from testCube where cityid=1 AND " + " time_range_in(d_time, '" + dateTwoDaysBack
         + "','" + dateNow + "')";
     CubeQueryContext cubeql = driver.rewrite(q2);
     String hql = cubeql.toHQL();
@@ -124,10 +124,10 @@ public class TestTimeRangeExtractor extends TestQueryRewrite {
     String dateNow = getDateUptoHours(NOW);
     // time range within time range
     String q3 =
-      "SELECT cityid, testCube.msr3 FROM testCube where cityid=1 AND" + "  (time_range_in(dt, '" + dateTwoDaysBack
+      "SELECT cityid, testCube.msr3 FROM testCube where cityid=1 AND" + "  (time_range_in(d_time, '" + dateTwoDaysBack
         + "','" + dateNow + "')  "
         // Time range as sibling of the first time range
-        + " OR " + " time_range_in(dt, '" + dateTwoDaysBack + "', '" + dateNow + "'))";
+        + " OR " + " time_range_in(d_time, '" + dateTwoDaysBack + "', '" + dateNow + "'))";
     CubeQueryContext cubeql = driver.rewrite(q3);
     String hql = cubeql.toHQL();
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-examples/src/main/java/org/apache/lens/examples/PopulateSampleMetastore.java
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/java/org/apache/lens/examples/PopulateSampleMetastore.java b/lens-examples/src/main/java/org/apache/lens/examples/PopulateSampleMetastore.java
index 7883b15..7ecabfa 100644
--- a/lens-examples/src/main/java/org/apache/lens/examples/PopulateSampleMetastore.java
+++ b/lens-examples/src/main/java/org/apache/lens/examples/PopulateSampleMetastore.java
@@ -163,5 +163,4 @@ public class PopulateSampleMetastore {
     createFactPartitions("sales-aggr-fact1-mydb-parts.xml", "sales_aggr_fact1", "mydb");
     createFactPartitions("sales-aggr-fact2-mydb-parts.xml", "sales_aggr_fact2", "mydb");
   }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-examples/src/main/resources/cube-queries.sql
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/resources/cube-queries.sql b/lens-examples/src/main/resources/cube-queries.sql
index 7a0b542..7668f54 100644
--- a/lens-examples/src/main/resources/cube-queries.sql
+++ b/lens-examples/src/main/resources/cube-queries.sql
@@ -103,3 +103,5 @@ cube select product_details.category, store_sales from sales where time_range_in
 cube select product_details.category, store_sales from sales where time_range_in(order_time, '2015-04-12-00', '2015-04-13-00')
 cube select product_details.color, store_sales from sales where time_range_in(delivery_time, '2015-04-11-00', '2015-04-13-00') and product_details.category='Stationary'
 cube select product_details.color, store_sales from sales where time_range_in(delivery_time, '2015-04-12-00', '2015-04-13-00') and product_details.category='Stationary'
+-- The following query sees that ot part col is not present and falls back on querying on dt part col
+cube select customer_city_name, store_cost from sales where time_range_in(order_time, '2015-04-13-03', '2015-04-13-04') --
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-examples/src/main/resources/customer.xml
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/resources/customer.xml b/lens-examples/src/main/resources/customer.xml
index 64024f1..1b4f854 100644
--- a/lens-examples/src/main/resources/customer.xml
+++ b/lens-examples/src/main/resources/customer.xml
@@ -28,7 +28,7 @@
     <dim_attribute name="age" type="INT" />
     <dim_attribute name="city_id" type="INT" />
     <dim_attribute name="customer_city_name" type="string" description="City name to which the customer belongs"
-      displayString=" Customer City">
+      display_string="Customer City">
       <ref_spec>
         <chain_ref_column chain_name="customer_city" ref_col="name" />
       </ref_spec>

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-examples/src/main/resources/sales-aggr-fact2-local-parts.xml
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/resources/sales-aggr-fact2-local-parts.xml b/lens-examples/src/main/resources/sales-aggr-fact2-local-parts.xml
index 35a8801..a10535a 100644
--- a/lens-examples/src/main/resources/sales-aggr-fact2-local-parts.xml
+++ b/lens-examples/src/main/resources/sales-aggr-fact2-local-parts.xml
@@ -39,4 +39,10 @@
       <part_spec_element key="dt" value="2015-04-13T04:00:00"/>
     </time_partition_spec>
   </partition>
+  <partition fact_or_dimension_table_name="sales_aggr_fact2" location="examples/data/sales_aggr_fact2_local4"
+    update_period="HOURLY">
+    <time_partition_spec>
+      <part_spec_element key="dt" value="2015-04-13T05:00:00"/>
+    </time_partition_spec>
+  </partition>
 </x_partition_list>

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-examples/src/main/resources/sales-aggr-fact2.xml
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/resources/sales-aggr-fact2.xml b/lens-examples/src/main/resources/sales-aggr-fact2.xml
index b535a87..67b7171 100644
--- a/lens-examples/src/main/resources/sales-aggr-fact2.xml
+++ b/lens-examples/src/main/resources/sales-aggr-fact2.xml
@@ -35,6 +35,7 @@
   </columns>
   <properties>
     <property name="cube.fact.is.aggregated" value="true"/>
+    <property name="cube.timedim.relation.order_time" value="delivery_time+[-2 hours,-1hour]" />
   </properties>
   <storage_tables>
     <storage_table>

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-examples/src/main/resources/sales-cube.xml
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/resources/sales-cube.xml b/lens-examples/src/main/resources/sales-cube.xml
index f5e2f93..e44141c 100644
--- a/lens-examples/src/main/resources/sales-cube.xml
+++ b/lens-examples/src/main/resources/sales-cube.xml
@@ -33,6 +33,8 @@
     <measure name="max_line_item_price" type="FLOAT" default_aggr="MAX" display_string="Maximum Line item price"/>
     <measure name="max_line_item_discount" type="FLOAT" default_aggr="MAX"
      display_string="Maximum Line item discount"/>
+    <measure name="rating" type="FLOAT" default_aggr="AVG"
+      display_string="Rating"/>
   </measures>
   <expressions>
     <expression name="profit" type="DOUBLE" display_string="Profit">
@@ -56,19 +58,19 @@
     <dim_attribute name="production_city_id" type="INT" />
     <dim_attribute name="delivery_city_id" type="INT" />
     <dim_attribute name="customer_city_name" type="string" description="City name to which the customer belongs"
-      displayString=" Customer City">
+      display_string="Customer City">
       <ref_spec>
         <chain_ref_column chain_name="customer_city" ref_col="name" />
       </ref_spec>
     </dim_attribute>
     <dim_attribute name="production_city_name" type="STRING" description="City name in which the product was produced"
-      displayString=" Production City">
+      display_string="Production City">
       <ref_spec>
         <chain_ref_column chain_name="production_city" ref_col="name" />
       </ref_spec>
     </dim_attribute>
     <dim_attribute name="delivery_city_name" type="STRING" description="City name to which the product was delivered"
-      displayString=" Delivery City">
+      display_string="Delivery City">
       <ref_spec>
         <chain_ref_column chain_name="delivery_city" ref_col="name" />
       </ref_spec>
@@ -152,5 +154,7 @@
     <property name="cube.sales.timed.dimensions.list" value="order_time,delivery_time" />
     <property name="cube.timedim.partition.order_time" value="ot" />
     <property name="cube.timedim.partition.delivery_time" value="dt" />
+    <property name="cube.timedim.relation.order_time" value="delivery_time+[-20 days,-1 hour]" />
+    <!-- means dt-20days <= ot <= dt-1hour -->
   </properties>
 </x_base_cube>


[2/2] incubator-lens git commit: LENS-198 : Allow timed dimensions of cube to be non-partitioned columns as well (Rajat Khandelwal via amareshwari)

Posted by am...@apache.org.
LENS-198 : Allow timed dimensions of cube to be non-partitioned columns as well (Rajat Khandelwal via amareshwari)


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

Branch: refs/heads/master
Commit: dc1fafa91c8407db8e0f1bfdde24df8f5fec7bce
Parents: 6f8ad21
Author: Rajat Khandelwal <pr...@apache.org>
Authored: Thu May 14 10:09:46 2015 +0530
Committer: Amareshwari Sriramadasu <am...@apache.org>
Committed: Thu May 14 10:09:46 2015 +0530

----------------------------------------------------------------------
 lens-api/src/main/resources/cube-0.1.xsd        |  39 ++-
 .../lens/cube/metadata/CubeMetastoreClient.java |   6 +
 .../lens/cube/metadata/FactPartition.java       |   6 +
 .../lens/cube/metadata/MetastoreConstants.java  |   1 +
 .../lens/cube/metadata/TimePartition.java       |   8 +
 .../lens/cube/metadata/TimePartitionRange.java  |   4 +
 .../cube/metadata/TimePartitionRangeList.java   |  38 +++
 .../metadata/timeline/PartitionTimeline.java    |  16 ++
 .../timeline/RangesPartitionTimeline.java       |  43 ++-
 .../apache/lens/cube/parse/AliasReplacer.java   |   4 +-
 .../apache/lens/cube/parse/CandidateFact.java   |  16 +-
 .../cube/parse/CandidateTablePruneCause.java    |   2 +
 .../lens/cube/parse/CubeQueryContext.java       |  39 ++-
 .../org/apache/lens/cube/parse/DateUtil.java    | 157 ++++++-----
 .../cube/parse/DenormalizationResolver.java     |   6 +-
 .../apache/lens/cube/parse/DimHQLContext.java   |  14 +-
 .../lens/cube/parse/DimOnlyHQLContext.java      |   7 +-
 .../lens/cube/parse/ExpressionResolver.java     |   2 +-
 .../apache/lens/cube/parse/FactHQLContext.java  |   8 -
 .../apache/lens/cube/parse/FieldValidator.java  |   2 +-
 .../apache/lens/cube/parse/JoinResolver.java    |   4 +-
 .../cube/parse/MaxCoveringFactResolver.java     |  70 +++--
 .../PartitionRangesForPartitionColumns.java     |  55 ++++
 .../lens/cube/parse/SingleFactHQLContext.java   |  10 +-
 .../lens/cube/parse/StorageTableResolver.java   | 128 ++++++---
 .../org/apache/lens/cube/parse/TimeRange.java   |  16 ++
 .../lens/cube/parse/TimerangeResolver.java      |   1 -
 .../apache/lens/cube/parse/CubeTestSetup.java   |  62 ++---
 .../lens/cube/parse/TestAggregateResolver.java  |  15 +-
 .../lens/cube/parse/TestBaseCubeQueries.java    |  99 ++++++-
 .../lens/cube/parse/TestCubeRewriter.java       | 264 +++++++++----------
 .../apache/lens/cube/parse/TestDateUtil.java    |  38 +++
 .../cube/parse/TestDenormalizationResolver.java |   8 +-
 .../lens/cube/parse/TestQueryRewrite.java       |  10 +
 .../lens/cube/parse/TestRewriterPlan.java       |  23 +-
 .../lens/cube/parse/TestTimeRangeExtractor.java |  14 +-
 .../lens/examples/PopulateSampleMetastore.java  |   1 -
 .../src/main/resources/cube-queries.sql         |   2 +
 lens-examples/src/main/resources/customer.xml   |   2 +-
 .../resources/sales-aggr-fact2-local-parts.xml  |   6 +
 .../src/main/resources/sales-aggr-fact2.xml     |   1 +
 lens-examples/src/main/resources/sales-cube.xml |  10 +-
 42 files changed, 856 insertions(+), 401 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-api/src/main/resources/cube-0.1.xsd
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/cube-0.1.xsd b/lens-api/src/main/resources/cube-0.1.xsd
index 10b1dfa..06f85ee 100644
--- a/lens-api/src/main/resources/cube-0.1.xsd
+++ b/lens-api/src/main/resources/cube-0.1.xsd
@@ -61,6 +61,39 @@
             1. cube.allfields.queriable - (defaults to true) - If set to true, all the fields (measures, attributes) are
             queryable together. If set to false, there should be derived cubes defined that should group the queriable
             fields together.
+
+            Additional properties:
+
+            1. cube.timedim.relation.{time_dim1}: time_dim2+[timediff1,timediff2]. It's assumed that
+              timediff1 is smaller than timediff2. Means that time_dim1 can be expected to be between
+              [time_dim2+timediff1 and time_dim2+timediff2]. One use case would be the following:
+
+              1.1. if a query is on range of time_dim1 and
+                time_dim1 has no partitioning column in some fact, then partitions for time_dim2 can be looked at.
+                Let's say time_dim2's part col is part_col2, then for a query asking for time_dim1 between [a,b) can
+                be answered by looking at partitions of part_col2 in range [a-timediff2, b-timediff1).
+
+              This property is first looked into fact properties, then cube properties and if that's a derived cube,
+              then next in base cube properties. Wherever found first, that will be considered as the final relation
+              between time dimensions.
+
+              Time dimension relations are transitive, but not reversible. i.e.
+              cube.timedim.relation.time_dim1 = time_dim2 + [a, b]
+              cube.timedim.relation.time_dim2 = time_dim3 + [c, d]
+
+              implies:
+
+              cube.timedim.relation.time_dim1 = time_dim3 + [a+c, b+d]
+
+              but not:
+
+              cube.timedim.relation.time_dim2 = time_dim1 + [-b, -a]
+
+              Reverse relations have to be defined explicitly.
+
+              Timediff syntax is sign, quantity and unit. Spaces in between can be present. e.g. -4 days, +4days, +4 day
+              etc all are valid.
+
           </xs:documentation>
         </xs:annotation>
       </xs:element>
@@ -752,7 +785,7 @@
           </xs:documentation>
         </xs:annotation>
       </xs:element>
-      <xs:element name="skewed_info" type="x_skewed_info">
+      <xs:element name="skewed_info" type="x_skewed_info" maxOccurs="unbounded" minOccurs="0">
         <xs:annotation>
           <xs:documentation>
             Skewed info, if the table is skewed. Expressed as
@@ -1090,8 +1123,8 @@
 
             1. cube.fact.{fact-name}.valid.columns : comma separated column names which are valid in the fact.
             2. cube.fact.is.aggregated : Defaults to true. If the fact is a raw fact, this should be set to false,
-             otherwise true.
-
+              otherwise true.
+            3. cube.timedim.relation.{time_dim1}: See the same property in cube. Fact tables can override the property.
           </xs:documentation>
         </xs:annotation>
       </xs:element>

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 01d76c0..08a63b8 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
@@ -230,6 +230,12 @@ public class CubeMetastoreClient {
       for (Partition partition : getPartitionsByFilter(storageTableName, null)) {
         UpdatePeriod period = deduceUpdatePeriod(partition);
         List<String> values = partition.getValues();
+        if (values.contains(StorageConstants.LATEST_PARTITION_VALUE)) {
+          log.info("dropping latest partition from fact storage table: " + storageTableName
+            + ". Spec: " + partition.getSpec());
+          getClient().dropPartition(storageTableName, values, false);
+          continue;
+        }
         for (int i = 0; i < partCols.size(); i++) {
           if (timeParts.contains(partCols.get(i).getName())) {
             addForBatchAddition(storageTableName, period, partCols.get(i).getName(), values.get(i));

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 8a6dcba..3465513 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
@@ -24,6 +24,8 @@ import java.util.Date;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import org.apache.lens.server.api.error.LensException;
+
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
@@ -160,4 +162,8 @@ public class FactPartition implements Comparable<FactPartition> {
     }
     return colComp;
   }
+
+  public TimePartition getTimePartition() throws LensException {
+    return TimePartition.of(getPeriod(), getPartSpec());
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java
index 74a26fe..1fe55d9 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java
@@ -108,4 +108,5 @@ public final class MetastoreConstants {
   public static final String PARTITION_UPDATE_PERIOD_SFX = ".partition.update.period";
   public static final String PARTITION_UPDATE_PERIOD = "cube.storagetable.partition.update.period";
   public static final String TIMEDIM_TO_PART_MAPPING_PFX = "cube.timedim.partition.";
+  public static final String TIMEDIM_RELATION = "cube.timedim.relation.";
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartition.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartition.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartition.java
index f644c16..7c966d8 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartition.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartition.java
@@ -67,6 +67,10 @@ public class TimePartition implements Comparable<TimePartition>, Named {
     }
   }
 
+  public TimePartition withUpdatePeriod(UpdatePeriod period) throws LensException {
+    return TimePartition.of(period, getDate());
+  }
+
   public String toString() {
     return dateString;
   }
@@ -141,4 +145,8 @@ public class TimePartition implements Comparable<TimePartition>, Named {
   public String getName() {
     return getDateString();
   }
+
+  public TimePartitionRange emptyRange() throws LensException {
+    return this.rangeUpto(this);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRange.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRange.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRange.java
index 1837ae9..e16294e 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRange.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRange.java
@@ -127,4 +127,8 @@ public class TimePartitionRange implements Iterable<TimePartition>, Named {
   public long size() {
     return DateUtil.getTimeDiff(begin.getDate(), end.getDate(), begin.getUpdatePeriod());
   }
+
+  public boolean isValidAndNonEmpty() {
+    return begin.before(end);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRangeList.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRangeList.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRangeList.java
new file mode 100644
index 0000000..9c6759e
--- /dev/null
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/TimePartitionRangeList.java
@@ -0,0 +1,38 @@
+/**
+ * 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.metadata;
+
+import java.util.ArrayList;
+
+public class TimePartitionRangeList extends ArrayList<TimePartitionRange> {
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    String sep = "";
+    for (TimePartitionRange range : this) {
+      sb.append(sep).append(range);
+      sep = "U";
+    }
+    return sb.toString();
+  }
+
+  public TimePartitionRange last() {
+    return get(size() - 1);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/PartitionTimeline.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/PartitionTimeline.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/PartitionTimeline.java
index 8a533fc..d27e43e 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/PartitionTimeline.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/timeline/PartitionTimeline.java
@@ -23,6 +23,7 @@ import java.util.*;
 
 import org.apache.lens.cube.metadata.MetastoreUtil;
 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.server.api.error.LensException;
 
@@ -146,6 +147,21 @@ public abstract class PartitionTimeline implements Iterable<TimePartition> {
     // Can also return the failed to add items.
     return result;
   }
+  /**
+   * Add partition range to the timeline. Default implementation is to iterate over the range and add
+   * each time partition belonging to the given range. Implementing classes can override.
+   *
+   * @param partitionRange
+   * @return whether add was successful
+   * @throws LensException
+   */
+  boolean add(TimePartitionRange partitionRange) throws LensException {
+    boolean ret = true;
+    for (TimePartition part : partitionRange) {
+      ret &= add(part);
+    }
+    return ret;
+  }
 
   /**
    * drop partition.

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 6646718..1b9a44a 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
@@ -21,17 +21,12 @@ package org.apache.lens.cube.metadata.timeline;
 
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 
-import org.apache.lens.cube.metadata.MetastoreUtil;
-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.*;
 import org.apache.lens.server.api.error.LensException;
 
 import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -46,7 +41,7 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class RangesPartitionTimeline extends PartitionTimeline {
-  private List<TimePartitionRange> ranges = Lists.newArrayList();
+  private TimePartitionRangeList ranges = new TimePartitionRangeList();
 
   public RangesPartitionTimeline(String storageTableName, UpdatePeriod updatePeriod,
     String partCol) {
@@ -89,6 +84,37 @@ public class RangesPartitionTimeline extends PartitionTimeline {
     return true;
   }
 
+  @Override
+  public boolean add(TimePartitionRange partitionRange) throws LensException {
+    // Adding partition range to the timeline. Will have to find if any of the sub ranges
+    // intersects. If yes, add only remaining sub ranges, else add the given range as a new sub range.
+    int strictlyAfterIndex = getStrictlyAfterIndex(partitionRange.getBegin());
+    while (strictlyAfterIndex < ranges.size() && partitionRange.isValidAndNonEmpty()) {
+      if (partitionRange.getEnd().before(ranges.get(strictlyAfterIndex).getBegin())) {
+        // partition begin and end both are strictly before ranges[strictlyAfterIndex]. Add as new sub range.
+        ranges.add(strictlyAfterIndex, partitionRange);
+        partitionRange = partitionRange.getEnd().emptyRange();
+        break;
+      } else {
+        // begin is before ranges[strictlyAfterIndex], end is not.
+        // extend ranges[strictlyAfterIndex] and add remaining range, if any.
+        ranges.get(strictlyAfterIndex).setBegin(partitionRange.getBegin());
+        if (ranges.get(strictlyAfterIndex).getEnd().before(partitionRange.getEnd())) {
+          partitionRange = ranges.get(strictlyAfterIndex).getEnd().rangeUpto(partitionRange.getEnd());
+        } else {
+          // No remaining range, end was before ranges[strictlyAfterIndex].end
+          partitionRange = ranges.get(strictlyAfterIndex).getEnd().emptyRange();
+        }
+        strictlyAfterIndex++;
+      }
+    }
+    if (strictlyAfterIndex == ranges.size() && partitionRange.isValidAndNonEmpty()) {
+      ranges.add(partitionRange);
+    }
+    mergeRanges();
+    return true;
+  }
+
   private int getStrictlyAfterIndex(TimePartition part) {
     int start = 0;
     int end = getRanges().size();
@@ -110,6 +136,9 @@ public class RangesPartitionTimeline extends PartitionTimeline {
         TimePartitionRange removed = ranges.remove(i + 1);
         ranges.get(i).setEnd(removed.getEnd());
         i--; // check again at same index
+      } else if (ranges.get(i).isEmpty()) {
+        ranges.remove(i);
+        i--;
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
index a65bc96..9d367c3 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
@@ -136,7 +136,7 @@ class AliasReplacer implements ContextRewriter {
       if (cubeql.getCube() != null) {
         Set<String> cols = cubeql.getCube().getAllFieldNames();
         if (cols.contains(col.toLowerCase())) {
-          colToTableAlias.put(col.toLowerCase(), cubeql.getAliasForTabName(cubeql.getCube().getName()));
+          colToTableAlias.put(col.toLowerCase(), cubeql.getAliasForTableName(cubeql.getCube().getName()));
           cubeql.addColumnsQueried((AbstractCubeTable) cubeql.getCube(), col.toLowerCase());
           inCube = true;
         }
@@ -148,7 +148,7 @@ class AliasReplacer implements ContextRewriter {
             if (prevDim != null && !prevDim.equals(dim.getName())) {
               throw new SemanticException(ErrorMsg.AMBIGOUS_DIM_COLUMN, col, prevDim, dim.getName());
             }
-            colToTableAlias.put(col.toLowerCase(), cubeql.getAliasForTabName(dim.getName()));
+            colToTableAlias.put(col.toLowerCase(), cubeql.getAliasForTableName(dim.getName()));
             cubeql.addColumnsQueried(dim, col.toLowerCase());
           } else {
             // throw error because column is in both cube and dimension table

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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
index 47b9fc1..31eb113 100644
--- 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
@@ -42,6 +42,9 @@ import org.apache.hadoop.hive.ql.session.SessionState;
 
 import org.antlr.runtime.CommonToken;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -57,22 +60,23 @@ public class CandidateFact implements CandidateTable {
   // flag to know if querying multiple storage tables is enabled for this fact
   @Getter
   @Setter
-  private  boolean enabledMultiTableSelect;
+  private boolean enabledMultiTableSelect;
   @Getter
   private int numQueriedParts = 0;
   @Getter
-  private final Set<FactPartition> partsQueried = new HashSet<FactPartition>();
+  private final Set<FactPartition> partsQueried = Sets.newHashSet();
   @Getter
-  private final Map<TimeRange, String> rangeToWhereClause = new HashMap<TimeRange, String>();
+  private final Map<TimeRange, String> rangeToWhereClause = Maps.newHashMap();
+
   private boolean dbResolved = false;
   private CubeInterface baseTable;
   private ASTNode selectAST;
   private ASTNode whereAST;
   private ASTNode groupbyAST;
   private ASTNode havingAST;
-  private List<TimeRangeNode> timenodes = new ArrayList<TimeRangeNode>();
-  private final List<Integer> selectIndices = new ArrayList<Integer>();
-  private final List<Integer> dimFieldIndices = new ArrayList<Integer>();
+  private List<TimeRangeNode> timenodes = Lists.newArrayList();
+  private final List<Integer> selectIndices = Lists.newArrayList();
+  private final List<Integer> dimFieldIndices = Lists.newArrayList();
   private Collection<String> columns;
 
   CandidateFact(CubeFactTable fact, CubeInterface cube) {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 165525d..a1fea16 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
@@ -36,6 +36,8 @@ import lombok.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.

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 b7c3ee9..230a2ee 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
@@ -40,6 +40,7 @@ import org.apache.hadoop.hive.ql.parse.*;
 
 import org.codehaus.jackson.map.ObjectMapper;
 
+import com.google.common.collect.Sets;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
@@ -310,6 +311,21 @@ public class CubeQueryContext {
     return autoJoinCtx != null && autoJoinCtx.isJoinsResolved();
   }
 
+  public Cube getBaseCube() {
+    if (cube instanceof Cube) {
+      return (Cube) cube;
+    }
+    return ((DerivedCube) cube).getParent();
+  }
+
+  public Set<String> getPartitionColumnsQueried() {
+    Set<String> partsQueried = Sets.newHashSet();
+    for (TimeRange range : getTimeRanges()) {
+      partsQueried.add(range.getPartitionColumn());
+    }
+    return partsQueried;
+  }
+
   // Holds the context of optional dimension
   // A dimension is optional if it is not queried directly by the user, but is
   // required by a candidate table to get a denormalized field from reference
@@ -384,20 +400,24 @@ public class CubeQueryContext {
     dimMsgs.addPruningMsg(dimtable, msg);
   }
 
-  public String getAliasForTabName(String tabName) {
+  public String getAliasForTableName(Named named) {
+    return getAliasForTableName(named.getName());
+  }
+
+  public String getAliasForTableName(String tableName) {
     for (String alias : qb.getTabAliases()) {
       String table = qb.getTabNameForAlias(alias);
-      if (table != null && table.equalsIgnoreCase(tabName)) {
+      if (table != null && table.equalsIgnoreCase(tableName)) {
         return alias;
       }
     }
     // get alias from cubeTbls
     for (Map.Entry<String, AbstractCubeTable> cubeTblEntry : cubeTbls.entrySet()) {
-      if (cubeTblEntry.getValue().getName().equalsIgnoreCase(tabName)) {
+      if (cubeTblEntry.getValue().getName().equalsIgnoreCase(tableName)) {
         return cubeTblEntry.getKey();
       }
     }
-    return tabName;
+    return tableName;
   }
 
   public void print() {
@@ -581,13 +601,13 @@ public class CubeQueryContext {
     String fromString = null;
     if (getJoinTree() == null) {
       if (cube != null) {
-        fromString = fact.getStorageString(getAliasForTabName(cube.getName()));
+        fromString = fact.getStorageString(getAliasForTableName(cube.getName()));
       } else {
         if (dimensions.size() != 1) {
           throw new SemanticException(ErrorMsg.NO_JOIN_CONDITION_AVAIABLE);
         }
         Dimension dim = dimensions.iterator().next();
-        fromString = dimsToQuery.get(dim).getStorageString(getAliasForTabName(dim.getName()));
+        fromString = dimsToQuery.get(dim).getStorageString(getAliasForTableName(dim.getName()));
       }
     } else {
       StringBuilder builder = new StringBuilder();
@@ -843,11 +863,11 @@ public class CubeQueryContext {
   }
 
   public Set<String> getColumnsQueried(String tblName) {
-    return tblAliasToColumns.get(getAliasForTabName(tblName));
+    return tblAliasToColumns.get(getAliasForTableName(tblName));
   }
 
   public void addColumnsQueried(AbstractCubeTable table, String column) {
-    addColumnsQueried(getAliasForTabName(table.getName()), column);
+    addColumnsQueried(getAliasForTableName(table.getName()), column);
   }
 
   public void addColumnsQueried(String alias, String column) {
@@ -876,7 +896,8 @@ public class CubeQueryContext {
     } else {
       String cubeName = split[0].trim();
       String colName = split[1].trim();
-      if (cubeName.equalsIgnoreCase(cube.getName()) || cubeName.equalsIgnoreCase(getAliasForTabName(cube.getName()))) {
+      if (cubeName.equalsIgnoreCase(cube.getName())
+        || cubeName.equalsIgnoreCase(getAliasForTableName(cube.getName()))) {
         return cube.getMeasureNames().contains(colName.toLowerCase());
       } else {
         return false;

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 82c43a7..b11de10 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
@@ -18,6 +18,8 @@
  */
 package org.apache.lens.cube.parse;
 
+import static java.util.Calendar.*;
+
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -36,6 +38,7 @@ import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.apache.log4j.Logger;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 public final class DateUtil {
   private DateUtil() {
@@ -76,6 +79,7 @@ public final class DateUtil {
   public static final String MINUTE_FMT = HOUR_FMT + ":[0-9]{2}";
   public static final String SECOND_FMT = MINUTE_FMT + ":[0-9]{2}";
   public static final String ABSDATE_FMT = "yyyy-MM-dd-HH:mm:ss,SSS";
+  public static final String HIVE_QUERY_DATE_FMT = "yyyy-MM-dd HH:mm:ss";
 
   public static final ThreadLocal<DateFormat> ABSDATE_PARSER =
     new ThreadLocal<DateFormat>() {
@@ -84,6 +88,13 @@ public final class DateUtil {
         return new SimpleDateFormat(ABSDATE_FMT);
       }
     };
+  public static final ThreadLocal<DateFormat> HIVE_QUERY_DATE_PARSER =
+    new ThreadLocal<DateFormat>() {
+      @Override
+      protected SimpleDateFormat initialValue() {
+        return new SimpleDateFormat(HIVE_QUERY_DATE_FMT);
+      }
+    };
 
   public static String formatDate(Date dt) {
     return ABSDATE_PARSER.get().format(dt);
@@ -141,14 +152,14 @@ public final class DateUtil {
       if (granularityMatcher.find()) {
         String unit = granularityMatcher.group().toLowerCase();
         if ("year".equals(unit)) {
-          calendar = DateUtils.truncate(calendar, Calendar.YEAR);
+          calendar = DateUtils.truncate(calendar, YEAR);
         } else if ("month".equals(unit)) {
-          calendar = DateUtils.truncate(calendar, Calendar.MONTH);
+          calendar = DateUtils.truncate(calendar, MONTH);
         } else if ("week".equals(unit)) {
           calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
-          calendar = DateUtils.truncate(calendar, Calendar.DAY_OF_MONTH);
+          calendar = DateUtils.truncate(calendar, DAY_OF_MONTH);
         } else if ("day".equals(unit)) {
-          calendar = DateUtils.truncate(calendar, Calendar.DAY_OF_MONTH);
+          calendar = DateUtils.truncate(calendar, DAY_OF_MONTH);
         } else if ("hour".equals(unit)) {
           calendar = DateUtils.truncate(calendar, Calendar.HOUR_OF_DAY);
         } else if ("minute".equals(unit)) {
@@ -162,50 +173,9 @@ public final class DateUtil {
     }
 
     // Get rid of 'now' part and whitespace
-    String raw = str.replaceAll(GRANULARITY, "").replace(WSPACE, "");
-
-    if (raw.isEmpty()) { // String is just "now" with granularity
-      return calendar.getTime();
-    }
-
-    // Get the relative diff part to get eventual date based on now.
-    Matcher qtyMatcher = P_QUANTITY.matcher(raw);
-    int qty = 1;
-    if (qtyMatcher.find()) {
-      qty = Integer.parseInt(qtyMatcher.group());
-    }
-
-    Matcher signageMatcher = P_SIGNAGE.matcher(raw);
-    if (signageMatcher.find()) {
-      String sign = signageMatcher.group();
-      if ("-".equals(sign)) {
-        qty = -qty;
-      }
-    }
-
-    Matcher unitMatcher = P_UNIT.matcher(raw);
-    if (unitMatcher.find()) {
-      String unit = unitMatcher.group().toLowerCase();
-      if ("year".equals(unit)) {
-        calendar.add(Calendar.YEAR, qty);
-      } else if ("month".equals(unit)) {
-        calendar.add(Calendar.MONTH, qty);
-      } else if ("week".equals(unit)) {
-        calendar.add(Calendar.DAY_OF_MONTH, 7 * qty);
-      } else if ("day".equals(unit)) {
-        calendar.add(Calendar.DAY_OF_MONTH, qty);
-      } else if ("hour".equals(unit)) {
-        calendar.add(Calendar.HOUR_OF_DAY, qty);
-      } else if ("minute".equals(unit)) {
-        calendar.add(Calendar.MINUTE, qty);
-      } else if ("second".equals(unit)) {
-        calendar.add(Calendar.SECOND, qty);
-      } else {
-        throw new SemanticException(ErrorMsg.INVALID_TIME_UNIT, unit);
-      }
-    }
-
-    return calendar.getTime();
+    String diffStr = str.replaceAll(RELATIVE, "").replace(WSPACE, "");
+    TimeDiff diff = TimeDiff.parseFrom(diffStr);
+    return diff.offsetFrom(calendar.getTime());
   }
 
   public static Date getCeilDate(Date fromDate, UpdatePeriod interval) {
@@ -214,12 +184,12 @@ public final class DateUtil {
     boolean hasFraction = false;
     switch (interval) {
     case YEARLY:
-      if (cal.get(Calendar.MONTH) != 0) {
+      if (cal.get(MONTH) != 0) {
         hasFraction = true;
         break;
       }
     case MONTHLY:
-      if (cal.get(Calendar.DAY_OF_MONTH) != 1) {
+      if (cal.get(DAY_OF_MONTH) != 1) {
         hasFraction = true;
         break;
       }
@@ -263,9 +233,9 @@ public final class DateUtil {
     cal.setTime(toDate);
     switch (interval) {
     case YEARLY:
-      cal.set(Calendar.MONTH, 0);
+      cal.set(MONTH, 0);
     case MONTHLY:
-      cal.set(Calendar.DAY_OF_MONTH, 1);
+      cal.set(DAY_OF_MONTH, 1);
     case DAILY:
       cal.set(Calendar.HOUR_OF_DAY, 0);
     case HOURLY:
@@ -289,20 +259,20 @@ public final class DateUtil {
   public static int getNumberofDaysInMonth(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
-    return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+    return calendar.getActualMaximum(DAY_OF_MONTH);
   }
 
   public static CoveringInfo getMonthlyCoveringInfo(Date from, Date to) {
     // Move 'from' to end of month, unless its the first day of month
     boolean coverable = true;
-    if (!from.equals(DateUtils.truncate(from, Calendar.MONTH))) {
-      from = DateUtils.addMonths(DateUtils.truncate(from, Calendar.MONTH), 1);
+    if (!from.equals(DateUtils.truncate(from, MONTH))) {
+      from = DateUtils.addMonths(DateUtils.truncate(from, MONTH), 1);
       coverable = false;
     }
 
     // Move 'to' to beginning of next month, unless its the first day of the month
-    if (!to.equals(DateUtils.truncate(to, Calendar.MONTH))) {
-      to = DateUtils.truncate(to, Calendar.MONTH);
+    if (!to.equals(DateUtils.truncate(to, MONTH))) {
+      to = DateUtils.truncate(to, MONTH);
       coverable = false;
     }
 
@@ -320,13 +290,13 @@ public final class DateUtil {
       return new CoveringInfo(0, false);
     }
     boolean coverable = monthlyCoveringInfo.isCoverable();
-    if (!from.equals(DateUtils.truncate(from, Calendar.MONTH))) {
-      from = DateUtils.addMonths(DateUtils.truncate(from, Calendar.MONTH), 1);
+    if (!from.equals(DateUtils.truncate(from, MONTH))) {
+      from = DateUtils.addMonths(DateUtils.truncate(from, MONTH), 1);
       coverable = false;
     }
     Calendar cal = Calendar.getInstance();
     cal.setTime(from);
-    int fromMonth = cal.get(Calendar.MONTH);
+    int fromMonth = cal.get(MONTH);
 
     // Get the start date of the quarter
     int beginOffset = (3 - fromMonth % 3) % 3;
@@ -344,13 +314,13 @@ public final class DateUtil {
       return new CoveringInfo(0, false);
     }
     boolean coverable = monthlyCoveringInfo.isCoverable();
-    if (!from.equals(DateUtils.truncate(from, Calendar.MONTH))) {
-      from = DateUtils.addMonths(DateUtils.truncate(from, Calendar.MONTH), 1);
+    if (!from.equals(DateUtils.truncate(from, MONTH))) {
+      from = DateUtils.addMonths(DateUtils.truncate(from, MONTH), 1);
       coverable = false;
     }
     Calendar cal = Calendar.getInstance();
     cal.setTime(from);
-    int fromMonth = cal.get(Calendar.MONTH);
+    int fromMonth = cal.get(MONTH);
     int beginOffset = (12 - fromMonth % 12) % 12;
     int endOffset = (monthlyCoveringInfo.getCountBetween() - beginOffset) % 12;
     if (beginOffset > 0 || endOffset > 0) {
@@ -375,10 +345,10 @@ public final class DateUtil {
     cal.setTime(from);
     int fromWeek = cal.get(Calendar.WEEK_OF_YEAR);
     int fromDay = cal.get(Calendar.DAY_OF_WEEK);
-    int fromYear = cal.get(Calendar.YEAR);
+    int fromYear = cal.get(YEAR);
 
     cal.clear();
-    cal.set(Calendar.YEAR, fromYear);
+    cal.set(YEAR, fromYear);
     cal.set(Calendar.WEEK_OF_YEAR, fromWeek);
     cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
     int maxDayInWeek = cal.getActualMaximum(Calendar.DAY_OF_WEEK);
@@ -444,4 +414,61 @@ public final class DateUtil {
       this.coverable = coverable;
     }
   }
+  @EqualsAndHashCode
+  static class TimeDiff{
+    int quantity;
+    int calendarField;
+
+    public TimeDiff(int quantity, int calendarField) {
+      this.quantity = quantity;
+      this.calendarField = calendarField;
+    }
+
+    static TimeDiff parseFrom(String diffStr) throws SemanticException {
+      // Get the relative diff part to get eventual date based on now.
+      Matcher qtyMatcher = P_QUANTITY.matcher(diffStr);
+      int qty = 1;
+      if (qtyMatcher.find()) {
+        qty = Integer.parseInt(qtyMatcher.group());
+      }
+
+      Matcher signageMatcher = P_SIGNAGE.matcher(diffStr);
+      if (signageMatcher.find()) {
+        String sign = signageMatcher.group();
+        if ("-".equals(sign)) {
+          qty = -qty;
+        }
+      }
+
+      Matcher unitMatcher = P_UNIT.matcher(diffStr);
+      if (unitMatcher.find()) {
+        String unit = unitMatcher.group().toLowerCase();
+        if ("year".equals(unit)) {
+          return new TimeDiff(qty, YEAR);
+        } else if ("month".equals(unit)) {
+          return new TimeDiff(qty, MONTH);
+        } else if ("week".equals(unit)) {
+          return new TimeDiff(7 * qty, DAY_OF_MONTH);
+        } else if ("day".equals(unit)) {
+          return new TimeDiff(qty, DAY_OF_MONTH);
+        } else if ("hour".equals(unit)) {
+          return new TimeDiff(qty, HOUR_OF_DAY);
+        } else if ("minute".equals(unit)) {
+          return new TimeDiff(qty, MINUTE);
+        } else if ("second".equals(unit)) {
+          return new TimeDiff(qty, SECOND);
+        } else {
+          throw new SemanticException(ErrorMsg.INVALID_TIME_UNIT, unit);
+        }
+      }
+      return new TimeDiff(0, SECOND);
+    }
+
+    public Date offsetFrom(Date time) {
+      return DateUtils.add(time, calendarField, quantity);
+    }
+    public Date negativeOffsetFrom(Date time) {
+      return DateUtils.add(time, calendarField, -quantity);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 f5d2115..7857868 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
@@ -249,12 +249,12 @@ public class DenormalizationResolver implements ContextRewriter {
               throw new SemanticException("No reference column available for " + refered);
             }
             PickedReference picked = new PickedReference(refered.references.iterator().next(),
-              cubeql.getAliasForTabName(refered.srcTable.getName()), tbl);
+              cubeql.getAliasForTableName(refered.srcTable.getName()), tbl);
             addPickedReference(refered.col.getName(), picked);
             pickedRefs.add(picked);
           } else {
             PickedReference picked =
-              new PickedReference(refered.col, cubeql.getAliasForTabName(refered.srcTable.getName()), tbl);
+              new PickedReference(refered.col, cubeql.getAliasForTableName(refered.srcTable.getName()), tbl);
             addPickedReference(refered.col.getName(), picked);
             pickedRefs.add(picked);
           }
@@ -300,7 +300,7 @@ public class DenormalizationResolver implements ContextRewriter {
           return;
         }
         ASTNode newTableNode =
-          new ASTNode(new CommonToken(HiveParser.Identifier, query.getAliasForTabName(refered.getDestTable())));
+          new ASTNode(new CommonToken(HiveParser.Identifier, query.getAliasForTableName(refered.getDestTable())));
         tableNode.setChild(0, newTableNode);
         newTableNode.setParent(tableNode);
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/DimHQLContext.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/DimHQLContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/DimHQLContext.java
index e200b12..ea461ad 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/DimHQLContext.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/DimHQLContext.java
@@ -62,13 +62,16 @@ abstract class DimHQLContext extends SimpleHQLContext {
   protected void setMissingExpressions() throws SemanticException {
     setFrom(getFromString());
     setWhere(joinWithAnd(
-      getQuery().getConf().getBoolean(
+      genWhereClauseWithDimPartitions(where), getQuery().getConf().getBoolean(
         CubeQueryConfUtil.REPLACE_TIMEDIM_WITH_PART_COL, CubeQueryConfUtil.DEFAULT_REPLACE_TIMEDIM_WITH_PART_COL)
-        ? getPostSelectionWhereClause() : null,
-      genWhereClauseWithDimPartitions(where)));
+        ? getPostSelectionWhereClause() : null));
   }
 
-  protected abstract String getPostSelectionWhereClause() throws SemanticException;
+  protected String getPostSelectionWhereClause() throws SemanticException {
+    return null;
+  }
+
+
 
   protected String getFromString() throws SemanticException {
     String fromString = getFromTable();
@@ -103,7 +106,8 @@ abstract class DimHQLContext extends SimpleHQLContext {
       for (Dimension dim : queriedDims) {
         CandidateDim cdim = dimsToQuery.get(dim);
         if (!cdim.isWhereClauseAdded() && !StringUtils.isBlank(cdim.getWhereClause())) {
-          appendWhereClause(whereBuf, StorageUtil.getWhereClause(cdim, query.getAliasForTabName(dim.getName())), added);
+          appendWhereClause(whereBuf, StorageUtil.getWhereClause(cdim, query.getAliasForTableName(dim.getName())),
+            added);
           added = true;
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/DimOnlyHQLContext.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/DimOnlyHQLContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/DimOnlyHQLContext.java
index 8a23ded..785b0e4 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/DimOnlyHQLContext.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/DimOnlyHQLContext.java
@@ -50,18 +50,13 @@ class DimOnlyHQLContext extends DimHQLContext {
   protected String getFromTable() throws SemanticException {
     if (query.getAutoJoinCtx() != null && query.getAutoJoinCtx().isJoinsResolved()) {
       return getDimsToQuery().get(query.getAutoJoinCtx().getAutoJoinTarget()).getStorageString(
-        query.getAliasForTabName(query.getAutoJoinCtx().getAutoJoinTarget().getName()));
+        query.getAliasForTableName(query.getAutoJoinCtx().getAutoJoinTarget().getName()));
     } else {
       return query.getQBFromString(null, getDimsToQuery());
     }
   }
 
   @Override
-  protected String getPostSelectionWhereClause() throws SemanticException {
-    return null;
-  }
-
-  @Override
   protected Set<Dimension> getQueriedDimSet() {
     return getDimsToQuery().keySet();
   }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 c81cf34..5355049 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
@@ -156,7 +156,7 @@ class ExpressionResolver implements ContextRewriter {
           ASTNode current = (ASTNode) node.getChild(0);
           if (current.getToken().getType() == Identifier) {
             String tableName = current.getToken().getText().toLowerCase();
-            String alias = cubeql.getAliasForTabName(tableName);
+            String alias = cubeql.getAliasForTableName(tableName);
             if (!alias.equalsIgnoreCase(tableName)) {
               node.setChild(0, new ASTNode(new CommonToken(HiveParser.Identifier, alias)));
             }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/FactHQLContext.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/FactHQLContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/FactHQLContext.java
index 766769f..4bd89a7 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/FactHQLContext.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/FactHQLContext.java
@@ -47,14 +47,6 @@ public class FactHQLContext extends DimHQLContext {
   }
 
   @Override
-  protected String getPostSelectionWhereClause() throws SemanticException {
-    return StorageUtil.getNotLatestClauseForDimensions(
-      query.getAliasForTabName(query.getCube().getName()),
-      fact.getTimePartCols(query),
-      query.getTimeRanges().iterator().next().getPartitionColumn());
-  }
-
-  @Override
   protected Set<Dimension> getQueriedDimSet() {
     return factDims;
   }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
index ddabc25..ffe6ebd 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
@@ -127,7 +127,7 @@ public class FieldValidator implements ContextRewriter {
             // this 'tabName' is a join chain, so add all source columns
             chainSourceColumns.addAll(cubeql.getJoinchains().get(tabName).getSourceColumns());
             nonQueryableColumns.add(tabName + "." + colName);
-          } else if (tabName.equalsIgnoreCase(cubeql.getAliasForTabName(cube.getName()))
+          } else if (tabName.equalsIgnoreCase(cubeql.getAliasForTableName(cube.getName()))
             && cube.getDimAttributeNames().contains(colName)) {
             // Alternatively, check if this is a dimension attribute, if yes add it to the dim attribute set
             // and non queryable fields set

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinResolver.java
index a41424a..3e3534c 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/JoinResolver.java
@@ -149,7 +149,7 @@ class JoinResolver implements ContextRewriter {
         }
       }
       if (root.getSubtrees().size() > 0) {
-        root.setAlias(cubeql.getAliasForTabName(
+        root.setAlias(cubeql.getAliasForTableName(
           root.getSubtrees().keySet().iterator().next().getFromTable().getName()));
       }
       return root;
@@ -194,7 +194,7 @@ class JoinResolver implements ContextRewriter {
         // And for destination tables, an alias will be decided from here but might be
         // overridden outside this function.
         AbstractCubeTable destTable = tableRelationship.getToTable();
-        current.setAlias(cubeql.getAliasForTabName(destTable.getName()));
+        current.setAlias(cubeql.getAliasForTableName(destTable.getName()));
         if (aliasUsage.get(current.getAlias()) == null) {
           aliasUsage.put(current.getAlias(), 0);
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 fcc6114..9a92bee 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
@@ -24,8 +24,6 @@ import java.util.Map;
 import java.util.Set;
 
 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.lens.server.api.error.LensException;
@@ -56,26 +54,52 @@ class MaxCoveringFactResolver implements ContextRewriter {
       // 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));
+    if (cubeql.getCube() == null || cubeql.getCandidateFactSets().size() <= 1) {
+      // nothing to prune.
+      return;
+    }
+    // For each part column, which candidate fact sets are covering how much amount.
+    // Later, we'll maximize coverage for each queried part column.
+    Map<String, Map<Set<CandidateFact>, Long>> partCountsPerPartCol = Maps.newHashMap();
+    for (Set<CandidateFact> facts : cubeql.getCandidateFactSets()) {
+      for (Map.Entry<String, Long> entry : getTimeCoveredForEachPartCol(facts).entrySet()) {
+        if (!partCountsPerPartCol.containsKey(entry.getKey())) {
+          partCountsPerPartCol.put(entry.getKey(), Maps.<Set<CandidateFact>, Long>newHashMap());
+        }
+        partCountsPerPartCol.get(entry.getKey()).put(facts, entry.getValue());
       }
-      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();
+    }
+    // for each queried partition, prune fact sets that are covering less range than max
+    for (String partColQueried : cubeql.getPartitionColumnsQueried()) {
+      if (partCountsPerPartCol.get(partColQueried) != null) {
+        long maxTimeCovered = Collections.max(partCountsPerPartCol.get(partColQueried).values());
+        TimeCovered timeCovered = new TimeCovered(maxTimeCovered);
+        Iterator<Set<CandidateFact>> iter = cubeql.getCandidateFactSets().iterator();
+        while (iter.hasNext()) {
+          Set<CandidateFact> facts = iter.next();
+          Long timeCoveredLong = partCountsPerPartCol.get(partColQueried).get(facts);
+          if (timeCoveredLong == null) {
+            timeCoveredLong = 0L;
+          }
+          if (timeCoveredLong < maxTimeCovered) {
+            LOG.info(
+              "Not considering facts:" + facts + " from candidate fact tables as it covers less time than the max"
+                + " for partition column: " + partColQueried + " which is: " + timeCovered);
+            iter.remove();
+          }
         }
       }
-      cubeql.pruneCandidateFactWithCandidateSet(CandidateTablePruneCause.lessData(timeCovered));
     }
+    cubeql.pruneCandidateFactWithCandidateSet(CandidateTablePruneCause.lessData(null));
   }
 
-  private long getTimeCovered(Set<CandidateFact> facts) {
+  /**
+   * Returns time covered by fact set for each part column.
+   * @param facts
+   * @return
+   */
+  private Map<String, Long> getTimeCoveredForEachPartCol(Set<CandidateFact> facts) {
+    Map<String, Long> ret = Maps.newHashMap();
     UpdatePeriod smallest = UpdatePeriod.values()[UpdatePeriod.values().length - 1];
     for (CandidateFact fact : facts) {
       for (FactPartition part : fact.getPartsQueried()) {
@@ -84,24 +108,22 @@ class MaxCoveringFactResolver implements ContextRewriter {
         }
       }
     }
-    RangesPartitionTimeline range = new RangesPartitionTimeline(null, smallest, null);
+    PartitionRangesForPartitionColumns partitionRangesForPartitionColumns = new PartitionRangesForPartitionColumns();
     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);
-            }
+            partitionRangesForPartitionColumns.add(part);
           } catch (LensException e) {
             LOG.error("invalid partition: " + e);
           }
         }
       }
     }
-    return range.getTimeCovered();
+    for (Map.Entry<String, RangesPartitionTimeline> entry : partitionRangesForPartitionColumns.entrySet()) {
+      ret.put(entry.getKey(), entry.getValue().getTimeCovered());
+    }
+    return ret;
   }
 
   public static class TimeCovered {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/PartitionRangesForPartitionColumns.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/PartitionRangesForPartitionColumns.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/PartitionRangesForPartitionColumns.java
new file mode 100644
index 0000000..b389a8f
--- /dev/null
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/PartitionRangesForPartitionColumns.java
@@ -0,0 +1,55 @@
+/**
+ * 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.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.lens.cube.metadata.FactPartition;
+import org.apache.lens.cube.metadata.TimePartition;
+import org.apache.lens.cube.metadata.UpdatePeriod;
+import org.apache.lens.cube.metadata.timeline.RangesPartitionTimeline;
+import org.apache.lens.server.api.error.LensException;
+
+import com.google.common.collect.Sets;
+
+
+public class PartitionRangesForPartitionColumns extends HashMap<String, RangesPartitionTimeline> {
+
+  public void add(String partCol, TimePartition partition) throws LensException {
+    if (get(partCol) == null) {
+      put(partCol, new RangesPartitionTimeline("", UpdatePeriod.values()[0], partCol));
+    }
+    get(partCol).add(partition.withUpdatePeriod(UpdatePeriod.values()[0])
+      .rangeUpto(partition.next().withUpdatePeriod(UpdatePeriod.values()[0])));
+  }
+
+  public Set<String> toSet() {
+    Set<String> ret = Sets.newHashSet();
+    for (Map.Entry<String, RangesPartitionTimeline> entry : entrySet()) {
+      ret.add(entry.getKey() + ":" + entry.getValue().getRanges());
+    }
+    return ret;
+  }
+
+  public void add(FactPartition part) throws LensException {
+    add(part.getPartCol(), part.getTimePartition());
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactHQLContext.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactHQLContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactHQLContext.java
index beaa551..e14fcfa 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactHQLContext.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/SingleFactHQLContext.java
@@ -91,17 +91,9 @@ class SingleFactHQLContext extends DimOnlyHQLContext {
     return queryFormat.toString();
   }
 
-  @Override
-  protected String getPostSelectionWhereClause() throws SemanticException {
-    return StorageUtil.getNotLatestClauseForDimensions(
-      query.getAliasForTabName(query.getCube().getName()),
-      fact.getTimePartCols(query),
-      query.getTimeRanges().iterator().next().getPartitionColumn());
-  }
-
   protected String getFromTable() throws SemanticException {
     if (getQuery().getAutoJoinCtx() != null && getQuery().getAutoJoinCtx().isJoinsResolved()) {
-      return fact.getStorageString(getQuery().getAliasForTabName(getQuery().getCube().getName()));
+      return fact.getStorageString(getQuery().getAliasForTableName(getQuery().getCube().getName()));
     } else {
       return getQuery().getQBFromString(fact, getDimsToQuery());
     }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 e5a6b32..bdc9855 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
@@ -18,13 +18,17 @@
  */
 package org.apache.lens.cube.parse;
 
+import static org.apache.lens.cube.parse.DateUtil.WSPACE;
+import static org.apache.lens.cube.parse.StorageUtil.joinWithAnd;
+
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.lens.cube.metadata.*;
-import org.apache.lens.cube.metadata.timeline.RangesPartitionTimeline;
 import org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode;
 import org.apache.lens.cube.parse.CandidateTablePruneCause.SkipStorageCause;
 import org.apache.lens.cube.parse.CandidateTablePruneCause.SkipStorageCode;
@@ -39,8 +43,7 @@ import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.apache.hadoop.util.ReflectionUtils;
 
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
+import com.google.common.collect.Lists;
 
 /**
  * Resolve storages and partitions of all candidate tables and prunes candidate tables with missing storages or
@@ -309,6 +312,43 @@ class StorageTableResolver implements ContextRewriter {
     return tableName;
   }
 
+  private TimeRange getFallbackRange(TimeRange range, CandidateFact cfact, CubeQueryContext cubeql)
+    throws SemanticException {
+    Cube baseCube = cubeql.getBaseCube();
+    try {
+      ArrayList<String> tableNames = Lists.newArrayList(cfact.fact.getName(), cubeql.getCube().getName());
+      if (!cubeql.getCube().getName().equals(baseCube.getName())) {
+        tableNames.add(baseCube.getName());
+      }
+      String fallBackString = null;
+      String timedim = baseCube.getTimeDimOfPartitionColumn(range.getPartitionColumn());
+      for (String tableName : tableNames) {
+        fallBackString = cubeql.getMetastoreClient().getTable(tableName).getParameters()
+          .get(MetastoreConstants.TIMEDIM_RELATION + timedim);
+        if (StringUtils.isNotBlank(fallBackString)) {
+          break;
+        }
+      }
+      if (StringUtils.isBlank(fallBackString)) {
+        return null;
+      }
+      Matcher matcher = Pattern.compile("(.*?)\\+\\[(.*?),(.*?)\\]").matcher(fallBackString.replaceAll(WSPACE, ""));
+      if (!matcher.matches()) {
+        return null;
+      }
+      DateUtil.TimeDiff diff1 = DateUtil.TimeDiff.parseFrom(matcher.group(2).trim());
+      DateUtil.TimeDiff diff2 = DateUtil.TimeDiff.parseFrom(matcher.group(3).trim());
+      String relatedTimeDim = matcher.group(1).trim();
+      String fallbackPartCol = baseCube.getPartitionColumnOfTimeDim(relatedTimeDim);
+      return TimeRange.getBuilder()
+        .fromDate(diff2.negativeOffsetFrom(range.getFromDate()))
+        .toDate(diff1.negativeOffsetFrom(range.getToDate()))
+        .partitionColumn(fallbackPartCol).build();
+    } catch (HiveException e) {
+      throw new SemanticException(e);
+    }
+  }
+
   private void resolveFactStoragePartitions(CubeQueryContext cubeql) throws SemanticException {
     // Find candidate tables wrt supported storages
     Iterator<CandidateFact> i = cubeql.getCandidateFactTables().iterator();
@@ -316,29 +356,49 @@ class StorageTableResolver implements ContextRewriter {
       CandidateFact cfact = i.next();
       List<FactPartition> answeringParts = new ArrayList<FactPartition>();
       HashMap<String, SkipStorageCause> skipStorageCauses = new HashMap<String, SkipStorageCause>();
-      Map<UpdatePeriod, RangesPartitionTimeline> missingPartitionRanges = Maps.newHashMap();
+      PartitionRangesForPartitionColumns missingParts = new PartitionRangesForPartitionColumns();
       boolean noPartsForRange = false;
       for (TimeRange range : cubeql.getTimeRanges()) {
-        Set<FactPartition> rangeParts = getPartitions(cfact.fact, range, skipStorageCauses, missingPartitionRanges);
-        if (rangeParts == null || rangeParts.isEmpty()) {
-          LOG.info("No partitions for range:" + range);
+        StringBuilder extraWhereClause = new StringBuilder();
+        Set<FactPartition> rangeParts = getPartitions(cfact.fact, range, skipStorageCauses, missingParts);
+        // If no partitions were found, then we'll fallback.
+        String partcol = range.getPartitionColumn();
+        TimeRange prevRange = range;
+        String sep = "";
+        while (rangeParts.isEmpty()) {
+          // TODO: should we add a condition whether on range's partcol any missing partitions are not there
+          String timeDim = cubeql.getBaseCube().getTimeDimOfPartitionColumn(partcol);
+          if (!cfact.getColumns().contains(timeDim)) {
+            break;
+          }
+          TimeRange fallBackRange = getFallbackRange(prevRange, cfact, cubeql);
+          LOG.info("No partitions for range:" + range + ". fallback range: " + fallBackRange);
+          if (fallBackRange == null) {
+            break;
+          }
+          rangeParts = getPartitions(cfact.fact, fallBackRange, skipStorageCauses, missingParts);
+          extraWhereClause.append(sep)
+            .append(prevRange.toTimeDimWhereClause(cubeql.getAliasForTableName(cubeql.getCube()), timeDim));
+          sep = " AND ";
+          partcol = fallBackRange.getPartitionColumn();
+          prevRange = fallBackRange;
+          if (!rangeParts.isEmpty()) {
+            break;
+          }
+        }
+        if (rangeParts.isEmpty()) {
+          LOG.info("No partitions for fallback range:" + range);
           noPartsForRange = true;
           continue;
         }
         cfact.incrementPartsQueried(rangeParts.size());
         answeringParts.addAll(rangeParts);
         cfact.getPartsQueried().addAll(rangeParts);
-        cfact.getRangeToWhereClause().put(range, rangeWriter.getTimeRangeWhereClause(cubeql,
-          cubeql.getAliasForTabName(cubeql.getCube().getName()), rangeParts));
-      }
-      Set<String> nonExistingParts = Sets.newHashSet();
-      if (!missingPartitionRanges.isEmpty()) {
-        for (UpdatePeriod period : missingPartitionRanges.keySet()) {
-          for (TimePartitionRange range : missingPartitionRanges.get(period).getRanges()) {
-            nonExistingParts.add(range.toString());
-          }
-        }
+        String rangeWhereClause = rangeWriter.getTimeRangeWhereClause(cubeql,
+          cubeql.getAliasForTableName(cubeql.getCube().getName()), rangeParts);
+        cfact.getRangeToWhereClause().put(range, joinWithAnd(rangeWhereClause, extraWhereClause.toString()));
       }
+      Set<String> nonExistingParts = missingParts.toSet();
       if (!nonExistingParts.isEmpty()) {
         addNonExistingParts(cfact.fact.getName(), nonExistingParts);
       }
@@ -391,10 +451,10 @@ class StorageTableResolver implements ContextRewriter {
 
   private Set<FactPartition> getPartitions(CubeFactTable fact, TimeRange range,
     HashMap<String, SkipStorageCause> skipStorageCauses,
-    Map<UpdatePeriod, RangesPartitionTimeline> nonExistingParts) throws SemanticException {
+    PartitionRangesForPartitionColumns missingPartitions) throws SemanticException {
     try {
       return getPartitions(fact, range, getValidUpdatePeriods(fact), true, skipStorageCauses,
-        nonExistingParts);
+        missingPartitions);
     } catch (Exception e) {
       throw new SemanticException(e);
     }
@@ -402,12 +462,12 @@ class StorageTableResolver implements ContextRewriter {
 
   private Set<FactPartition> getPartitions(CubeFactTable fact, TimeRange range, TreeSet<UpdatePeriod> updatePeriods,
     boolean addNonExistingParts, Map<String, SkipStorageCause> skipStorageCauses,
-    Map<UpdatePeriod, RangesPartitionTimeline> nonExistingParts)
+    PartitionRangesForPartitionColumns missingPartitions)
     throws Exception {
     Set<FactPartition> partitions = new TreeSet<FactPartition>();
-    if (range.isCoverableBy(updatePeriods)
+    if (range != null && range.isCoverableBy(updatePeriods)
       && getPartitions(fact, range.getFromDate(), range.getToDate(), range.getPartitionColumn(), partitions,
-        updatePeriods, addNonExistingParts, skipStorageCauses, nonExistingParts)) {
+        updatePeriods, addNonExistingParts, skipStorageCauses, missingPartitions)) {
       return partitions;
     } else {
       return new TreeSet<FactPartition>();
@@ -417,7 +477,7 @@ class StorageTableResolver implements ContextRewriter {
   private boolean getPartitions(CubeFactTable fact, Date fromDate, Date toDate, String partCol,
     Set<FactPartition> partitions, TreeSet<UpdatePeriod> updatePeriods,
     boolean addNonExistingParts, Map<String, SkipStorageCause> skipStorageCauses,
-    Map<UpdatePeriod, RangesPartitionTimeline> nonExistingParts)
+    PartitionRangesForPartitionColumns missingPartitions)
     throws Exception {
     LOG.info("getPartitions for " + fact + " from fromDate:" + fromDate + " toDate:" + toDate);
     if (fromDate.equals(toDate) || fromDate.after(toDate)) {
@@ -503,7 +563,7 @@ class StorageTableResolver implements ContextRewriter {
                 LOG.info("Looking for process time partitions between " + pdt + " and " + nextPdt);
                 Set<FactPartition> processTimeParts =
                   getPartitions(fact, TimeRange.getBuilder().fromDate(pdt).toDate(nextPdt).partitionColumn(
-                    processTimePartCol).build(), newset, false, skipStorageCauses, nonExistingParts);
+                    processTimePartCol).build(), newset, false, skipStorageCauses, missingPartitions);
                 LOG.info("Look ahead partitions: " + processTimeParts);
                 TimeRange timeRange = TimeRange.getBuilder().fromDate(dt).toDate(nextDt).build();
                 for (FactPartition pPart : processTimeParts) {
@@ -513,10 +573,11 @@ class StorageTableResolver implements ContextRewriter {
                       partWhereClauseFormat));
                   }
                   LOG.info("added all sub partitions blindly in pPart: " + pPart);
-//                          if (!getPartitions(fact, dt, cal.getTime(), partCol, pPart, partitions, newset, false,
-//                            skipStorageCauses, nonExistingParts)) {
-//                            LOG.info("No partitions found in look ahead range");
-//                          }
+                  //                          if (!getPartitions(fact, dt, cal.getTime(), partCol, pPart, partitions,
+                  // newset, false,
+                  //                            skipStorageCauses, nonExistingParts)) {
+                  //                            LOG.info("No partitions found in look ahead range");
+                  //                          }
                 }
               }
             }
@@ -528,15 +589,12 @@ class StorageTableResolver implements ContextRewriter {
         newset.addAll(updatePeriods);
         newset.remove(interval);
         if (!getPartitions(fact, dt, nextDt, partCol, partitions, newset, false, skipStorageCauses,
-          nonExistingParts)) {
+          missingPartitions)) {
 
           LOG.info("Adding non existing partition" + part);
           if (addNonExistingParts) {
             // Add non existing partitions for all cases of whether we populate all non existing or not.
-            if (!nonExistingParts.containsKey(part.getPeriod())) {
-              nonExistingParts.put(part.getPeriod(), new RangesPartitionTimeline(null, null, null));
-            }
-            nonExistingParts.get(part.getPeriod()).add(TimePartition.of(part.getPeriod(), dt));
+            missingPartitions.add(part);
             if (!failOnPartialData) {
               partitions.add(part);
               // add all storage tables as the answering tables
@@ -552,9 +610,9 @@ class StorageTableResolver implements ContextRewriter {
       }
     }
     return getPartitions(fact, fromDate, ceilFromDate, partCol, partitions,
-      updatePeriods, addNonExistingParts, skipStorageCauses, nonExistingParts)
+      updatePeriods, addNonExistingParts, skipStorageCauses, missingPartitions)
       && getPartitions(fact, floorToDate, toDate, partCol, partitions,
-        updatePeriods, addNonExistingParts, skipStorageCauses, nonExistingParts);
+        updatePeriods, addNonExistingParts, skipStorageCauses, missingPartitions);
   }
 
   private void updateFactPartitionStorageTablesFrom(CubeFactTable fact, FactPartition part,

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/TimeRange.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/TimeRange.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/TimeRange.java
index 612cdf9..c9c9cc6 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/TimeRange.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/TimeRange.java
@@ -24,6 +24,7 @@ import java.util.TreeSet;
 
 import org.apache.lens.cube.metadata.UpdatePeriod;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hive.ql.ErrorMsg;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
@@ -130,6 +131,21 @@ public class TimeRange {
     }
   }
 
+  public String toTimeDimWhereClause() {
+    return toTimeDimWhereClause(null, partitionColumn);
+  }
+
+  public String toTimeDimWhereClause(String prefix, String column) {
+    if (StringUtils.isNotBlank(column)) {
+      column = prefix + "." + column;
+    }
+    return new StringBuilder()
+      .append(column).append(" >= '").append(DateUtil.HIVE_QUERY_DATE_PARSER.get().format(fromDate)).append("'")
+      .append(" AND ")
+      .append(column).append(" < '").append(DateUtil.HIVE_QUERY_DATE_PARSER.get().format(toDate)).append("'")
+      .toString();
+  }
+
   @Override
   public String toString() {
     return partitionColumn + " [" + fromDate + ":" + toDate + "]";

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/lens-cube/src/main/java/org/apache/lens/cube/parse/TimerangeResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/TimerangeResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/TimerangeResolver.java
index 1a30228..e5e7c56 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/TimerangeResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/TimerangeResolver.java
@@ -136,7 +136,6 @@ class TimerangeResolver implements ContextRewriter {
 
     TimeRange range = builder.build();
     range.validate();
-
     cubeql.getTimeRanges().add(range);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 3203354..1fe4173 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
@@ -39,7 +39,6 @@ import org.apache.hadoop.hive.ql.metadata.Hive;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.metadata.Table;
 import org.apache.hadoop.hive.ql.parse.ParseException;
-import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.apache.hadoop.hive.ql.session.SessionState;
 import org.apache.hadoop.hive.serde.serdeConstants;
 import org.apache.hadoop.mapred.TextInputFormat;
@@ -108,6 +107,7 @@ public class CubeTestSetup {
   // Time Ranges
   public static final String LAST_HOUR_TIME_RANGE;
   public static final String TWO_DAYS_RANGE;
+  public static final String TWO_DAYS_RANGE_TTD;
   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;
@@ -157,17 +157,19 @@ public class CubeTestSetup {
     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) + "','"
+      "time_range_in(d_time, '" + CubeTestSetup.getDateUptoHours(BEFORE_4_DAYS_START) + "','"
         + CubeTestSetup.getDateUptoHours(BEFORE_4_DAYS_END) + "')";
 
 
-    TWO_DAYS_RANGE = "time_range_in(dt, '" + getDateUptoHours(TWODAYS_BACK) + "','" + getDateUptoHours(NOW) + "')";
+    TWO_DAYS_RANGE = "time_range_in(d_time, '" + getDateUptoHours(TWODAYS_BACK) + "','" + getDateUptoHours(NOW) + "')";
+    TWO_DAYS_RANGE_TTD = "time_range_in(test_time_dim, '" + getDateUptoHours(TWODAYS_BACK) + "','"
+      + getDateUptoHours(NOW) + "')";
     THIS_YEAR_RANGE =
-      "time_range_in(dt, '" + getDateUptoHours(THIS_YEAR_START) + "','" + getDateUptoHours(THIS_YEAR_END) + "')";
+      "time_range_in(d_time, '" + getDateUptoHours(THIS_YEAR_START) + "','" + getDateUptoHours(THIS_YEAR_END) + "')";
     TWO_MONTHS_RANGE_UPTO_MONTH =
-      "time_range_in(dt, '" + getDateUptoMonth(TWO_MONTHS_BACK) + "','" + getDateUptoMonth(NOW) + "')";
+      "time_range_in(d_time, '" + getDateUptoMonth(TWO_MONTHS_BACK) + "','" + getDateUptoMonth(NOW) + "')";
     TWO_MONTHS_RANGE_UPTO_HOURS =
-      "time_range_in(dt, '" + getDateUptoHours(TWO_MONTHS_BACK) + "','" + getDateUptoHours(NOW) + "')";
+      "time_range_in(d_time, '" + getDateUptoHours(TWO_MONTHS_BACK) + "','" + getDateUptoHours(NOW) + "')";
 
     // calculate LAST_HOUR_TIME_RANGE
     LAST_HOUR_TIME_RANGE = getTimeRangeString(getDateUptoHours(LAST_HOUR), getDateUptoHours(NOW));
@@ -448,23 +450,6 @@ public class CubeTestSetup {
     return getExpectedQuery(dimName, selExpr, null, null, postWhereExpr, storageTable, hasPart);
   }
 
-  public static List<String> getNotLatestConditions(final String cubeName, final String timePart,
-    final String storageTableName) throws SemanticException {
-    return new ArrayList<String>() {
-      {
-        try {
-          for (FieldSchema fs : Hive.get().getTable(storageTableName).getPartitionKeys()) {
-            if (!fs.getName().equals(timePart)) {
-              add(cubeName + "." + fs.getName() + " != '" + StorageConstants.LATEST_PARTITION_VALUE + "'");
-            }
-          }
-        } catch (HiveException e) {
-          throw new SemanticException(e);
-        }
-      }
-    };
-  }
-
   public static String getExpectedQuery(String dimName, String selExpr, String joinExpr, String whereExpr,
     String postWhereExpr, String storageTable, boolean hasPart) {
     StringBuilder expected = new StringBuilder();
@@ -516,6 +501,8 @@ public class CubeTestSetup {
       "New measure", null, null, null, NOW, null, 100.0));
 
     cubeDimensions = new HashSet<CubeDimAttribute>();
+    cubeDimensions.add(new BaseDimAttribute(new FieldSchema("d_time", "timestamp", "d time")));
+    cubeDimensions.add(new BaseDimAttribute(new FieldSchema("processing_time", "timestamp", "processing time")));
     List<CubeDimAttribute> locationHierarchy = new ArrayList<CubeDimAttribute>();
     locationHierarchy.add(new ReferencedDimAtrribute(new FieldSchema("zipcode", "int", "zip"), "Zip refer",
       new TableReference("zipdim", "code")));
@@ -593,13 +580,14 @@ public class CubeTestSetup {
 
     Map<String, String> cubeProperties = new HashMap<String, String>();
     cubeProperties.put(MetastoreUtil.getCubeTimedDimensionListKey(TEST_CUBE_NAME),
-      "dt,pt,it,et,test_time_dim,test_time_dim2");
+      "d_time,pt,it,et,test_time_dim,test_time_dim2");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "test_time_dim", "ttd");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "test_time_dim2", "ttd2");
-    cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "dt", "dt");
+    cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "d_time", "dt");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "it", "it");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "et", "et");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "pt", "pt");
+    cubeProperties.put(MetastoreConstants.TIMEDIM_RELATION + "d_time", "test_time_dim+[-10 days,10 days]");
 
     client.createCube(TEST_CUBE_NAME, cubeMeasures, cubeDimensions, exprs, joinchains, cubeProperties);
 
@@ -631,13 +619,15 @@ public class CubeTestSetup {
 
     Map<String, String> cubeProperties = new HashMap<String, String>();
     cubeProperties.put(MetastoreUtil.getCubeTimedDimensionListKey(BASE_CUBE_NAME),
-      "dt,pt,it,et,test_time_dim,test_time_dim2");
+      "d_time,pt,it,et,test_time_dim,test_time_dim2");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "test_time_dim", "ttd");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "test_time_dim2", "ttd2");
-    cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "dt", "dt");
+    cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "d_time", "dt");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "it", "it");
     cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "et", "et");
-    cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "pt", "pt");
+    cubeProperties.put(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + "processing_time", "pt");
+    cubeProperties.put(MetastoreConstants.TIMEDIM_RELATION + "d_time", "processing_time+[-5 days,5 days]");
+    cubeProperties.put(MetastoreConstants.TIMEDIM_RELATION + "processing_time", "test_time_dim+[-5 days,5 days]");
     cubeProperties.put(MetastoreConstants.CUBE_ALL_FIELDS_QUERIABLE, "false");
 
     Set<JoinChain> joinchains = new HashSet<JoinChain>() {
@@ -803,6 +793,8 @@ public class CubeTestSetup {
     }
 
     // add dimensions of the cube
+    factColumns.add(new FieldSchema("d_time", "timestamp", "event time"));
+    factColumns.add(new FieldSchema("processing_time", "timestamp", "processing time"));
     factColumns.add(new FieldSchema("zipcode", "int", "zip"));
     factColumns.add(new FieldSchema("cityid", "int", "city id"));
     factColumns.add(new FieldSchema("stateid", "int", "city id"));
@@ -819,6 +811,8 @@ public class CubeTestSetup {
     factColumns.add(new FieldSchema("msr12", "float", "second measure"));
 
     // add dimensions of the cube
+    factColumns.add(new FieldSchema("d_time", "timestamp", "event time"));
+    factColumns.add(new FieldSchema("processing_time", "timestamp", "processing time"));
     factColumns.add(new FieldSchema("dim1", "string", "base dim"));
     factColumns.add(new FieldSchema("dim11", "string", "base dim"));
     factColumns.add(new FieldSchema("dim2", "int", "dim2 id"));
@@ -833,6 +827,8 @@ public class CubeTestSetup {
     factColumns.add(new FieldSchema("msr14", "bigint", "fourth measure"));
 
     // add dimensions of the cube
+    factColumns.add(new FieldSchema("d_time", "timestamp", "event time"));
+    factColumns.add(new FieldSchema("processing_time", "timestamp", "processing time"));
     factColumns.add(new FieldSchema("dim1", "string", "base dim"));
     factColumns.add(new FieldSchema("dim11", "string", "base dim"));
 
@@ -846,6 +842,8 @@ public class CubeTestSetup {
     factColumns.add(new FieldSchema("msr12", "float", "second measure"));
 
     // add dimensions of the cube
+    factColumns.add(new FieldSchema("d_time", "timestamp", "event time"));
+    factColumns.add(new FieldSchema("processing_time", "timestamp", "processing time"));
     factColumns.add(new FieldSchema("dim1", "string", "base dim"));
     factColumns.add(new FieldSchema("dim11", "string", "base dim"));
     factColumns.add(new FieldSchema("dim12", "string", "base dim"));
@@ -872,6 +870,8 @@ public class CubeTestSetup {
     factColumns.add(new FieldSchema("msr14", "bigint", "fourth measure"));
 
     // add dimensions of the cube
+    factColumns.add(new FieldSchema("d_time", "timestamp", "event time"));
+    factColumns.add(new FieldSchema("processing_time", "timestamp", "processing time"));
     factColumns.add(new FieldSchema("dim1", "string", "base dim"));
     factColumns.add(new FieldSchema("dim11", "string", "base dim"));
     factColumns.add(new FieldSchema("dim12", "string", "base dim"));
@@ -1299,7 +1299,7 @@ public class CubeTestSetup {
   }
 
   // DimWithTwoStorages
-  private void createCityTbale(CubeMetastoreClient client) throws HiveException, ParseException {
+  private void createCityTable(CubeMetastoreClient client) throws HiveException, ParseException {
     Set<CubeDimAttribute> cityAttrs = new HashSet<CubeDimAttribute>();
     cityAttrs.add(new BaseDimAttribute(new FieldSchema("id", "int", "code")));
     cityAttrs.add(new BaseDimAttribute(new FieldSchema("name", "string", "city name")));
@@ -1880,7 +1880,7 @@ public class CubeTestSetup {
       createCubeFactOnlyHourly(client);
       createCubeFactOnlyHourlyRaw(client);
 
-      createCityTbale(client);
+      createCityTable(client);
       // For join resolver test
       createTestDim2(client);
       createTestDim3(client);
@@ -2122,6 +2122,6 @@ public class CubeTestSetup {
 
 
   private static String getTimeRangeString(final String startDate, final String endDate) {
-    return "time_range_in(dt, '" + startDate + "','" + endDate + "')";
+    return "time_range_in(d_time, '" + startDate + "','" + endDate + "')";
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/dc1fafa9/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 37c578b..4f61671 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
@@ -32,8 +32,11 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
+import lombok.Getter;
+
 public class TestAggregateResolver extends TestQueryRewrite {
 
+  @Getter
   private Configuration conf;
   private final String cubeName = CubeTestSetup.TEST_CUBE_NAME;
 
@@ -45,14 +48,6 @@ public class TestAggregateResolver extends TestQueryRewrite {
     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;
 
@@ -148,7 +143,7 @@ public class TestAggregateResolver extends TestQueryRewrite {
       compareQueries(expected[i], hql);
     }
     aggregateFactSelectionTests(conf);
-    rawFactSelectionTests(getConf("C1,C2"));
+    rawFactSelectionTests(getConfWithStorages("C1,C2"));
   }
 
   @Test
@@ -202,7 +197,7 @@ public class TestAggregateResolver extends TestQueryRewrite {
 
   @Test
   public void testAggregateResolverOff() throws SemanticException, ParseException, LensException {
-    Configuration conf2 = getConf("C1,C2");
+    Configuration conf2 = getConfWithStorages("C1,C2");
     conf2.setBoolean(CubeQueryConfUtil.DISABLE_AGGREGATE_RESOLVER, true);
 
     // Test if raw fact is selected for query with no aggregate function on a