From 0c3016d4aa51e793d6bec75190f035156ff2288e Mon Sep 17 00:00:00 2001 From: Nishant Date: Tue, 30 Jan 2018 19:27:51 +0530 Subject: [PATCH] [HIVE-18583] enable dateRangeRule and add tests --- .../ql/optimizer/calcite/rules/HiveDruidRules.java | 4 ++++ .../hadoop/hive/ql/parse/CalcitePlanner.java | 1 + .../test/queries/clientpositive/druid_intervals.q | 27 ++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveDruidRules.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveDruidRules.java index ba8e98e9d4..5012cc2b09 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveDruidRules.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveDruidRules.java @@ -29,6 +29,7 @@ import org.apache.calcite.adapter.druid.DruidRules.DruidProjectSortTransposeRule; import org.apache.calcite.adapter.druid.DruidRules.DruidSortProjectTransposeRule; import org.apache.calcite.adapter.druid.DruidRules.DruidSortRule; +import org.apache.calcite.rel.rules.DateRangeRules; import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelFactories; /** @@ -71,4 +72,7 @@ public static final DruidPostAggregationProjectRule POST_AGGREGATION_PROJECT = new DruidPostAggregationProjectRule(HiveRelFactories.HIVE_BUILDER); + + public static final DateRangeRules.FilterDateRangeRule FILTER_DATE_RANGE_RULE = + new DateRangeRules.FilterDateRangeRule(HiveRelFactories.HIVE_BUILDER); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java index f639a40330..775ab1d3c2 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java @@ -1635,6 +1635,7 @@ private RelNode copyNodeScan(RelNode scan) { perfLogger.PerfLogBegin(this.getClass().getName(), PerfLogger.OPTIMIZER); calciteOptimizedPlan = hepPlan(calciteOptimizedPlan, false, mdProvider.getMetadataProvider(), null, HepMatchOrder.BOTTOM_UP, + HiveDruidRules.FILTER_DATE_RANGE_RULE, HiveDruidRules.FILTER, HiveDruidRules.PROJECT_FILTER_TRANSPOSE, HiveDruidRules.AGGREGATE_FILTER_TRANSPOSE, diff --git a/ql/src/test/queries/clientpositive/druid_intervals.q b/ql/src/test/queries/clientpositive/druid_intervals.q index 140ff82151..534b557642 100644 --- a/ql/src/test/queries/clientpositive/druid_intervals.q +++ b/ql/src/test/queries/clientpositive/druid_intervals.q @@ -65,3 +65,30 @@ EXPLAIN SELECT `__time`, robot FROM druid_table_1 WHERE robot = 'user1' OR `__time` IN ('2010-01-01 00:00:00','2011-01-01 00:00:00'); + +-- Filter on FLOOR converted to druid date range +EXPLAIN +SELECT `__time`, robot +FROM druid_table_1 +WHERE floor(`__time` to MONTH) = '2010-01-01 00:00:00'; + +EXPLAIN +SELECT `__time`, robot +FROM druid_table_1 +WHERE floor(`__time` to MONTH) > '2010-01-01 00:00:00' and floor(`__time` to MONTH) <= '2011-01-01 00:00:00'; + +EXPLAIN +SELECT floor(`__time` to YEAR), robot +FROM druid_table_1 +WHERE floor(`__time` to MONTH) > '2010-01-01 00:00:00' and floor(`__time` to MONTH) <= '2011-01-01 00:00:00'; + +-- Combination of Filter on floor and extract on month +EXPLAIN +SELECT `__time`, robot +FROM druid_table_1 +WHERE floor(`__time` to YEAR) = '2010-01-01 00:00:00' AND extract(MONTH from `__time`) = 4; + +EXPLAIN +SELECT `__time`, robot +FROM druid_table_1 +WHERE floor(`__time` to YEAR) >= '2010-01-01 00:00:00' AND extract(YEAR from `__time`) = 2010; -- 2.11.0 (Apple Git-81)