package ezdb.comparator; import java.util.Comparator; import ezdb.serde.Serde; public class SerdeComparator<O> implements Comparator<byte[]> { private Serde<O> serde; public SerdeComparator(Serde<O> serde) { this.serde = serde; } @Override public final int compare(byte[] o1, byte[] o2) { boolean o1NullOrEmpty = o1 == null || o1.length == 0; boolean o2NullOrEmpty = o2 == null || o2.length == 0; if (o1NullOrEmpty && o2NullOrEmpty) { return 0; } if (o1NullOrEmpty) { return -1; } if (o2NullOrEmpty) { // fix buffer underflow return 1; } Comparable<Object> co1 = toComparable(serde.fromBytes(o1)); Comparable<Object> co2 = toComparable(serde.fromBytes(o2)); return innerCompare(co1, co2); } /** * Override this to customize the comparation itself. E.g. inversing it. */ protected int innerCompare(Comparable<Object> co1, Comparable<Object> co2) { return co1.compareTo(co2); } /** * Override this to customize the comparable object. E.g. getting an inner * object. */ @SuppressWarnings("unchecked") protected Comparable<Object> toComparable(Object fromBytes) { return (Comparable<Object>) fromBytes; } }