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 &gt; 7, b + c &lt; 10, a + e = 9}
-   * groupSet         : { a, b}
-   * pulledUpExprs    : { a &gt; 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.