public RelNode align(Project rel, List<RelFieldCollation> collations) { // 1) We extract the collations indices boolean containsWindowing = false; for (RexNode childExp : rel.getChildExps()) { if (childExp instanceof RexOver) { // TODO: support propagation for partitioning/ordering in windowing containsWindowing = true; break; } } ImmutableList.Builder<RelFieldCollation> propagateCollations = ImmutableList.builder(); if (!containsWindowing) { for (RelFieldCollation c : collations) { RexNode rexNode = rel.getChildExps().get(c.getFieldIndex()); if (rexNode instanceof RexInputRef) { int newIdx = ((RexInputRef) rexNode).getIndex(); propagateCollations.add(c.copy((newIdx))); } } } // 2) We propagate final RelNode child = dispatchAlign(rel.getInput(), propagateCollations.build()); // 3) Return new Project return rel.copy(rel.getTraitSet(), ImmutableList.of(child)); }
@Override public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); boolean changed = false; final RexBuilder rexBuilder = project.getCluster().getRexBuilder(); List<RexNode> newProjects = new ArrayList<>(); for (RexNode oldNode : project.getProjects()) { RexNode newNode = analyzeRexNode(rexBuilder, oldNode); if (!newNode.toString().equals(oldNode.toString())) { changed = true; newProjects.add(newNode); } else { newProjects.add(oldNode); } } if (!changed) { return; } Project newProject = project.copy(project.getTraitSet(), project.getInput(), newProjects, project.getRowType(), project.getFlags()); call.transformTo(newProject); }
protected void apply(RelOptRuleCall call, Project project, Filter filter, TableScan scan) { RelOptPlanner planner = call.getPlanner(); List<RelOptMaterialization> materializations = (planner instanceof VolcanoPlanner) ? ((VolcanoPlanner) planner).getMaterializations() : ImmutableList.<RelOptMaterialization>of(); if (!materializations.isEmpty()) { RelNode root = project.copy(project.getTraitSet(), Collections.singletonList( filter.copy(filter.getTraitSet(), Collections.singletonList( (RelNode) scan)))); // Costing is done in transformTo(), so we call it repeatedly with all applicable // materialized views and cheapest one will be picked List<RelOptMaterialization> applicableMaterializations = VolcanoPlanner.getApplicableMaterializations(root, materializations); for (RelOptMaterialization materialization : applicableMaterializations) { List<RelNode> subs = new MaterializedViewSubstitutionVisitor( materialization.queryRel, root, relBuilderFactory).go(materialization.tableRel); for (RelNode s : subs) { call.transformTo(s); } } } }
@Override public RelNode convert(RelNode rel) { final Project project = (Project) rel; final RelNode input = project.getInput(); return new StreamsProjectRel(project.getCluster(), project.getTraitSet().replace(StreamsLogicalConvention.INSTANCE), convert(input, input.getTraitSet().replace(StreamsLogicalConvention.INSTANCE)), project.getProjects(), project.getRowType()); } }
public RelNode align(Project rel, List<RelFieldCollation> collations) { // 1) We extract the collations indices boolean containsWindowing = false; for (RexNode childExp : rel.getChildExps()) { if (childExp instanceof RexOver) { // TODO: support propagation for partitioning/ordering in windowing containsWindowing = true; break; } } ImmutableList.Builder<RelFieldCollation> propagateCollations = ImmutableList.builder(); if (!containsWindowing) { for (RelFieldCollation c : collations) { RexNode rexNode = rel.getChildExps().get(c.getFieldIndex()); if (rexNode instanceof RexInputRef) { int newIdx = ((RexInputRef) rexNode).getIndex(); propagateCollations.add(c.copy((newIdx))); } } } // 2) We propagate final RelNode child = dispatchAlign(rel.getInput(), propagateCollations.build()); // 3) Return new Project return rel.copy(rel.getTraitSet(), ImmutableList.of(child)); }
public void onMatch(RelOptRuleCall call) { final Filter filter = call.rel(0); final Project project = call.rel(1); final List<RexNode> newProjects = new ArrayList<>(project.getProjects()); newProjects.add(filter.getCondition()); final RelOptCluster cluster = filter.getCluster(); RelDataType newRowType = cluster.getTypeFactory().builder() .addAll(project.getRowType().getFieldList()) .add("condition", Util.last(newProjects).getType()) .build(); final RelNode newProject = project.copy(project.getTraitSet(), project.getInput(), newProjects, newRowType); final RexInputRef newCondition = cluster.getRexBuilder().makeInputRef(newProject, newProjects.size() - 1); call.transformTo(filter.copy(filter.getTraitSet(), newProject, newCondition)); } }
newCondition); RelNode newProjRel = projectFactory == null ? project.copy(project.getTraitSet(), newFilterRel, project.getProjects(), project.getRowType()) : projectFactory.createProject(newFilterRel, project.getProjects(), project.getRowType().getFieldNames());
newCondition); RelNode newProjRel = projectFactory == null ? project.copy(project.getTraitSet(), newFilterRel, project.getProjects(), project.getRowType()) : projectFactory.createProject(newFilterRel, project.getProjects(), project.getRowType().getFieldNames());
public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); final Sort sort = call.rel(1); if (sort.getClass() != Sort.class) { return; } RelNode newProject = project.copy( project.getTraitSet(), ImmutableList.of(sort.getInput())); final Sort newSort = sort.copy( sort.getTraitSet(), newProject, sort.getCollation(), sort.offset, sort.fetch); call.transformTo(newSort); } }
public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); final Sort sort = call.rel(1); if (sort.getClass() != Sort.class) { return; } RelNode newProject = project.copy( project.getTraitSet(), ImmutableList.of(sort.getInput())); final Sort newSort = sort.copy( sort.getTraitSet(), newProject, sort.getCollation(), sort.offset, sort.fetch); call.transformTo(newSort); } }
final Project newInput = childProject.copy(childProject.getTraitSet(), childProject.getInput(), childProject.getProjects(), rowType); stack.push(new Frame(newInput, frame.fields));
public void onMatch(RelOptRuleCall call) { Project project = call.rel(0); assert isTrivial(project); RelNode stripped = project.getInput(); if (stripped instanceof Project) { // Rename columns of child projection if desired field names are given. Project childProject = (Project) stripped; stripped = childProject.copy(childProject.getTraitSet(), childProject.getInput(), childProject.getProjects(), project.getRowType()); } RelNode child = call.getPlanner().register(stripped, project); call.transformTo(child); }
public void onMatch(RelOptRuleCall call) { Project project = call.rel(0); assert isTrivial(project); RelNode stripped = project.getInput(); if (stripped instanceof Project) { // Rename columns of child projection if desired field names are given. Project childProject = (Project) stripped; stripped = childProject.copy(childProject.getTraitSet(), childProject.getInput(), childProject.getProjects(), project.getRowType()); } RelNode child = call.getPlanner().register(stripped, project); call.transformTo(child); }
final RelNode newProject = project.copy(project.getTraitSet(), ImmutableList.of(Util.last(query.rels))); RelNode newNode = DruidQuery.extendQuery(query, newProject); final RelNode newProject = project.copy(project.getTraitSet(), input, below, builder.build()); final DruidQuery newQuery = DruidQuery.extendQuery(query, newProject); final RelNode newProject2 = project.copy(project.getTraitSet(), newQuery, above, project.getRowType()); call.transformTo(newProject2);
@Override public void onMatch(RelOptRuleCall call) { final Project toTransform = call.rel(0); final RelNode input = toTransform.getInput(); final RelTraitSet traits = toTransform.getTraitSet().plus(Rel.LOGICAL); final RelNode convertedInput = convert(input, input.getTraitSet().plus(Rel.LOGICAL).simplify()); call.transformTo(new ProjectRel(toTransform.getCluster(), traits, convertedInput, toTransform.getProjects(), toTransform.getRowType())); } }
@Override public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); final RelNode input = project.getInput(); final RelTraitSet traits = project.getTraitSet().plus(DrillRel.DRILL_LOGICAL); final RelNode convertedInput = convert(input, input.getTraitSet().plus(DrillRel.DRILL_LOGICAL).simplify()); call.transformTo(new DrillProjectRel( project.getCluster(), traits, convertedInput, project.getProjects(), project.getRowType())); } }
!= null) { final RelNode newProject = project.copy(project.getTraitSet(), ImmutableList.of(Util.last(query.rels))); RelNode newNode = DruidQuery.extendQuery(query, newProject); final RelNode newProject = project.copy(project.getTraitSet(), input, below, builder.build()); final DruidQuery newQuery = DruidQuery.extendQuery(query, newProject); final RelNode newProject2 = project.copy(project.getTraitSet(), newQuery, above, project.getRowType()); call.transformTo(newProject2);
.copy(project.getTraitSet(), ImmutableList.of(Util.last(query.rels))); final DruidQuery newQuery = DruidQuery.extendQuery(query, newProject); call.transformTo(newQuery);
public void onMatch(RelOptRuleCall call) { Project project = call.rel(0); DruidQuery query = call.rel(1); final RelOptCluster cluster = project.getCluster(); final RexBuilder rexBuilder = cluster.getRexBuilder(); if (!DruidQuery.isValidSignature(query.signature() + 'o')) { return; } Pair<ImmutableMap<String, String>, Boolean> scanned = scanProject(query, project); // Only try to push down Project when there will be Post aggregators in result DruidQuery if (scanned.right) { Pair<Project, Project> splitProjectAggregate = splitProject(rexBuilder, query, project, scanned.left, cluster); Project inner = splitProjectAggregate.left; Project outer = splitProjectAggregate.right; DruidQuery newQuery = DruidQuery.extendQuery(query, inner); // When all project get pushed into DruidQuery, the project can be replaced by DruidQuery. if (outer != null) { Project newProject = outer.copy(outer.getTraitSet(), newQuery, outer.getProjects(), outer.getRowType()); call.transformTo(newProject); } else { call.transformTo(newQuery); } } }
? project.copy(project.getTraitSet(), newFilterRel, project.getProjects(), project.getRowType()) : relBuilder.push(newFilterRel)