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 <alessandro.solima...@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.