public boolean compareEqual()

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;
    }