package context.arch.discoverer.query.comparison;
public class ValueComparison<T extends Comparable<? super T>> extends AbstractComparison<T, T> {
public static final String EQUAL = "EQUAL";
public static final String DIFFERENT = "DIFFERENT";
public static final String GREATER = "GREATER";
public static final String GREATER_EQUAL = "GREATER_EQUAL";
public static final String LESS = "LESS";
public static final String LESS_EQUAL = "LESS_EQUAL";
public enum Comparison {
EQUAL,
DIFFERENT,
GREATER,
GREATER_EQUAL,
LESS,
LESS_EQUAL;
}
private Comparison comparison;
private ValueComparison(Comparison comparison, Class<T> valueClass) {
super(comparison.toString(), valueClass, valueClass);
this.comparison = comparison;
}
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> ValueComparison<T> instance(Comparison comparison, Class<?> valueClass) {
if (!Comparable.class.isAssignableFrom(valueClass)) { // valueClass not Comparable
return null;
}
return new ValueComparison<T>(comparison, (Class<T>) valueClass);
}
@Override
public Boolean compare(T value1, T value2) {
int comp = value1.compareTo(value2);
switch (comparison) {
case EQUAL:
return comp == 0;
case DIFFERENT:
return comp != 0;
case GREATER:
return comp > 0;
case GREATER_EQUAL:
return comp >= 0;
case LESS:
return comp < 0;
case LESS_EQUAL:
return comp <= 0;
default:
return null; // should never happen
}
}
}