in src/main/java/org/apache/commons/jexl3/JexlArithmetic.java [768:833]
private int doCompare(final Object left, final Object right, final JexlOperator operator) {
final boolean strictCast = isStrict(operator);
if (left != null && right != null) {
try {
if (left instanceof BigDecimal || right instanceof BigDecimal) {
final BigDecimal l = toBigDecimal(strictCast, left);
final BigDecimal r = toBigDecimal(strictCast, right);
return l.compareTo(r);
}
if (left instanceof BigInteger || right instanceof BigInteger) {
final BigInteger l = toBigInteger(strictCast, left);
final BigInteger r = toBigInteger(strictCast, right);
return l.compareTo(r);
}
if (isFloatingPoint(left) || isFloatingPoint(right)) {
final double lhs = toDouble(strictCast, left);
final double rhs = toDouble(strictCast, right);
if (Double.isNaN(lhs)) {
if (Double.isNaN(rhs)) {
return 0;
}
return -1;
}
if (Double.isNaN(rhs)) {
// lhs is not NaN
return +1;
}
return Double.compare(lhs, rhs);
}
if (isNumberable(left) || isNumberable(right)) {
final long lhs = toLong(strictCast, left);
final long rhs = toLong(strictCast, right);
return Long.compare(lhs, rhs);
}
if (left instanceof String || right instanceof String) {
return toString(left).compareTo(toString(right));
}
} catch (final CoercionException ignore) {
// ignore it, continue in sequence
}
if (EQ == operator) {
return left.equals(right) ? 0 : -1;
}
if (left instanceof Comparable<?>) {
@SuppressWarnings("unchecked") // OK because of instanceof check above
final Comparable<Object> comparable = (Comparable<Object>) left;
try {
return comparable.compareTo(right);
} catch (final ClassCastException castException) {
// ignore it, continue in sequence
}
}
if (right instanceof Comparable<?>) {
@SuppressWarnings("unchecked") // OK because of instanceof check above
final Comparable<Object> comparable = (Comparable<Object>) right;
try {
return -Integer.signum(comparable.compareTo(left));
} catch (final ClassCastException castException) {
// ignore it, continue in sequence
}
}
}
throw new ArithmeticException("Object comparison:(" + left +
" " + operator.getOperatorSymbol()
+ " " + right + ")");
}