You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jc...@apache.org on 2017/04/19 08:13:35 UTC

hive git commit: HIVE-16117: SortProjectTransposeRule should check for monotonicity preserving CAST (Jesus Camacho Rodriguez, reviewed by Ashutosh Chauhan)

Repository: hive
Updated Branches:
  refs/heads/master 138c0051b -> 85af1b8f1


HIVE-16117: SortProjectTransposeRule should check for monotonicity preserving CAST (Jesus Camacho Rodriguez, reviewed by Ashutosh Chauhan)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/85af1b8f
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/85af1b8f
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/85af1b8f

Branch: refs/heads/master
Commit: 85af1b8f1377f731baf090814834db9a67a09496
Parents: 138c005
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Tue Apr 18 12:27:57 2017 +0100
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Wed Apr 19 08:59:06 2017 +0100

----------------------------------------------------------------------
 .../rules/HiveProjectSortTransposeRule.java     | 20 +++++++-
 .../rules/HiveSortProjectTransposeRule.java     | 48 +-------------------
 2 files changed, 21 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/85af1b8f/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveProjectSortTransposeRule.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveProjectSortTransposeRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveProjectSortTransposeRule.java
index fd19d99..1487ed4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveProjectSortTransposeRule.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveProjectSortTransposeRule.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.hive.ql.optimizer.calcite.rules;
 
+import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
@@ -25,7 +26,12 @@ import org.apache.calcite.rel.RelCollation;
 import org.apache.calcite.rel.RelCollationTraitDef;
 import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rex.RexCall;
+import org.apache.calcite.rex.RexCallBinding;
+import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.validate.SqlMonotonicity;
 import org.apache.calcite.util.mapping.Mappings;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSortLimit;
@@ -59,16 +65,28 @@ public class HiveProjectSortTransposeRule extends RelOptRule {
   public void onMatch(RelOptRuleCall call) {
     final HiveProject project = call.rel(0);
     final HiveSortLimit sort = call.rel(1);
+    final RelOptCluster cluster = project.getCluster();
 
     // Determine mapping between project input and output fields. If sort
     // relies on non-trivial expressions, we can't push.
     final Mappings.TargetMapping map =
-        RelOptUtil.permutation(
+        RelOptUtil.permutationIgnoreCast(
             project.getProjects(), project.getInput().getRowType()).inverse();
     for (RelFieldCollation fc : sort.getCollation().getFieldCollations()) {
       if (map.getTarget(fc.getFieldIndex()) < 0) {
         return;
       }
+      final RexNode node = project.getProjects().get(map.getTarget(fc.getFieldIndex()));
+      if (node.isA(SqlKind.CAST)) {
+        // Check whether it is a monotonic preserving cast, otherwise we cannot push
+        final RexCall cast = (RexCall) node;
+        final RexCallBinding binding =
+            RexCallBinding.create(cluster.getTypeFactory(), cast,
+                ImmutableList.of(RexUtil.apply(map, sort.getCollation())));
+        if (cast.getOperator().getMonotonicity(binding) == SqlMonotonicity.NOT_MONOTONIC) {
+          return;
+        }
+      }
     }
 
     // Create new collation

http://git-wip-us.apache.org/repos/asf/hive/blob/85af1b8f/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveSortProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveSortProjectTransposeRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveSortProjectTransposeRule.java
index fe29850..d1be4bc 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveSortProjectTransposeRule.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveSortProjectTransposeRule.java
@@ -17,23 +17,13 @@
  */
 package org.apache.hadoop.hive.ql.optimizer.calcite.rules;
 
-import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
-import org.apache.calcite.plan.RelOptRuleOperand;
-import org.apache.calcite.plan.RelOptUtil;
-import org.apache.calcite.rel.RelCollation;
-import org.apache.calcite.rel.RelCollationTraitDef;
-import org.apache.calcite.rel.RelFieldCollation;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.util.mapping.Mappings;
+import org.apache.calcite.rel.rules.SortProjectTransposeRule;
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSortLimit;
 
-import com.google.common.collect.ImmutableList;
-
-public class HiveSortProjectTransposeRule extends RelOptRule {
+public class HiveSortProjectTransposeRule extends SortProjectTransposeRule {
 
   public static final HiveSortProjectTransposeRule INSTANCE =
       new HiveSortProjectTransposeRule();
@@ -50,10 +40,6 @@ public class HiveSortProjectTransposeRule extends RelOptRule {
             operand(HiveProject.class, any())));
   }
 
-  protected HiveSortProjectTransposeRule(RelOptRuleOperand operand) {
-    super(operand);
-  }
-
   //~ Methods ----------------------------------------------------------------
 
   @Override
@@ -68,34 +54,4 @@ public class HiveSortProjectTransposeRule extends RelOptRule {
     return true;
   }
 
-  // implement RelOptRule
-  public void onMatch(RelOptRuleCall call) {
-    final HiveSortLimit sort = call.rel(0);
-    final HiveProject project = call.rel(1);
-
-    // Determine mapping between project input and output fields. If sort
-    // relies on non-trivial expressions, we can't push.
-    final Mappings.TargetMapping map =
-        RelOptUtil.permutation(
-            project.getProjects(), project.getInput().getRowType());
-    for (RelFieldCollation fc : sort.getCollation().getFieldCollations()) {
-      if (map.getTargetOpt(fc.getFieldIndex()) < 0) {
-        return;
-      }
-    }
-
-    // Create new collation
-    final RelCollation newCollation =
-        RelCollationTraitDef.INSTANCE.canonize(
-            RexUtil.apply(map, sort.getCollation()));
-
-    // New operators
-    final HiveSortLimit newSort = sort.copy(sort.getTraitSet().replace(newCollation),
-            project.getInput(), newCollation, sort.offset, sort.fetch);
-    final RelNode newProject = project.copy(sort.getTraitSet(),
-            ImmutableList.<RelNode>of(newSort));
-
-    call.transformTo(newProject);
-  }
-
 }