Search in sources :

Example 66 with Join

use of org.apache.calcite.rel.core.Join in project calcite by apache.

the class JoinCommuteRule method swap.

/**
 * Returns a relational expression with the inputs switched round. Does not
 * modify <code>join</code>. Returns null if the join cannot be swapped (for
 * example, because it is an outer join).
 *
 * @param join              join to be swapped
 * @param swapOuterJoins    whether outer joins should be swapped
 * @param relBuilder        Builder for relational expressions
 * @return swapped join if swapping possible; else null
 */
public static RelNode swap(Join join, boolean swapOuterJoins, RelBuilder relBuilder) {
    final JoinRelType joinType = join.getJoinType();
    if (!swapOuterJoins && joinType != JoinRelType.INNER) {
        return null;
    }
    final RexBuilder rexBuilder = join.getCluster().getRexBuilder();
    final RelDataType leftRowType = join.getLeft().getRowType();
    final RelDataType rightRowType = join.getRight().getRowType();
    final VariableReplacer variableReplacer = new VariableReplacer(rexBuilder, leftRowType, rightRowType);
    final RexNode oldCondition = join.getCondition();
    RexNode condition = variableReplacer.go(oldCondition);
    // NOTE jvs 14-Mar-2006: We preserve attribute semiJoinDone after the
    // swap.  This way, we will generate one semijoin for the original
    // join, and one for the swapped join, and no more.  This
    // doesn't prevent us from seeing any new combinations assuming
    // that the planner tries the desired order (semijoins after swaps).
    Join newJoin = join.copy(join.getTraitSet(), condition, join.getRight(), join.getLeft(), joinType.swap(), join.isSemiJoinDone());
    final List<RexNode> exps = RelOptUtil.createSwappedJoinExprs(newJoin, join, true);
    return relBuilder.push(newJoin).project(exps, join.getRowType().getFieldNames()).build();
}
Also used : JoinRelType(org.apache.calcite.rel.core.JoinRelType) RexBuilder(org.apache.calcite.rex.RexBuilder) Join(org.apache.calcite.rel.core.Join) LogicalJoin(org.apache.calcite.rel.logical.LogicalJoin) RelDataType(org.apache.calcite.rel.type.RelDataType) RexNode(org.apache.calcite.rex.RexNode)

Example 67 with Join

use of org.apache.calcite.rel.core.Join in project calcite by apache.

the class JoinCommuteRule method onMatch.

public void onMatch(final RelOptRuleCall call) {
    Join join = call.rel(0);
    if (!join.getSystemFieldList().isEmpty()) {
        // FIXME Enable this rule for joins with system fields
        return;
    }
    final RelNode swapped = swap(join, this.swapOuter, call.builder());
    if (swapped == null) {
        return;
    }
    // The result is either a Project or, if the project is trivial, a
    // raw Join.
    final Join newJoin = swapped instanceof Join ? (Join) swapped : (Join) swapped.getInput(0);
    call.transformTo(swapped);
    // We have converted join='a join b' into swapped='select
    // a0,a1,a2,b0,b1 from b join a'. Now register that project='select
    // b0,b1,a0,a1,a2 from (select a0,a1,a2,b0,b1 from b join a)' is the
    // same as 'b join a'. If we didn't do this, the swap join rule
    // would fire on the new join, ad infinitum.
    final RelBuilder relBuilder = call.builder();
    final List<RexNode> exps = RelOptUtil.createSwappedJoinExprs(newJoin, join, false);
    relBuilder.push(swapped).project(exps, newJoin.getRowType().getFieldNames());
    call.getPlanner().ensureRegistered(relBuilder.build(), newJoin);
}
Also used : RelBuilder(org.apache.calcite.tools.RelBuilder) RelNode(org.apache.calcite.rel.RelNode) Join(org.apache.calcite.rel.core.Join) LogicalJoin(org.apache.calcite.rel.logical.LogicalJoin) RexNode(org.apache.calcite.rex.RexNode)

