LENS-1466 : Fix for 'Rewritten queries not resolving time_range_in clause'
Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/ff4f3726 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/ff4f3726 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/ff4f3726 Branch: refs/heads/master Commit: ff4f3726a25db684ff7623fea68e954712dd925f Parents: 10eef27 Author: Rajitha R <rajitha....@gmail.com> Authored: Fri Sep 1 13:02:32 2017 +0530 Committer: Amareshwari Sriramadasu <amareshw...@apache.org> Committed: Fri Sep 1 15:23:45 2017 +0530 ---------------------------------------------------------------------- .../lens/cube/parse/StorageCandidate.java | 2 +- .../apache/lens/cube/metadata/DateFactory.java | 6 ++ .../apache/lens/cube/parse/CubeTestSetup.java | 47 +++++++++++-- .../lens/cube/parse/TestCubeRewriter.java | 15 ++++- .../resources/schema/cubes/base/testcube.xml | 2 + .../test/resources/schema/facts/summary5.xml | 70 ++++++++++++++++++++ .../src/test/resources/schema/storages/c98.xml | 26 ++++++++ 7 files changed, 159 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java index 2b1add3..27835b3 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java @@ -533,9 +533,9 @@ public class StorageCandidate implements Candidate, CandidateTable { log.debug("Adding non existing partition {}", part); if (addNonExistingParts) { // Add non existing partitions for all cases of whether we populate all non existing or not. - this.participatingUpdatePeriods.add(maxInterval); missingPartitions.add(part); if (!failOnPartialData) { + this.participatingUpdatePeriods.add(maxInterval); partitions.add(part); part.getStorageTables().add(storageTable); } http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/lens-cube/src/test/java/org/apache/lens/cube/metadata/DateFactory.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/metadata/DateFactory.java b/lens-cube/src/test/java/org/apache/lens/cube/metadata/DateFactory.java index 855f54a..75f2abd 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/metadata/DateFactory.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/metadata/DateFactory.java @@ -150,6 +150,7 @@ public class DateFactory { // Time Instances as Date Type public static final Date NOW; + public static final Date ONEDAY_BACK; public static final Date TWODAYS_BACK; public static final Date TWO_MONTHS_BACK; public static final Date THIS_MONTH_TRUNCATED; @@ -168,6 +169,7 @@ public class DateFactory { public static final String TWO_DAYS_RANGE_TTD2; public static final String TWO_DAYS_RANGE_TTD2_BEFORE_4_DAYS; public static final String TWO_DAYS_RANGE_IT; + public static final String ONE_DAY_RANGE_IT; public static final String THIS_YEAR_RANGE; public static final String LAST_YEAR_RANGE; public static final String TWO_MONTHS_RANGE_UPTO_MONTH; @@ -189,6 +191,9 @@ public class DateFactory { // Figure out if current hour is 0th hour zerothHour = getDateStringWithOffset(HOURLY, 0).endsWith("-00"); + ONEDAY_BACK = getDateWithOffset(DAILY, -1); + System.out.println("Test ONEDAY_BACK:" + ONEDAY_BACK); + TWODAYS_BACK = getDateWithOffset(DAILY, -2); System.out.println("Test TWODAYS_BACK:" + TWODAYS_BACK); @@ -214,6 +219,7 @@ public class DateFactory { TWO_DAYS_RANGE_TTD2 = getTimeRangeString("test_time_dim2", DAILY, -2, 0, HOURLY); TWO_DAYS_RANGE_TTD2_BEFORE_4_DAYS = getTimeRangeString("test_time_dim2", DAILY, -6, -4, HOURLY); TWO_DAYS_RANGE_IT = getTimeRangeString("it", DAILY, -2, 0, HOURLY); + ONE_DAY_RANGE_IT = getTimeRangeString("it", DAILY, -1, 0, DAILY); THIS_YEAR_RANGE = getTimeRangeString(YEARLY, 0, 1); LAST_YEAR_RANGE = getTimeRangeString(YEARLY, -1, 0); TWO_MONTHS_RANGE_UPTO_MONTH = getTimeRangeString(MONTHLY, -2, 0); http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/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 0366e56..5608b39 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 @@ -22,12 +22,7 @@ package org.apache.lens.cube.parse; import static java.util.Calendar.DAY_OF_MONTH; import static java.util.Calendar.HOUR_OF_DAY; -import static org.apache.lens.cube.metadata.DateFactory.BEFORE_4_DAYS; -import static org.apache.lens.cube.metadata.DateFactory.BEFORE_6_DAYS; -import static org.apache.lens.cube.metadata.DateFactory.NOW; -import static org.apache.lens.cube.metadata.DateFactory.TWODAYS_BACK; -import static org.apache.lens.cube.metadata.DateFactory.TWO_MONTHS_BACK; -import static org.apache.lens.cube.metadata.DateFactory.isZerothHour; +import static org.apache.lens.cube.metadata.DateFactory.*; import static org.apache.lens.cube.metadata.UpdatePeriod.DAILY; import static org.apache.lens.cube.metadata.UpdatePeriod.HOURLY; import static org.apache.lens.cube.metadata.UpdatePeriod.MINUTELY; @@ -132,6 +127,7 @@ public class CubeTestSetup { private static String c3 = "C3"; private static String c4 = "C4"; private static String c5 = "C5"; + private static String c98 = "C98"; private static String c99 = "C99"; private static Map<String, String> factValidityProperties = Maps.newHashMap(); @Getter @@ -881,10 +877,13 @@ public class CubeTestSetup { CubeFactTable fact3 = client.getCubeFactTable(factName); createPIEParts(client, fact3, c2); - factName = "summary4"; CubeFactTable fact4 = client.getCubeFactTable(factName); createPIEParts(client, fact4, c2); + + factName = "summary5"; + CubeFactTable fact5 = client.getCubeFactTable(factName); + createPIParts(client, fact5, c98); } private void createBaseCubeFactPartitions(CubeMetastoreClient client) throws HiveException, LensException { @@ -994,6 +993,7 @@ public class CubeTestSetup { pTimes.get(HOURLY).add(ptime); iTimes.get(HOURLY).add(itime); client.addPartition(sPartSpec, storageName, CubeTableType.FACT); + pcal.add(HOUR_OF_DAY, 1); ical.add(HOUR_OF_DAY, 1); } @@ -1015,6 +1015,39 @@ public class CubeTestSetup { } } + + private void createPIParts(CubeMetastoreClient client, CubeFactTable fact, String storageName) + throws Exception { + // Add partitions in PI storage + //daily partition registered for pt=day1, it = day1 + //hourly partitions registered for pt=day1-hours[0-23] it=day1-hours[0-23] + Calendar pcal = Calendar.getInstance(); + pcal.setTime(ONEDAY_BACK); + pcal.set(HOUR_OF_DAY, 0); + Calendar ical = Calendar.getInstance(); + ical.setTime(ONEDAY_BACK); + ical.set(HOUR_OF_DAY, 0); + + Date ptime = pcal.getTime(); + Date itime = ical.getTime(); + Map<String, Date> timeParts = new HashMap<String, Date>(); + + timeParts.put("pt", ptime); + timeParts.put("it", itime); + StoragePartitionDesc sPartSpec = new StoragePartitionDesc(fact.getName(), timeParts, null, DAILY); + client.addPartition(sPartSpec, storageName, CubeTableType.FACT); + for (int i = 0; i < 24; i++) { + ptime = pcal.getTime(); + itime = ical.getTime(); + timeParts.put("pt", ptime); + timeParts.put("it", itime); + sPartSpec = new StoragePartitionDesc(fact.getName(), timeParts, null, HOURLY); + client.addPartition(sPartSpec, storageName, CubeTableType.FACT); + pcal.add(HOUR_OF_DAY, 1); + ical.add(HOUR_OF_DAY, 1); + } + } + public static void printQueryAST(String query, String label) throws LensException { System.out.println("--" + label + "--AST--"); System.out.println("--query- " + query); http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/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 bc0fa2e..9b54957 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 @@ -65,7 +65,7 @@ public class TestCubeRewriter extends TestQueryRewrite { @BeforeTest public void setupDriver() throws Exception { conf = LensServerAPITestUtil.getConfiguration( - DRIVER_SUPPORTED_STORAGES, "C0,C1,C2", + DRIVER_SUPPORTED_STORAGES, "C0,C1,C2,C98", DISABLE_AUTO_JOINS, true, ENABLE_SELECT_TO_GROUPBY, true, ENABLE_GROUP_BY_TO_SELECT, true, @@ -1470,6 +1470,19 @@ public class TestCubeRewriter extends TestQueryRewrite { } @Test + public void testTimeRangeIn() throws Exception { + //check whether time_range_in is resolving in cube rewrite + Configuration conf = getConf(); + conf.set(CubeQueryConfUtil.PROCESS_TIME_PART_COL, "pt"); + conf.set(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, "true"); + conf.setClass(CubeQueryConfUtil.TIME_RANGE_WRITER_CLASS, AbridgedTimeRangeWriter.class, TimeRangeWriter.class); + CubeQueryContext ctx = rewriteCtx("select dim1, sum(msr23)" + " from testCube" + " where " + ONE_DAY_RANGE_IT, + conf); + String rewrittenQuery = ctx.toHQL(); + assertTrue(!rewrittenQuery.contains("time_range_in")); + } + + @Test public void testCubeQueryWithMultipleRanges() throws Exception { String hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE + " OR " http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/lens-cube/src/test/resources/schema/cubes/base/testcube.xml ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/resources/schema/cubes/base/testcube.xml b/lens-cube/src/test/resources/schema/cubes/base/testcube.xml index 9d2bb02..4cafd31 100644 --- a/lens-cube/src/test/resources/schema/cubes/base/testcube.xml +++ b/lens-cube/src/test/resources/schema/cubes/base/testcube.xml @@ -32,6 +32,8 @@ <property name="cube.timedim.partition.test_time_dim2" value="ttd2"/> </properties> <measures> + <measure _type="FLOAT" default_aggr="SUM" unit="RS" name="msr23" display_string="Measure23" + description="twenty third measure"/> <measure _type="FLOAT" default_aggr="SUM" unit="RS" name="msr21" display_string="Measure22" description="second measure"/> <measure _type="BIGINT" default_aggr="COUNT" name="msr4" display_string="Measure4" description="fourth measure"/> http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/lens-cube/src/test/resources/schema/facts/summary5.xml ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/resources/schema/facts/summary5.xml b/lens-cube/src/test/resources/schema/facts/summary5.xml new file mode 100644 index 0000000..a4bbf71 --- /dev/null +++ b/lens-cube/src/test/resources/schema/facts/summary5.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + + 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. + +--> +<x_fact_table name="summary5" cube_name="testCube" weight="15.0" xmlns="uri:lens:cube:0.1"> + <columns> + <column name="msr23" _type="float" comment="twenty third measure"/> + <column name="dim1" _type="string" comment="dim1"/> + <column name="dim2" _type="string" comment="dim2"/> + </columns> + <properties> + <property name="cube.fact.relative.start.time" value="now.year - 90 days"/> + <property name="cube.table.summary5.weight" value="15.0"/> + <property name="cube.fact.summary5.storages" value="C98"/> + <property name="cube.fact.summary5.c98.updateperiods" value="HOURLY,DAILY"/> + </properties> + <storage_tables> + <storage_table> + <storage_name>C98</storage_name> + <update_periods> + <update_period_table_descriptor> + <update_period>HOURLY</update_period> + <table_desc external="false"> + <part_cols> + <column name="pt" _type="string" comment="date partition"/> + <column name="it" _type="string" comment="date partition"/> + </part_cols> + <table_parameters> + <property name="cube.storagetable.start.times" value="now -4 days"/> + </table_parameters> + <time_part_cols>pt</time_part_cols> + <time_part_cols>it</time_part_cols> + </table_desc> + </update_period_table_descriptor> + <update_period_table_descriptor> + <update_period>DAILY</update_period> + <table_desc external="false"> + <part_cols> + <column name="pt" _type="string" comment="date partition"/> + <column name="it" _type="string" comment="date partition"/> + </part_cols> + <table_parameters> + <property name="cube.storagetable.start.times" value="now.month -3 months"/> + </table_parameters> + <time_part_cols>pt</time_part_cols> + <time_part_cols>it</time_part_cols> + </table_desc> + </update_period_table_descriptor> + </update_periods> + </storage_table> + </storage_tables> +</x_fact_table> + http://git-wip-us.apache.org/repos/asf/lens/blob/ff4f3726/lens-cube/src/test/resources/schema/storages/c98.xml ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/resources/schema/storages/c98.xml b/lens-cube/src/test/resources/schema/storages/c98.xml new file mode 100644 index 0000000..550b421 --- /dev/null +++ b/lens-cube/src/test/resources/schema/storages/c98.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + + 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. + +--> +<x_storage name="c98" classname="org.apache.lens.cube.metadata.HDFSStorage" xmlns="uri:lens:cube:0.1"> + <properties> + <property name="cube.table.c98.weight" value="0.0"/> + </properties> +</x_storage> \ No newline at end of file