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);
- }
-
}