package lux.xquery;
import java.util.ArrayList;
import java.util.Collections;
import lux.xpath.AbstractExpression;
import lux.xpath.ExpressionVisitor;
import lux.xpath.LiteralExpression;
public class OrderByClause extends FLWORClause {
private final ArrayList<SortKey> sortKeys;
public OrderByClause(SortKey[] sortKeys) {
this.sortKeys = new ArrayList<SortKey>();
Collections.addAll(this.sortKeys, sortKeys);
}
@Override
public AbstractExpression getSequence() {
return LiteralExpression.EMPTY;
}
@Override
public void setSequence (AbstractExpression seq) {
}
/**
* @return a *mutable* list of the sort keys.
*/
public ArrayList<SortKey> getSortKeys () {
return sortKeys;
}
@Override
public void toString(StringBuilder buf) {
if (sortKeys.isEmpty()) {
return;
}
buf.append ("order by ");
sortKeys.get(0).toString(buf);
for (int i = 1; i < sortKeys.size(); i++) {
buf.append(", ");
sortKeys.get(i).toString(buf);
}
}
@Override
public OrderByClause accept(ExpressionVisitor visitor) {
for (int i = 0; i < sortKeys.size(); i++) {
SortKey sk = sortKeys.get(i);
AbstractExpression key = sk.getKey();
AbstractExpression key2 = key.accept(visitor);
if (key != key2) {
sortKeys.set(i, new SortKey(key2, sk.getOrder(), sk.getCollation(), sk.isEmptyLeast()));
}
}
return visitor.visit(this);
}
}
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */