Java Code Examples for org.apache.calcite.plan.RelOptPredicateList#union()
The following examples show how to use
org.apache.calcite.plan.RelOptPredicateList#union() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: RelMdPredicates.java From Bats with Apache License 2.0 | 6 votes |
/** @see RelMetadataQuery#getPulledUpPredicates(RelNode) */ public RelOptPredicateList getPredicates(RelSubset r, RelMetadataQuery mq) { if (!Bug.CALCITE_1048_FIXED) { return RelOptPredicateList.EMPTY; } final RexBuilder rexBuilder = r.getCluster().getRexBuilder(); RelOptPredicateList list = null; for (RelNode r2 : r.getRels()) { RelOptPredicateList list2 = mq.getPulledUpPredicates(r2); if (list2 != null) { list = list == null ? list2 : list.union(rexBuilder, list2); } } return Util.first(list, RelOptPredicateList.EMPTY); }
Example 2
Source File: RelMdPredicates.java From calcite with Apache License 2.0 | 6 votes |
/** @see RelMetadataQuery#getPulledUpPredicates(RelNode) */ public RelOptPredicateList getPredicates(RelSubset r, RelMetadataQuery mq) { if (!Bug.CALCITE_1048_FIXED) { return RelOptPredicateList.EMPTY; } final RexBuilder rexBuilder = r.getCluster().getRexBuilder(); RelOptPredicateList list = null; for (RelNode r2 : r.getRels()) { RelOptPredicateList list2 = mq.getPulledUpPredicates(r2); if (list2 != null) { list = list == null ? list2 : list.union(rexBuilder, list2); } } return Util.first(list, RelOptPredicateList.EMPTY); }
Example 3
Source File: RelMdAllPredicates.java From Bats with Apache License 2.0 | 5 votes |
/** * Add the Filter condition to the list obtained from the input. */ public RelOptPredicateList getAllPredicates(Filter filter, RelMetadataQuery mq) { final RelNode input = filter.getInput(); final RexBuilder rexBuilder = filter.getCluster().getRexBuilder(); final RexNode pred = filter.getCondition(); final RelOptPredicateList predsBelow = mq.getAllPredicates(input); if (predsBelow == null) { // Safety check return null; } // Extract input fields referenced by Filter condition final Set<RelDataTypeField> inputExtraFields = new LinkedHashSet<>(); final RelOptUtil.InputFinder inputFinder = new RelOptUtil.InputFinder(inputExtraFields); pred.accept(inputFinder); final ImmutableBitSet inputFieldsUsed = inputFinder.inputBitSet.build(); // Infer column origin expressions for given references final Map<RexInputRef, Set<RexNode>> mapping = new LinkedHashMap<>(); for (int idx : inputFieldsUsed) { final RexInputRef ref = RexInputRef.of(idx, filter.getRowType().getFieldList()); final Set<RexNode> originalExprs = mq.getExpressionLineage(filter, ref); if (originalExprs == null) { // Bail out return null; } mapping.put(ref, originalExprs); } // Replace with new expressions and return union of predicates final Set<RexNode> allExprs = RelMdExpressionLineage.createAllPossibleExpressions(rexBuilder, pred, mapping); if (allExprs == null) { return null; } return predsBelow.union(rexBuilder, RelOptPredicateList.of(rexBuilder, allExprs)); }
Example 4
Source File: ReduceExpressionsRule.java From Bats with Apache License 2.0 | 5 votes |
@Override public void onMatch(RelOptRuleCall call) { final Join join = call.rel(0); final List<RexNode> expList = Lists.newArrayList(join.getCondition()); final int fieldCount = join.getLeft().getRowType().getFieldCount(); final RelMetadataQuery mq = call.getMetadataQuery(); final RelOptPredicateList leftPredicates = mq.getPulledUpPredicates(join.getLeft()); final RelOptPredicateList rightPredicates = mq.getPulledUpPredicates(join.getRight()); final RexBuilder rexBuilder = join.getCluster().getRexBuilder(); final RelOptPredicateList predicates = leftPredicates.union(rexBuilder, rightPredicates.shift(rexBuilder, fieldCount)); if (!reduceExpressions(join, expList, predicates, true, matchNullability)) { return; } if (join instanceof EquiJoin) { final JoinInfo joinInfo = JoinInfo.of(join.getLeft(), join.getRight(), expList.get(0)); if (!joinInfo.isEqui()) { // This kind of join must be an equi-join, and the condition is // no longer an equi-join. SemiJoin is an example of this. return; } } call.transformTo( join.copy( join.getTraitSet(), expList.get(0), join.getLeft(), join.getRight(), join.getJoinType(), join.isSemiJoinDone())); // New plan is absolutely better than old plan. call.getPlanner().setImportance(join, 0.0); }
Example 5
Source File: RelMdAllPredicates.java From calcite with Apache License 2.0 | 5 votes |
/** * Add the Filter condition to the list obtained from the input. */ public RelOptPredicateList getAllPredicates(Filter filter, RelMetadataQuery mq) { final RelNode input = filter.getInput(); final RexBuilder rexBuilder = filter.getCluster().getRexBuilder(); final RexNode pred = filter.getCondition(); final RelOptPredicateList predsBelow = mq.getAllPredicates(input); if (predsBelow == null) { // Safety check return null; } // Extract input fields referenced by Filter condition final Set<RelDataTypeField> inputExtraFields = new LinkedHashSet<>(); final RelOptUtil.InputFinder inputFinder = new RelOptUtil.InputFinder(inputExtraFields); pred.accept(inputFinder); final ImmutableBitSet inputFieldsUsed = inputFinder.build(); // Infer column origin expressions for given references final Map<RexInputRef, Set<RexNode>> mapping = new LinkedHashMap<>(); for (int idx : inputFieldsUsed) { final RexInputRef ref = RexInputRef.of(idx, filter.getRowType().getFieldList()); final Set<RexNode> originalExprs = mq.getExpressionLineage(filter, ref); if (originalExprs == null) { // Bail out return null; } mapping.put(ref, originalExprs); } // Replace with new expressions and return union of predicates final Set<RexNode> allExprs = RelMdExpressionLineage.createAllPossibleExpressions(rexBuilder, pred, mapping); if (allExprs == null) { return null; } return predsBelow.union(rexBuilder, RelOptPredicateList.of(rexBuilder, allExprs)); }
Example 6
Source File: ReduceExpressionsRule.java From calcite with Apache License 2.0 | 5 votes |
@Override public void onMatch(RelOptRuleCall call) { final Join join = call.rel(0); final List<RexNode> expList = Lists.newArrayList(join.getCondition()); final int fieldCount = join.getLeft().getRowType().getFieldCount(); final RelMetadataQuery mq = call.getMetadataQuery(); final RelOptPredicateList leftPredicates = mq.getPulledUpPredicates(join.getLeft()); final RelOptPredicateList rightPredicates = mq.getPulledUpPredicates(join.getRight()); final RexBuilder rexBuilder = join.getCluster().getRexBuilder(); final RelOptPredicateList predicates = leftPredicates.union(rexBuilder, rightPredicates.shift(rexBuilder, fieldCount)); if (!reduceExpressions(join, expList, predicates, true, matchNullability)) { return; } call.transformTo( join.copy( join.getTraitSet(), expList.get(0), join.getLeft(), join.getRight(), join.getJoinType(), join.isSemiJoinDone())); // New plan is absolutely better than old plan. call.getPlanner().prune(join); }
Example 7
Source File: RelMdAllPredicates.java From Bats with Apache License 2.0 | 4 votes |
/** * Add the Join condition to the list obtained from the input. */ public RelOptPredicateList getAllPredicates(Join join, RelMetadataQuery mq) { if (join.getJoinType() != JoinRelType.INNER) { // We cannot map origin of this expression. return null; } final RexBuilder rexBuilder = join.getCluster().getRexBuilder(); final RexNode pred = join.getCondition(); final Multimap<List<String>, RelTableRef> qualifiedNamesToRefs = HashMultimap.create(); RelOptPredicateList newPreds = RelOptPredicateList.EMPTY; for (RelNode input : join.getInputs()) { final RelOptPredicateList inputPreds = mq.getAllPredicates(input); if (inputPreds == null) { // Bail out return null; } // Gather table references final Set<RelTableRef> tableRefs = mq.getTableReferences(input); if (input == join.getLeft()) { // Left input references remain unchanged for (RelTableRef leftRef : tableRefs) { qualifiedNamesToRefs.put(leftRef.getQualifiedName(), leftRef); } newPreds = newPreds.union(rexBuilder, inputPreds); } else { // Right input references might need to be updated if there are table name // clashes with left input final Map<RelTableRef, RelTableRef> currentTablesMapping = new HashMap<>(); for (RelTableRef rightRef : tableRefs) { int shift = 0; Collection<RelTableRef> lRefs = qualifiedNamesToRefs.get( rightRef.getQualifiedName()); if (lRefs != null) { shift = lRefs.size(); } currentTablesMapping.put(rightRef, RelTableRef.of(rightRef.getTable(), shift + rightRef.getEntityNumber())); } final List<RexNode> updatedPreds = Lists.newArrayList( Iterables.transform(inputPreds.pulledUpPredicates, e -> RexUtil.swapTableReferences(rexBuilder, e, currentTablesMapping))); newPreds = newPreds.union(rexBuilder, RelOptPredicateList.of(rexBuilder, updatedPreds)); } } // Extract input fields referenced by Join condition final Set<RelDataTypeField> inputExtraFields = new LinkedHashSet<>(); final RelOptUtil.InputFinder inputFinder = new RelOptUtil.InputFinder(inputExtraFields); pred.accept(inputFinder); final ImmutableBitSet inputFieldsUsed = inputFinder.inputBitSet.build(); // Infer column origin expressions for given references final Map<RexInputRef, Set<RexNode>> mapping = new LinkedHashMap<>(); for (int idx : inputFieldsUsed) { final RexInputRef inputRef = RexInputRef.of(idx, join.getRowType().getFieldList()); final Set<RexNode> originalExprs = mq.getExpressionLineage(join, inputRef); if (originalExprs == null) { // Bail out return null; } final RexInputRef ref = RexInputRef.of(idx, join.getRowType().getFieldList()); mapping.put(ref, originalExprs); } // Replace with new expressions and return union of predicates final Set<RexNode> allExprs = RelMdExpressionLineage.createAllPossibleExpressions(rexBuilder, pred, mapping); if (allExprs == null) { return null; } return newPreds.union(rexBuilder, RelOptPredicateList.of(rexBuilder, allExprs)); }
Example 8
Source File: RelMdAllPredicates.java From Bats with Apache License 2.0 | 4 votes |
/** * Extract predicates for a Union. */ public RelOptPredicateList getAllPredicates(Union union, RelMetadataQuery mq) { final RexBuilder rexBuilder = union.getCluster().getRexBuilder(); final Multimap<List<String>, RelTableRef> qualifiedNamesToRefs = HashMultimap.create(); RelOptPredicateList newPreds = RelOptPredicateList.EMPTY; for (int i = 0; i < union.getInputs().size(); i++) { final RelNode input = union.getInput(i); final RelOptPredicateList inputPreds = mq.getAllPredicates(input); if (inputPreds == null) { // Bail out return null; } // Gather table references final Set<RelTableRef> tableRefs = mq.getTableReferences(input); if (i == 0) { // Left input references remain unchanged for (RelTableRef leftRef : tableRefs) { qualifiedNamesToRefs.put(leftRef.getQualifiedName(), leftRef); } newPreds = newPreds.union(rexBuilder, inputPreds); } else { // Right input references might need to be updated if there are table name // clashes with left input final Map<RelTableRef, RelTableRef> currentTablesMapping = new HashMap<>(); for (RelTableRef rightRef : tableRefs) { int shift = 0; Collection<RelTableRef> lRefs = qualifiedNamesToRefs.get( rightRef.getQualifiedName()); if (lRefs != null) { shift = lRefs.size(); } currentTablesMapping.put(rightRef, RelTableRef.of(rightRef.getTable(), shift + rightRef.getEntityNumber())); } // Add to existing qualified names for (RelTableRef newRef : currentTablesMapping.values()) { qualifiedNamesToRefs.put(newRef.getQualifiedName(), newRef); } // Update preds final List<RexNode> updatedPreds = Lists.newArrayList( Iterables.transform(inputPreds.pulledUpPredicates, e -> RexUtil.swapTableReferences(rexBuilder, e, currentTablesMapping))); newPreds = newPreds.union(rexBuilder, RelOptPredicateList.of(rexBuilder, updatedPreds)); } } return newPreds; }
Example 9
Source File: RelMdAllPredicates.java From calcite with Apache License 2.0 | 4 votes |
/** * Add the Join condition to the list obtained from the input. */ public RelOptPredicateList getAllPredicates(Join join, RelMetadataQuery mq) { if (join.getJoinType().isOuterJoin()) { // We cannot map origin of this expression. return null; } final RexBuilder rexBuilder = join.getCluster().getRexBuilder(); final RexNode pred = join.getCondition(); final Multimap<List<String>, RelTableRef> qualifiedNamesToRefs = HashMultimap.create(); RelOptPredicateList newPreds = RelOptPredicateList.EMPTY; for (RelNode input : join.getInputs()) { final RelOptPredicateList inputPreds = mq.getAllPredicates(input); if (inputPreds == null) { // Bail out return null; } // Gather table references final Set<RelTableRef> tableRefs = mq.getTableReferences(input); if (input == join.getLeft()) { // Left input references remain unchanged for (RelTableRef leftRef : tableRefs) { qualifiedNamesToRefs.put(leftRef.getQualifiedName(), leftRef); } newPreds = newPreds.union(rexBuilder, inputPreds); } else { // Right input references might need to be updated if there are table name // clashes with left input final Map<RelTableRef, RelTableRef> currentTablesMapping = new HashMap<>(); for (RelTableRef rightRef : tableRefs) { int shift = 0; Collection<RelTableRef> lRefs = qualifiedNamesToRefs.get( rightRef.getQualifiedName()); if (lRefs != null) { shift = lRefs.size(); } currentTablesMapping.put(rightRef, RelTableRef.of(rightRef.getTable(), shift + rightRef.getEntityNumber())); } final List<RexNode> updatedPreds = Lists.newArrayList( Iterables.transform(inputPreds.pulledUpPredicates, e -> RexUtil.swapTableReferences(rexBuilder, e, currentTablesMapping))); newPreds = newPreds.union(rexBuilder, RelOptPredicateList.of(rexBuilder, updatedPreds)); } } // Extract input fields referenced by Join condition final Set<RelDataTypeField> inputExtraFields = new LinkedHashSet<>(); final RelOptUtil.InputFinder inputFinder = new RelOptUtil.InputFinder(inputExtraFields); pred.accept(inputFinder); final ImmutableBitSet inputFieldsUsed = inputFinder.build(); // Infer column origin expressions for given references final Map<RexInputRef, Set<RexNode>> mapping = new LinkedHashMap<>(); final RelDataType fullRowType = SqlValidatorUtil.createJoinType( rexBuilder.getTypeFactory(), join.getLeft().getRowType(), join.getRight().getRowType(), null, ImmutableList.of()); for (int idx : inputFieldsUsed) { final RexInputRef inputRef = RexInputRef.of(idx, fullRowType.getFieldList()); final Set<RexNode> originalExprs = mq.getExpressionLineage(join, inputRef); if (originalExprs == null) { // Bail out return null; } final RexInputRef ref = RexInputRef.of(idx, fullRowType.getFieldList()); mapping.put(ref, originalExprs); } // Replace with new expressions and return union of predicates final Set<RexNode> allExprs = RelMdExpressionLineage.createAllPossibleExpressions(rexBuilder, pred, mapping); if (allExprs == null) { return null; } return newPreds.union(rexBuilder, RelOptPredicateList.of(rexBuilder, allExprs)); }
Example 10
Source File: RelMdAllPredicates.java From calcite with Apache License 2.0 | 4 votes |
/** * Extract predicates for a Union. */ public RelOptPredicateList getAllPredicates(Union union, RelMetadataQuery mq) { final RexBuilder rexBuilder = union.getCluster().getRexBuilder(); final Multimap<List<String>, RelTableRef> qualifiedNamesToRefs = HashMultimap.create(); RelOptPredicateList newPreds = RelOptPredicateList.EMPTY; for (int i = 0; i < union.getInputs().size(); i++) { final RelNode input = union.getInput(i); final RelOptPredicateList inputPreds = mq.getAllPredicates(input); if (inputPreds == null) { // Bail out return null; } // Gather table references final Set<RelTableRef> tableRefs = mq.getTableReferences(input); if (i == 0) { // Left input references remain unchanged for (RelTableRef leftRef : tableRefs) { qualifiedNamesToRefs.put(leftRef.getQualifiedName(), leftRef); } newPreds = newPreds.union(rexBuilder, inputPreds); } else { // Right input references might need to be updated if there are table name // clashes with left input final Map<RelTableRef, RelTableRef> currentTablesMapping = new HashMap<>(); for (RelTableRef rightRef : tableRefs) { int shift = 0; Collection<RelTableRef> lRefs = qualifiedNamesToRefs.get( rightRef.getQualifiedName()); if (lRefs != null) { shift = lRefs.size(); } currentTablesMapping.put(rightRef, RelTableRef.of(rightRef.getTable(), shift + rightRef.getEntityNumber())); } // Add to existing qualified names for (RelTableRef newRef : currentTablesMapping.values()) { qualifiedNamesToRefs.put(newRef.getQualifiedName(), newRef); } // Update preds final List<RexNode> updatedPreds = Lists.newArrayList( Iterables.transform(inputPreds.pulledUpPredicates, e -> RexUtil.swapTableReferences(rexBuilder, e, currentTablesMapping))); newPreds = newPreds.union(rexBuilder, RelOptPredicateList.of(rexBuilder, updatedPreds)); } } return newPreds; }