/** * For static schema systems, a filter that is always false or null can be * replaced by a values operator that produces no rows, as the schema * information can just be taken from the input Rel. In dynamic schema * environments, the filter might have an unknown input type, in these cases * they must define a system specific alternative to a Values operator, such * as inserting a limit 0 instead of a filter on top of the original input. * * <p>The default implementation of this method is to call * {@link RelBuilder#empty}, which for the static schema will be optimized * to an empty * {@link org.apache.calcite.rel.core.Values}. * * @param input rel to replace, assumes caller has already determined * equivalence to Values operation for 0 records or a * false filter. * @return equivalent but less expensive replacement rel */ protected RelNode createEmptyRelOrEquivalent(RelOptRuleCall call, Filter input) { return call.builder().push(input).empty().build(); }
/** * For static schema systems, a filter that is always false or null can be * replaced by a values operator that produces no rows, as the schema * information can just be taken from the input Rel. In dynamic schema * environments, the filter might have an unknown input type, in these cases * they must define a system specific alternative to a Values operator, such * as inserting a limit 0 instead of a filter on top of the original input. * * <p>The default implementation of this method is to call * {@link RelBuilder#empty}, which for the static schema will be optimized * to an empty * {@link org.apache.calcite.rel.core.Values}. * * @param input rel to replace, assumes caller has already determined * equivalence to Values operation for 0 records or a * false filter. * @return equivalent but less expensive replacement rel */ protected RelNode createEmptyRelOrEquivalent(RelOptRuleCall call, Filter input) { return call.builder().push(input).empty().build(); }
LogicalAggregate aggr = (LogicalAggregate) call.getRelList().get(0); RelNode input = aggr.getInput(); RelBuilder relBuilder = call.builder(); RexBuilder rexBuilder = aggr.getCluster().getRexBuilder();
RelBuilder relBuilder = call.builder(); relBuilder.push(project.getInput()); relBuilder.project(Pair.left(newProjects), Pair.right(newProjects));
@Override public void onMatch(RelOptRuleCall call) { final Union union = call.rel(0); // First branch is query, second branch is MV RelNode newNode = call.builder() .push(union.getInput(0)) .convert(union.getRowType(), false) .build(); call.transformTo(newNode); }
@Override public void onMatch(RelOptRuleCall call) { final Filter fil = call.rel(0); final TableScan rel = call.rel(1); // Add identity RelBuilder relBuilder = call.builder(); relBuilder.push(rel); List<RexNode> identityFields = relBuilder.fields( ImmutableBitSet.range(0, rel.getRowType().getFieldCount()).asList()); RelNode newRel = relBuilder .project(identityFields, ImmutableList.<String>of(), true) .build(); call.transformTo(fil.copy(fil.getTraitSet(), ImmutableList.of(newRel))); }
@Override public void onMatch(final RelOptRuleCall call) { final Sort sort = call.rel(0); final DruidUnionRel unionRel = call.rel(1); final int limit = RexLiteral.intValue(sort.fetch); final int offset = sort.offset != null ? RexLiteral.intValue(sort.offset) : 0; final DruidUnionRel newUnionRel = DruidUnionRel.create( unionRel.getQueryMaker(), unionRel.getRowType(), unionRel.getInputs(), unionRel.getLimit() >= 0 ? Math.min(limit + offset, unionRel.getLimit()) : limit + offset ); if (offset == 0) { call.transformTo(newUnionRel); } else { call.transformTo( call.builder() .push(newUnionRel) .sortLimit(offset, -1, Collections.emptyList()) .build() ); } } }
.builder() .push(project.getInput()) .project(newProjects);
&& unsupportedNonDistinctAggCallCount == 0 // sum/min/max/count in non-distinct aggregate && nonDistinctAggCallCount > 0) { // one or more non-distinct aggregates final RelBuilder relBuilder = call.builder(); convertSingletonDistinct(relBuilder, aggregate, argLists); call.transformTo(relBuilder.build());
@Override public void onMatch(RelOptRuleCall call) { final Join join = call.rel(0); final HepRelVertex root = (HepRelVertex) call.getPlanner().getRoot(); if (root.getCurrentRel() != join) { // Bail out return; } // The join is the root, but we should always end up with a Project operator // on top. We will add it. RelBuilder relBuilder = call.builder(); relBuilder.push(join); List<RexNode> identityFields = relBuilder.fields( ImmutableBitSet.range(0, join.getRowType().getFieldCount()).asList()); relBuilder.project(identityFields, ImmutableList.<String>of(), true); call.transformTo(relBuilder.build()); }
final RelBuilder relBuilder = ruleCall.builder(); relBuilder.push(oldAggRel.getInput()); final List<RexNode> inputExprs = new ArrayList<>(relBuilder.fields());
public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); final Filter filter = call.rel(1); final RelBuilder builder = call.builder(); List<RexNode> projects = project.getChildExps(); List<RexNode> newProjects = rewriteProjects(projects, filter.getCondition(), builder); if (newProjects == null) { return; } RelNode newProjRel = builder.push(filter) .project(newProjects, project.getRowType().getFieldNames()).build(); call.transformTo(newProjRel); }
call.builder() .push(newAggregate) .project(fixUpProjects)
public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); final Filter filter = call.rel(1); final RelBuilder builder = call.builder(); List<RexNode> projects = project.getChildExps(); List<RexNode> newProjects = rewriteProjects(projects, filter.getCondition(), builder); if (newProjects == null) { return; } RelNode newProjRel = builder.push(filter) .project(newProjects, project.getRowType().getFieldNames()).build(); call.transformTo(newProjRel); }
final RelBuilder relBuilder = call.builder(); relBuilder.push(tableScan); List<RexNode> conds = new ArrayList<>();
public void onMatch(RelOptRuleCall call) { final Project topProject = call.rel(0); final Project bottomProject = call.rel(1); // If top project does not reference any column at the bottom project, // we can just remove botton project final ImmutableBitSet topRefs = RelOptUtil.InputFinder.bits(topProject.getChildExps(), null); if (topRefs.isEmpty()) { RelBuilder relBuilder = call.builder(); relBuilder.push(bottomProject.getInput()); relBuilder.project(topProject.getChildExps()); call.transformTo(relBuilder.build()); return; } super.onMatch(call); }
ImmutableBitSet.range(rightAggregate.getGroupCount())); if(shouldTransform) { final RelBuilder relBuilder = call.builder(); RelNode newRightInput = relBuilder.project(relBuilder.push(rightAggregate.getInput()). fields(rightAggregate.getGroupSet().asList())).build(); RelNode newSemiJoin = call.builder().push(left).push(newRightInput) .semiJoin(semijoin.getCondition()).build(); call.transformTo(newSemiJoin);
final Project swappedProject = swapInputs(join, project, call.builder()); final RelNode swappedJoin = swappedProject.getInput(); assert(swappedJoin instanceof Join);
final RelBuilder relBuilder = call.builder();