You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kr...@apache.org on 2022/02/17 12:45:09 UTC
[hive] branch master updated: HIVE-25951: HiveRelMdPredicates extends RelMdPredicates (Alessandro Solimando, reviewed by Krisztian Kasa)
This is an automated email from the ASF dual-hosted git repository.
krisztiankasa pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new c835e42 HIVE-25951: HiveRelMdPredicates extends RelMdPredicates (Alessandro Solimando, reviewed by Krisztian Kasa)
c835e42 is described below
commit c835e4254452662b88376bb9480145500c6a0065
Author: Alessandro Solimando <al...@gmail.com>
AuthorDate: Thu Feb 17 13:44:54 2022 +0100
HIVE-25951: HiveRelMdPredicates extends RelMdPredicates (Alessandro Solimando, reviewed by Krisztian Kasa)
---
.../calcite/stats/HiveRelMdPredicates.java | 97 +---------------------
1 file changed, 4 insertions(+), 93 deletions(-)
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
index 66c6888..818fcf4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/stats/HiveRelMdPredicates.java
@@ -35,7 +35,6 @@ import org.apache.calcite.linq4j.function.Predicate1;
import org.apache.calcite.plan.RelOptPredicateList;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.core.Join;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.core.Project;
@@ -43,7 +42,6 @@ import org.apache.calcite.rel.core.Union;
import org.apache.calcite.rel.metadata.BuiltInMetadata;
import org.apache.calcite.rel.metadata.ChainedRelMetadataProvider;
import org.apache.calcite.rel.metadata.MetadataDef;
-import org.apache.calcite.rel.metadata.MetadataHandler;
import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider;
import org.apache.calcite.rel.metadata.RelMdPredicates;
import org.apache.calcite.rel.metadata.RelMetadataProvider;
@@ -75,7 +73,7 @@ import com.google.common.collect.Maps;
//TODO: Move this to calcite
-public class HiveRelMdPredicates implements MetadataHandler<BuiltInMetadata.Predicates> {
+public class HiveRelMdPredicates extends RelMdPredicates {
public static final RelMetadataProvider SOURCE =
ChainedRelMetadataProvider.of(
@@ -116,6 +114,7 @@ public class HiveRelMdPredicates implements MetadataHandler<BuiltInMetadata.Pred
*
* </ol>
*/
+ @Override
public RelOptPredicateList getPredicates(Project project, RelMetadataQuery mq) {
RelNode child = project.getInput();
@@ -168,6 +167,7 @@ public class HiveRelMdPredicates implements MetadataHandler<BuiltInMetadata.Pred
}
/** Infers predicates for a {@link org.apache.calcite.rel.core.Join}. */
+ @Override
public RelOptPredicateList getPredicates(Join join, RelMetadataQuery mq) {
RexBuilder rB = join.getCluster().getRexBuilder();
RelNode left = join.getInput(0);
@@ -184,96 +184,7 @@ public class HiveRelMdPredicates implements MetadataHandler<BuiltInMetadata.Pred
return jI.inferPredicates(false);
}
-
- /**
- * Infers predicates for an Aggregate.
- *
- * <p>Pulls up predicates that only contains references to columns in the
- * GroupSet. For e.g.
- *
- * <pre>
- * inputPullUpExprs : { a > 7, b + c < 10, a + e = 9}
- * groupSet : { a, b}
- * pulledUpExprs : { a > 7}
- * </pre>
- */
- public RelOptPredicateList getPredicates(Aggregate agg, RelMetadataQuery mq) {
- final RelNode input = agg.getInput();
- final RelOptPredicateList inputInfo = mq.getPulledUpPredicates(input);
- final List<RexNode> aggPullUpPredicates = new ArrayList<>();
- final RexBuilder rexBuilder = agg.getCluster().getRexBuilder();
-
- ImmutableBitSet groupKeys = agg.getGroupSet();
- Mapping m = Mappings.create(MappingType.PARTIAL_FUNCTION,
- input.getRowType().getFieldCount(), agg.getRowType().getFieldCount());
-
- int i = 0;
- for (int j : groupKeys) {
- m.set(j, i++);
- }
-
- for (RexNode r : inputInfo.pulledUpPredicates) {
- ImmutableBitSet rCols = RelOptUtil.InputFinder.bits(r);
- if (!rCols.isEmpty() && groupKeys.contains(rCols)) {
- r = r.accept(new RexPermuteInputsShuttle(m, input));
- aggPullUpPredicates.add(r);
- }
- }
- return RelOptPredicateList.of(rexBuilder, aggPullUpPredicates);
- }
-
- /**
- * Infers predicates for a Union.
- */
- public RelOptPredicateList getPredicates(Union union, RelMetadataQuery mq) {
- RexBuilder rB = union.getCluster().getRexBuilder();
-
- Map<String, RexNode> finalPreds = new HashMap<>();
- List<RexNode> finalResidualPreds = new ArrayList<>();
- for (int i = 0; i < union.getInputs().size(); i++) {
- RelNode input = union.getInputs().get(i);
- RelOptPredicateList info = mq.getPulledUpPredicates(input);
- if (info.pulledUpPredicates.isEmpty()) {
- return RelOptPredicateList.EMPTY;
- }
- Map<String, RexNode> preds = new HashMap<>();
- List<RexNode> residualPreds = new ArrayList<>();
- for (RexNode pred : info.pulledUpPredicates) {
- final String predString = pred.toString();
- if (i == 0) {
- preds.put(predString, pred);
- continue;
- }
- if (finalPreds.containsKey(predString)) {
- preds.put(predString, pred);
- } else {
- residualPreds.add(pred);
- }
- }
- // Add new residual preds
- finalResidualPreds.add(RexUtil.composeConjunction(rB, residualPreds, false));
- // Add those that are not part of the final set to residual
- for (Entry<String, RexNode> e : finalPreds.entrySet()) {
- if (!preds.containsKey(e.getKey())) {
- // This node was in previous union inputs, but it is not in this one
- for (int j = 0; j < i; j++) {
- finalResidualPreds.set(j, RexUtil.composeConjunction(rB, Lists.newArrayList(
- finalResidualPreds.get(j), e.getValue()), false));
- }
- }
- }
- // Final preds
- finalPreds = preds;
- }
-
- List<RexNode> preds = new ArrayList<>(finalPreds.values());
- RexNode disjPred = RexUtil.composeDisjunction(rB, finalResidualPreds, false);
- if (!disjPred.isAlwaysTrue()) {
- preds.add(disjPred);
- }
- return RelOptPredicateList.of(rB, preds);
- }
-
+
/**
* Utility to infer predicates from one side of the join that apply on the
* other side.