Example 68 with Join

use of org.apache.calcite.rel.core.Join in project druid by druid-io.

the class DruidJoinRule method matches.

@Override
public boolean matches(RelOptRuleCall call) {
    final Join join = call.rel(0);
    final DruidRel<?> left = call.rel(1);
    final DruidRel<?> right = call.rel(2);
    // 3) Right has a PartialDruidQuery (i.e., is a real query, not top-level UNION ALL).
    return canHandleCondition(join.getCondition(), join.getLeft().getRowType(), right) && left.getPartialDruidQuery() != null && right.getPartialDruidQuery() != null;
}
Also used : Join(org.apache.calcite.rel.core.Join)

Example 69 with Join

use of org.apache.calcite.rel.core.Join in project druid by druid-io.

the class FilterJoinExcludePushToChildRule method removeRedundantIsNotNullFilters.

/**
 * This tries to find all the 'IS NOT NULL' filters in an inner join whose checking column is also
 * a part of an equi-condition between the two tables. It removes such 'IS NOT NULL' filters from join since
 * the equi-condition will never return true for null input, thus making the 'IS NOT NULL' filter a no-op.
 * @param joinFilters
 * @param joinType
 * @param isSqlCompatible
 */
static void removeRedundantIsNotNullFilters(List<RexNode> joinFilters, JoinRelType joinType, boolean isSqlCompatible) {
    if (joinType != JoinRelType.INNER || !isSqlCompatible) {
        // only works for inner joins in SQL mode
        return;
    }
    ImmutableList.Builder<RexNode> isNotNullFiltersBuilder = ImmutableList.builder();
    ImmutableList.Builder<Pair<RexNode, RexNode>> equalityFiltersOperandBuilder = ImmutableList.builder();
    joinFilters.stream().filter(joinFilter -> joinFilter instanceof RexCall).forEach(joinFilter -> {
        if (joinFilter.isA(SqlKind.IS_NOT_NULL)) {
            isNotNullFiltersBuilder.add(joinFilter);
        } else if (joinFilter.isA(SqlKind.EQUALS)) {
            List<RexNode> operands = ((RexCall) joinFilter).getOperands();
            if (operands.size() == 2 && operands.stream().noneMatch(Objects::isNull)) {
                equalityFiltersOperandBuilder.add(new Pair<>(operands.get(0), operands.get(1)));
            }
        }
    });
    List<Pair<RexNode, RexNode>> equalityFilters = equalityFiltersOperandBuilder.build();
    ImmutableList.Builder<RexNode> removableFilters = ImmutableList.builder();
    for (RexNode isNotNullFilter : isNotNullFiltersBuilder.build()) {
        List<RexNode> operands = ((RexCall) isNotNullFilter).getOperands();
        boolean canDrop = false;
        for (Pair<RexNode, RexNode> equalityFilterOperands : equalityFilters) {
            if ((equalityFilterOperands.lhs != null && equalityFilterOperands.lhs.equals(operands.get(0))) || (equalityFilterOperands.rhs != null && equalityFilterOperands.rhs.equals(operands.get(0)))) {
                canDrop = true;
                break;
            }
        }
        if (canDrop) {
            removableFilters.add(isNotNullFilter);
        }
    }
    joinFilters.removeAll(removableFilters.build());
}
Also used : RelFactories(org.apache.calcite.rel.core.RelFactories) Filter(org.apache.calcite.rel.core.Filter) RelOptUtil(org.apache.calcite.plan.RelOptUtil) Join(org.apache.calcite.rel.core.Join) Pair(org.apache.druid.java.util.common.Pair) ArrayList(java.util.ArrayList) RexUtil(org.apache.calcite.rex.RexUtil) ImmutableList(com.google.common.collect.ImmutableList) EnumerableConvention(org.apache.calcite.adapter.enumerable.EnumerableConvention) RelOptRuleOperand(org.apache.calcite.plan.RelOptRuleOperand) RexNode(org.apache.calcite.rex.RexNode) RelBuilder(org.apache.calcite.tools.RelBuilder) RelBuilderFactory(org.apache.calcite.tools.RelBuilderFactory) RelDataType(org.apache.calcite.rel.type.RelDataType) SqlKind(org.apache.calcite.sql.SqlKind) RexBuilder(org.apache.calcite.rex.RexBuilder) RelNode(org.apache.calcite.rel.RelNode) Sets(com.google.common.collect.Sets) RelOptRuleCall(org.apache.calcite.plan.RelOptRuleCall) Objects(java.util.Objects) RelOptRule(org.apache.calcite.plan.RelOptRule) List(java.util.List) FilterJoinRule(org.apache.calcite.rel.rules.FilterJoinRule) NullHandling(org.apache.druid.common.config.NullHandling) JoinRelType(org.apache.calcite.rel.core.JoinRelType) RexCall(org.apache.calcite.rex.RexCall) ImmutableList(com.google.common.collect.ImmutableList) RexCall(org.apache.calcite.rex.RexCall) Objects(java.util.Objects) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) RexNode(org.apache.calcite.rex.RexNode) Pair(org.apache.druid.java.util.common.Pair)

