package org.quaere.alias;
import java.util.Comparator;
public class Order<T> {
private final Object item;
private final boolean ascending;
private final Comparator<T> comparator;
private boolean nullsFirst;
Order(Object item, boolean ascending, boolean nullsFirst, Comparator<T> comparator) {
this.item = item;
this.ascending = ascending;
this.nullsFirst = nullsFirst;
this.comparator = comparator;
}
public Order nullsFirst() {
this.nullsFirst = true;
return this;
}
public Order nullsLast() {
this.nullsFirst = false;
return this;
}
Object getItem() {
return item;
}
int compare(T a, T b) {
boolean aNull = a == null, bNull = b == null;
if (aNull || bNull) {
if (aNull == bNull) {
return 0;
}
if (nullsFirst) {
return aNull ? -1 : 1;
} else {
return aNull ? 1 : -1;
}
}
Class clazz = Utils.getHigherClass(a, b);
a = (T) Utils.convert(a, clazz);
b = (T) Utils.convert(b, clazz);
int comp;
if (comparator != null) {
comp = comparator.compare(a, b);
} else if (a instanceof Comparable) {
Comparable ca = (Comparable) a;
comp = ca.compareTo(b);
} else {
comp = a.toString().compareTo(b.toString());
}
return ascending ? comp : -comp;
}
}