package net.sourceforge.mayfly.evaluation.select; import net.sourceforge.mayfly.MayflyException; import net.sourceforge.mayfly.datastore.Cell; import net.sourceforge.mayfly.evaluation.Expression; import net.sourceforge.mayfly.evaluation.NoColumn; import net.sourceforge.mayfly.evaluation.ResultRow; import net.sourceforge.mayfly.evaluation.expression.SingleColumn; import net.sourceforge.mayfly.evaluation.what.What; public class ColumnOrderItem extends OrderItem { private final SingleColumn column; public ColumnOrderItem(SingleColumn column, boolean ascending) { super(ascending); this.column = column; } @Override protected int compareAscending(What what, Evaluator evaluator, ResultRow first, ResultRow second) { Cell cell1 = column.evaluate(first, evaluator); Cell cell2 = column.evaluate(second, evaluator); return cell1.compareTo(cell2, column.location); } public static int compare(ResultRow first, ResultRow second, Expression column) { Cell cell1 = column.evaluate(first); Cell cell2 = column.evaluate(second); return cell1.compareTo(cell2, column.location); } @Override public void check(ResultRow afterGroupByAndDistinct, ResultRow afterGroupBy, ResultRow afterJoins, Evaluator evaluator) { try { column.evaluate(afterGroupByAndDistinct, evaluator); } catch (NoColumn doesNotSurviveDistinct) { /* We're going to throw some exception, we just need to figure out which one. */ try { column.evaluate(afterGroupBy); } catch (NoColumn doesNotSurviveGroupBy) { column.evaluate(afterJoins); throw new MayflyException(column.displayName() + " is not aggregate or mentioned in GROUP BY", column.location); } throw new MayflyException( "ORDER BY expression " + column.displayName() + " should be in SELECT DISTINCT list", column.location); } } }