Example 70 with Join

use of org.apache.calcite.rel.core.Join in project flink by apache.

the class RelDecorrelator method decorrelate.

protected RelNode decorrelate(RelNode root) {
    // first adjust count() expression if any
    final RelBuilderFactory f = relBuilderFactory();
    HepProgram program = HepProgram.builder().addRuleInstance(AdjustProjectForCountAggregateRule.config(false, this, f).toRule()).addRuleInstance(AdjustProjectForCountAggregateRule.config(true, this, f).toRule()).addRuleInstance(FilterJoinRule.FilterIntoJoinRule.Config.DEFAULT.withRelBuilderFactory(f).withOperandSupplier(b0 -> b0.operand(Filter.class).oneInput(b1 -> b1.operand(Join.class).anyInputs())).withDescription("FilterJoinRule:filter").as(FilterJoinRule.FilterIntoJoinRule.Config.class).withSmart(true).withPredicate((join, joinType, exp) -> true).as(FilterJoinRule.FilterIntoJoinRule.Config.class).toRule()).addRuleInstance(CoreRules.FILTER_PROJECT_TRANSPOSE.config.withRelBuilderFactory(f).as(FilterProjectTransposeRule.Config.class).withOperandFor(Filter.class, filter -> !RexUtil.containsCorrelation(filter.getCondition()), Project.class, project -> true).withCopyFilter(true).withCopyProject(true).toRule()).addRuleInstance(FilterCorrelateRule.Config.DEFAULT.withRelBuilderFactory(f).toRule()).build();
    HepPlanner planner = createPlanner(program);
    planner.setRoot(root);
    root = planner.findBestExp();
    // Perform decorrelation.
    map.clear();
    final Frame frame = getInvoke(root, null);
    if (frame != null) {
        // has been rewritten; apply rules post-decorrelation
        final HepProgram program2 = HepProgram.builder().addRuleInstance(CoreRules.FILTER_INTO_JOIN.config.withRelBuilderFactory(f).toRule()).addRuleInstance(CoreRules.JOIN_CONDITION_PUSH.config.withRelBuilderFactory(f).toRule()).build();
        final HepPlanner planner2 = createPlanner(program2);
        final RelNode newRoot = frame.r;
        planner2.setRoot(newRoot);
        return planner2.findBestExp();
    }
    return root;
}
Also used : RelBuilderFactory(org.apache.calcite.tools.RelBuilderFactory) Values(org.apache.calcite.rel.core.Values) Mappings(org.apache.calcite.util.mapping.Mappings) MultimapBuilder(com.google.common.collect.MultimapBuilder) BigDecimal(java.math.BigDecimal) CorrelationId(org.apache.calcite.rel.core.CorrelationId) Map(java.util.Map) ImmutableBitSet(org.apache.calcite.util.ImmutableBitSet) ImmutableBeans(org.apache.calcite.util.ImmutableBeans) Function2(org.apache.calcite.linq4j.function.Function2) SqlKind(org.apache.calcite.sql.SqlKind) RexVisitorImpl(org.apache.calcite.rex.RexVisitorImpl) SqlCountAggFunction(org.apache.calcite.sql.fun.SqlCountAggFunction) Set(java.util.Set) SqlExplainLevel(org.apache.calcite.sql.SqlExplainLevel) RelMetadataQuery(org.apache.calcite.rel.metadata.RelMetadataQuery) SqlStdOperatorTable(org.apache.calcite.sql.fun.SqlStdOperatorTable) RelCollation(org.apache.calcite.rel.RelCollation) RexCorrelVariable(org.apache.calcite.rex.RexCorrelVariable) HepRelVertex(org.apache.calcite.plan.hep.HepRelVertex) RexCall(org.apache.calcite.rex.RexCall) Iterables(com.google.common.collect.Iterables) Holder(org.apache.calcite.util.Holder) Correlate(org.apache.calcite.rel.core.Correlate) Ord(org.apache.calcite.linq4j.Ord) Filter(org.apache.calcite.rel.core.Filter) Join(org.apache.calcite.rel.core.Join) ArrayList(java.util.ArrayList) LogicalCorrelate(org.apache.calcite.rel.logical.LogicalCorrelate) ReflectiveVisitor(org.apache.calcite.util.ReflectiveVisitor) ImmutableSortedMap(com.google.common.collect.ImmutableSortedMap) ImmutableSortedSet(com.google.common.collect.ImmutableSortedSet) RelDataType(org.apache.calcite.rel.type.RelDataType) BiRel(org.apache.calcite.rel.BiRel) FilterProjectTransposeRule(org.apache.calcite.rel.rules.FilterProjectTransposeRule) RelRule(org.apache.calcite.plan.RelRule) Aggregate(org.apache.calcite.rel.core.Aggregate) RelHomogeneousShuttle(org.apache.calcite.rel.RelHomogeneousShuttle) LogicalAggregate(org.apache.calcite.rel.logical.LogicalAggregate) SqlFunction(org.apache.calcite.sql.SqlFunction) TreeMap(java.util.TreeMap) CalciteTrace(org.apache.calcite.util.trace.CalciteTrace) JoinRelType(org.apache.calcite.rel.core.JoinRelType) AggregateCall(org.apache.calcite.rel.core.AggregateCall) RelDataTypeFactory(org.apache.calcite.rel.type.RelDataTypeFactory) LogicalFilter(org.apache.calcite.rel.logical.LogicalFilter) RelFactories(org.apache.calcite.rel.core.RelFactories) RelOptCostImpl(org.apache.calcite.plan.RelOptCostImpl) LogicalTableFunctionScan(org.apache.calcite.rel.logical.LogicalTableFunctionScan) RelMdUtil(org.apache.calcite.rel.metadata.RelMdUtil) RexUtil(org.apache.calcite.rex.RexUtil) LogicalJoin(org.apache.calcite.rel.logical.LogicalJoin) RexNode(org.apache.calcite.rex.RexNode) RelBuilder(org.apache.calcite.tools.RelBuilder) HepProgram(org.apache.calcite.plan.hep.HepProgram) RelOptCluster(org.apache.calcite.plan.RelOptCluster) Litmus(org.apache.calcite.util.Litmus) ImmutableSet(com.google.common.collect.ImmutableSet) SortedSetMultimap(com.google.common.collect.SortedSetMultimap) ImmutableMap(com.google.common.collect.ImmutableMap) RexLiteral(org.apache.calcite.rex.RexLiteral) Collection(java.util.Collection) Context(org.apache.calcite.plan.Context) NavigableMap(java.util.NavigableMap) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) RexInputRef(org.apache.calcite.rex.RexInputRef) Objects(java.util.Objects) List(java.util.List) FilterJoinRule(org.apache.calcite.rel.rules.FilterJoinRule) Sort(org.apache.calcite.rel.core.Sort) RelDataTypeField(org.apache.calcite.rel.type.RelDataTypeField) SqlExplainFormat(org.apache.calcite.sql.SqlExplainFormat) SortedMap(java.util.SortedMap) Project(org.apache.calcite.rel.core.Project) RexFieldAccess(org.apache.calcite.rex.RexFieldAccess) HashMap(java.util.HashMap) Multimap(com.google.common.collect.Multimap) RelOptUtil(org.apache.calcite.plan.RelOptUtil) SqlSingleValueAggFunction(org.apache.calcite.sql.fun.SqlSingleValueAggFunction) HashSet(java.util.HashSet) ImmutableList(com.google.common.collect.ImmutableList) LogicalSnapshot(org.apache.calcite.rel.logical.LogicalSnapshot) Pair(org.apache.calcite.util.Pair) RelBuilderFactory(org.apache.calcite.tools.RelBuilderFactory) SqlOperator(org.apache.calcite.sql.SqlOperator) Nonnull(javax.annotation.Nonnull) Logger(org.slf4j.Logger) LogicalProject(org.apache.calcite.rel.logical.LogicalProject) RexBuilder(org.apache.calcite.rex.RexBuilder) RexSubQuery(org.apache.calcite.rex.RexSubQuery) HepPlanner(org.apache.calcite.plan.hep.HepPlanner) RelNode(org.apache.calcite.rel.RelNode) RelOptRuleCall(org.apache.calcite.plan.RelOptRuleCall) ReflectUtil(org.apache.calcite.util.ReflectUtil) CoreRules(org.apache.calcite.rel.rules.CoreRules) FilterCorrelateRule(org.apache.calcite.rel.rules.FilterCorrelateRule) RexShuttle(org.apache.calcite.rex.RexShuttle) Util(org.apache.calcite.util.Util) Collections(java.util.Collections) HepProgram(org.apache.calcite.plan.hep.HepProgram) RelNode(org.apache.calcite.rel.RelNode) Join(org.apache.calcite.rel.core.Join) LogicalJoin(org.apache.calcite.rel.logical.LogicalJoin) FilterJoinRule(org.apache.calcite.rel.rules.FilterJoinRule) HepPlanner(org.apache.calcite.plan.hep.HepPlanner)

