package jeql.engine.query;
import java.util.Comparator;
import jeql.api.row.Row;
import jeql.util.TypeUtil;
public class OrderComparator
implements Comparator
{
private int[] colIndex;
private boolean[] orderDir;
public OrderComparator(int[] orderIndexDir)
{
this.colIndex = extractIndex(orderIndexDir);
this.orderDir = extractDir(orderIndexDir);
}
private static int[] extractIndex(int[] orderIndexDir)
{
int[] oi = new int[orderIndexDir.length];
for (int i = 0; i < orderIndexDir.length; i++) {
oi[i] = Math.abs(orderIndexDir[i]) - 1;
}
return oi;
}
private static boolean[] extractDir(int[] orderIndexDir)
{
boolean[] dir = new boolean[orderIndexDir.length];
for (int i = 0; i < orderIndexDir.length; i++) {
dir[i] = orderIndexDir[i] >= 0;
}
return dir;
}
public int compare(Object o1, Object o2)
{
Row r1 = (Row) o1;
Row r2 = (Row) o2;
for (int i = 0; i < colIndex.length; i++) {
Object val1 = r1.getValue(colIndex[i]);
Object val2 = r2.getValue(colIndex[i]);
int comp = compareValue(val1, val2);
if (! orderDir[i])
comp = -1 * comp;
if (comp != 0) return comp;
}
return 0;
}
public int compareValue(Object val1, Object val2)
{
// compare nulls first
if (val1 == null) {
if (val2 == null) return 0;
return -1;
}
if (val2 == null) return 1;
if (val1 instanceof Comparable) {
return ((Comparable) val1).compareTo(val2);
}
return TypeUtil.compareValue(val1, val2);
// throw new IllegalStateException("Column values not comparable");
}
}