in empire-db/src/main/java/org/apache/empire/commons/ValueUtils.java [145:213]
public boolean compareEqual(Object o1, Object o2)
{
// simple case
if (o1==o2)
return true;
// Check for Empty Values
if (isEmpty(o1))
return isEmpty(o2);
if (isEmpty(o2))
return isEmpty(o1);
// Check classes
if (o1.getClass().equals(o2.getClass()))
{ // Check simple array
if ((o1 instanceof Object[]) && (o2 instanceof Object[]))
return compareEqual(o1, o2);
// Check if object implements comparable
if (o1 instanceof Comparable)
return (((Comparable<Object>)o1).compareTo(o2)==0);
else
return o1.equals(o2);
}
// Classes don't match
// Use equal check first
if (o1.equals(o2) || o2.equals(o1))
return true;
// DBExpr
if ((o1 instanceof DBExpr) || (o2 instanceof DBExpr))
return false;
// Compare Numbers
if (o1 instanceof Number && o2 instanceof Number)
{ // boolean test = obj1.equals(obj2);
double d1 = ((Number)o1).doubleValue();
double d2 = ((Number)o2).doubleValue();
return (d1==d2);
}
// Compare Date with LocalDate / LocalDateTime
if (o1 instanceof Temporal && o2 instanceof Date)
{ // swap
Object tmp = o2; o2 = o1; o1 = tmp;
}
if (o1 instanceof Date && o2 instanceof LocalDate)
return o1.equals(DateUtils.toDate((LocalDate)o2));
if (o1 instanceof Date && o2 instanceof LocalDateTime)
return o1.equals(DateUtils.toDate((LocalDateTime)o2));
// Enum
if (o1 instanceof Enum<?>)
{ // Special enum handling
if (o2 instanceof Number)
return ((Enum<?>)o1).ordinal()==((Number)o2).intValue();
// Compare Strings
String strVal = enumToString((Enum<?>)o1);
return StringUtils.compareEqual(strVal, toString(o2));
}
else if (o2 instanceof Enum<?>)
{ // Special enum handling
if (o1 instanceof Number)
return ((Enum<?>)o2).ordinal()==((Number)o1).intValue();
// Compare Strings
String strVal = enumToString((Enum<?>)o2);
return StringUtils.compareEqual(strVal, toString(o1));
}
// Compare Strings
if (o1 instanceof String)
return ((String)o1).equals(o2.toString());
if (o2 instanceof String)
return ((String)o2).equals(o1.toString());
// Not equal
return false;
}