Aggregations

Join (org.apache.calcite.rel.core.Join)73 RelNode (org.apache.calcite.rel.RelNode)45 RexNode (org.apache.calcite.rex.RexNode)40 ArrayList (java.util.ArrayList)28 LogicalJoin (org.apache.calcite.rel.logical.LogicalJoin)25 Project (org.apache.calcite.rel.core.Project)22 RexBuilder (org.apache.calcite.rex.RexBuilder)20 ImmutableBitSet (org.apache.calcite.util.ImmutableBitSet)18 RelBuilder (org.apache.calcite.tools.RelBuilder)17 HiveJoin (org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin)14 Aggregate (org.apache.calcite.rel.core.Aggregate)13 Filter (org.apache.calcite.rel.core.Filter)12 SemiJoin (org.apache.calcite.rel.core.SemiJoin)11 RelOptCluster (org.apache.calcite.plan.RelOptCluster)10 JoinRelType (org.apache.calcite.rel.core.JoinRelType)9 RelMetadataQuery (org.apache.calcite.rel.metadata.RelMetadataQuery)9 Mappings (org.apache.calcite.util.mapping.Mappings)9 List (java.util.List)8 LogicalProject (org.apache.calcite.rel.logical.LogicalProject)8 RelDataType (org.apache.calcite.rel.type.RelDataType)8