public UnifyResult apply(UnifyIn<ProjectRel, FilterRel> in) { final Pair<RelNode, Integer> queryParent = in.parent(in.query); if (queryParent.left instanceof FilterRel) { final UnifyIn<FilterRel, FilterRel> in2 = in.create((FilterRel) queryParent.left); final FilterRel newFilter = FilterToFilterUnifyRule.INSTANCE.createFilter( in2.query, in2.target); if (newFilter == null) { return null; } return in2.result( in.query.copy( in.query.getTraitSet(), ImmutableList.<RelNode>of(newFilter))); } return null; } }
public void onMatch(RelOptRuleCall call) { ProjectRel project = call.rel(0); SortRel sort = call.rel(1); if (sort.getClass() != SortRel.class) { return; } RelNode newProject = project.copy( project.getTraitSet(), ImmutableList.of(sort.getChild())); final SortRel newSort = sort.copy( sort.getTraitSet(), newProject, sort.getCollation(), sort.offset, sort.fetch); call.transformTo(newSort); } }
public void onMatch(RelOptRuleCall call) { final FilterRel filter = call.rel(0); final ProjectRel project = call.rel(1); final List<RexNode> newProjects = new ArrayList<RexNode>(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.getChild(), newProjects, newRowType); final RexInputRef newCondition = cluster.getRexBuilder().makeInputRef(newProject, newProjects.size() - 1); call.transformTo(new FilterRel(cluster, newProject, newCondition)); } }
sort.fetch); RelNode newProject = project.copy( sort.getTraitSet(), ImmutableList.<RelNode>of(newSort));