public SortRel copy( RelTraitSet traitSet, RelNode newInput, RelCollation newCollation, RexNode offset, RexNode fetch) { assert traitSet.containsIfApplicable(Convention.NONE); return new SortRel(getCluster(), traitSet, newInput, newCollation, offset, fetch); }
/** * Creates a sorter. * * @param cluster Cluster this relational expression belongs to * @param traits Traits * @param child input relational expression * @param collation array of sort specifications * @param offset Expression for number of rows to discard before returning first row * @param fetch Expression for number of rows to fetch */ public SortRel( RelOptCluster cluster, RelTraitSet traits, RelNode child, RelCollation collation, RexNode offset, RexNode fetch) { super(cluster, traits, child); this.collation = collation; this.offset = offset; this.fetch = fetch; assert traits.containsIfApplicable(collation) : "traits=" + traits + ", collation=" + collation; assert !(fetch == null && offset == null && collation.getFieldCollations().isEmpty()) : "trivial sort"; ImmutableList.Builder<RexNode> builder = ImmutableList.builder(); for (RelFieldCollation field : collation.getFieldCollations()) { int index = field.getFieldIndex(); builder.add(cluster.getRexBuilder().makeInputRef(child, index)); } fieldExps = builder.build(); }