package net.sourceforge.mayfly.evaluation.select; import net.sourceforge.mayfly.evaluation.ResultRow; import net.sourceforge.mayfly.evaluation.ResultRows; import net.sourceforge.mayfly.evaluation.expression.SingleColumn; import net.sourceforge.mayfly.evaluation.what.What; import net.sourceforge.mayfly.util.ImmutableList; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; public class OrderBy { final ImmutableList<OrderItem> elements; public OrderBy() { this(new ImmutableList<OrderItem>()); } public OrderBy(ImmutableList<OrderItem> elements) { this.elements = elements; } public OrderBy with(SingleColumn column) { return with(new ColumnOrderItem(column, true)); } public OrderBy with(OrderItem item) { return new OrderBy(elements.with(item)); } public Iterator<OrderItem> iterator() { return elements.iterator(); } public ResultRows sort(ResultRows rows, final What what, final Evaluator evaluator) { if (isEmpty()) { return rows; } List rowList = new ArrayList(rows.asList()); Collections.sort(rowList, new Comparator() { public int compare(Object o1, Object o2) { ResultRow first = (ResultRow) o1; ResultRow second = (ResultRow) o2; for (Iterator iter = elements.iterator(); iter.hasNext();) { OrderItem item = (OrderItem) iter.next(); int comparison = item.compareRows(what, evaluator, first, second); if (comparison != 0) { return comparison; } } return 0; } }); return new ResultRows(new ImmutableList(rowList)); } public void check(ResultRow afterGroupByAndDistinct, ResultRow afterGroupBy, ResultRow afterJoins, Evaluator evaluator) { for (OrderItem item : elements) { item.check(afterGroupByAndDistinct, afterGroupBy, afterJoins, evaluator); } } public boolean isEmpty() { return elements.size() == 0; } }