use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexBuilder in project calcite by apache.
the class JoinPushTransitivePredicatesRule method onMatch.
@Override
public void onMatch(RelOptRuleCall call) {
Join join = call.rel(0);
final RelMetadataQuery mq = call.getMetadataQuery();
RelOptPredicateList preds = mq.getPulledUpPredicates(join);
if (preds.leftInferredPredicates.isEmpty() && preds.rightInferredPredicates.isEmpty()) {
return;
}
final RexBuilder rexBuilder = join.getCluster().getRexBuilder();
final RelBuilder relBuilder = call.builder();
RelNode lChild = join.getLeft();
if (preds.leftInferredPredicates.size() > 0) {
RelNode curr = lChild;
lChild = relBuilder.push(lChild).filter(preds.leftInferredPredicates).build();
call.getPlanner().onCopy(curr, lChild);
}
RelNode rChild = join.getRight();
if (preds.rightInferredPredicates.size() > 0) {
RelNode curr = rChild;
rChild = relBuilder.push(rChild).filter(preds.rightInferredPredicates).build();
call.getPlanner().onCopy(curr, rChild);
}
RelNode newRel = join.copy(join.getTraitSet(), join.getCondition(), lChild, rChild, join.getJoinType(), join.isSemiJoinDone());
call.getPlanner().onCopy(join, newRel);
call.transformTo(newRel);
}
use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexBuilder in project calcite by apache.
the class JoinToCorrelateRule method onMatch.
public void onMatch(RelOptRuleCall call) {
assert matches(call);
final LogicalJoin join = call.rel(0);
RelNode right = join.getRight();
final RelNode left = join.getLeft();
final int leftFieldCount = left.getRowType().getFieldCount();
final RelOptCluster cluster = join.getCluster();
final RexBuilder rexBuilder = cluster.getRexBuilder();
final RelBuilder relBuilder = call.builder();
final CorrelationId correlationId = cluster.createCorrel();
final RexNode corrVar = rexBuilder.makeCorrel(left.getRowType(), correlationId);
final ImmutableBitSet.Builder requiredColumns = ImmutableBitSet.builder();
// Replace all references of left input with FieldAccess(corrVar, field)
final RexNode joinCondition = join.getCondition().accept(new RexShuttle() {
@Override
public RexNode visitInputRef(RexInputRef input) {
int field = input.getIndex();
if (field >= leftFieldCount) {
return rexBuilder.makeInputRef(input.getType(), input.getIndex() - leftFieldCount);
}
requiredColumns.set(field);
return rexBuilder.makeFieldAccess(corrVar, field);
}
});
relBuilder.push(right).filter(joinCondition);
RelNode newRel = LogicalCorrelate.create(left, relBuilder.build(), correlationId, requiredColumns.build(), SemiJoinType.of(join.getJoinType()));
call.transformTo(newRel);
}
use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexBuilder in project calcite by apache.
the class JoinToMultiJoinRule method onMatch.
// ~ Methods ----------------------------------------------------------------
public void onMatch(RelOptRuleCall call) {
final Join origJoin = call.rel(0);
final RelNode left = call.rel(1);
final RelNode right = call.rel(2);
// combine the children MultiJoin inputs into an array of inputs
// for the new MultiJoin
final List<ImmutableBitSet> projFieldsList = Lists.newArrayList();
final List<int[]> joinFieldRefCountsList = Lists.newArrayList();
final List<RelNode> newInputs = combineInputs(origJoin, left, right, projFieldsList, joinFieldRefCountsList);
// combine the outer join information from the left and right
// inputs, and include the outer join information from the current
// join, if it's a left/right outer join
final List<Pair<JoinRelType, RexNode>> joinSpecs = Lists.newArrayList();
combineOuterJoins(origJoin, newInputs, left, right, joinSpecs);
// pull up the join filters from the children MultiJoinRels and
// combine them with the join filter associated with this LogicalJoin to
// form the join filter for the new MultiJoin
List<RexNode> newJoinFilters = combineJoinFilters(origJoin, left, right);
// add on the join field reference counts for the join condition
// associated with this LogicalJoin
final ImmutableMap<Integer, ImmutableIntList> newJoinFieldRefCountsMap = addOnJoinFieldRefCounts(newInputs, origJoin.getRowType().getFieldCount(), origJoin.getCondition(), joinFieldRefCountsList);
List<RexNode> newPostJoinFilters = combinePostJoinFilters(origJoin, left, right);
final RexBuilder rexBuilder = origJoin.getCluster().getRexBuilder();
RelNode multiJoin = new MultiJoin(origJoin.getCluster(), newInputs, RexUtil.composeConjunction(rexBuilder, newJoinFilters, false), origJoin.getRowType(), origJoin.getJoinType() == JoinRelType.FULL, Pair.right(joinSpecs), Pair.left(joinSpecs), projFieldsList, newJoinFieldRefCountsMap, RexUtil.composeConjunction(rexBuilder, newPostJoinFilters, true));
call.transformTo(multiJoin);
}
use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexBuilder in project calcite by apache.
the class LoptOptimizeJoinRule method addAdditionalFilters.
/**
* Determines whether any additional filters are applicable to a join tree.
* If there are any, creates a filter node on top of the join tree with the
* additional filters.
*
* @param relBuilder Builder holding current join tree
* @param multiJoin join factors being optimized
* @param left left side of join tree
* @param right right side of join tree
* @param filtersToAdd remaining filters
*/
private void addAdditionalFilters(RelBuilder relBuilder, LoptMultiJoin multiJoin, LoptJoinTree left, LoptJoinTree right, List<RexNode> filtersToAdd) {
RexNode filterCond = addFilters(multiJoin, left, -1, right, filtersToAdd, false);
if (!filterCond.isAlwaysTrue()) {
// adjust the filter to reflect the outer join output
int[] adjustments = new int[multiJoin.getNumTotalFields()];
if (needsAdjustment(multiJoin, adjustments, left, right, false)) {
RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder();
filterCond = filterCond.accept(new RelOptUtil.RexInputConverter(rexBuilder, multiJoin.getMultiJoinFields(), relBuilder.peek().getRowType().getFieldList(), adjustments));
relBuilder.filter(filterCond);
}
}
}
use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexBuilder in project calcite by apache.
the class LoptOptimizeJoinRule method addFilters.
/**
* Determines which join filters can be added to the current join tree. Note
* that the join filter still reflects the original join ordering. It will
* only be adjusted to reflect the new join ordering if the "adjust"
* parameter is set to true.
*
* @param multiJoin join factors being optimized
* @param leftTree left subtree of the join tree
* @param leftIdx if ≥ 0, only consider filters that reference leftIdx in
* leftTree; otherwise, consider all filters that reference any factor in
* leftTree
* @param rightTree right subtree of the join tree
* @param filtersToAdd remaining join filters that need to be added; those
* that are added are removed from the list
* @param adjust if true, adjust filter to reflect new join ordering
*
* @return AND'd expression of the join filters that can be added to the
* current join tree
*/
private RexNode addFilters(LoptMultiJoin multiJoin, LoptJoinTree leftTree, int leftIdx, LoptJoinTree rightTree, List<RexNode> filtersToAdd, boolean adjust) {
// loop through the remaining filters to be added and pick out the
// ones that reference only the factors in the new join tree
final RexBuilder rexBuilder = multiJoin.getMultiJoinRel().getCluster().getRexBuilder();
final ImmutableBitSet.Builder childFactorBuilder = ImmutableBitSet.builder();
childFactorBuilder.addAll(rightTree.getTreeOrder());
if (leftIdx >= 0) {
childFactorBuilder.set(leftIdx);
} else {
childFactorBuilder.addAll(leftTree.getTreeOrder());
}
for (int child : rightTree.getTreeOrder()) {
childFactorBuilder.set(child);
}
final ImmutableBitSet childFactor = childFactorBuilder.build();
RexNode condition = null;
final ListIterator<RexNode> filterIter = filtersToAdd.listIterator();
while (filterIter.hasNext()) {
RexNode joinFilter = filterIter.next();
ImmutableBitSet filterBitmap = multiJoin.getFactorsRefByJoinFilter(joinFilter);
// AND the filter to the current join condition
if (childFactor.contains(filterBitmap)) {
if (condition == null) {
condition = joinFilter;
} else {
condition = rexBuilder.makeCall(SqlStdOperatorTable.AND, condition, joinFilter);
}
filterIter.remove();
}
}
if (adjust && (condition != null)) {
int[] adjustments = new int[multiJoin.getNumTotalFields()];
if (needsAdjustment(multiJoin, adjustments, leftTree, rightTree, false)) {
condition = condition.accept(new RelOptUtil.RexInputConverter(rexBuilder, multiJoin.getMultiJoinFields(), leftTree.getJoinTree().getRowType().getFieldList(), rightTree.getJoinTree().getRowType().getFieldList(), adjustments));
}
}
if (condition == null) {
condition = rexBuilder.makeLiteral(true);
}
return condition;
}
Aggregations