private static int ionCompareToImpl()

in src/com/amazon/ion/util/Equivalence.java [482:602]


    private static int ionCompareToImpl(final IonValue v1,
                                        final IonValue v2,
                                        final Configuration configuration)
    {
        int result = 0;

        if (v1 == null || v2 == null) {
            if (v1 != null) result = 1;
            if (v2 != null) result = -1;
            // otherwise v1 == v2 == null and result == 0
            return result;
        }

        // check type
        IonType ty1 = v1.getType();
        IonType ty2 = v2.getType();
        result = ty1.compareTo(ty2);

        if (result == 0) {
            boolean bo1 = v1.isNullValue();
            boolean bo2 = v2.isNullValue();

            if (bo1 || bo2) {
                 // null combination case--we already know they are
                 // the same type
                if (!bo1) result = 1;
                if (!bo2) result = -1;
                // othersize they're equal (and null values)
            }
            else {
                // value compare only if both are not null
                switch (ty1)
                {
                case NULL:
                    // never visited, precondition is that both are not null
                    break;
                case BOOL:
                    if (((IonBool) v1).booleanValue()) {
                        result = ((IonBool) v2).booleanValue() ? 0 : 1;
                    }
                    else {
                        result = ((IonBool) v2).booleanValue() ? -1 : 0;
                    }
                    break;
                case INT:
                    result = ((IonInt) v1).bigIntegerValue().compareTo(
                             ((IonInt) v2).bigIntegerValue());
                    break;
                case FLOAT:
                    double double1 = ((IonFloat) v1).doubleValue();
                    double double2 = ((IonFloat) v2).doubleValue();
                    if (configuration.epsilon != null
                            && (double1 == double2 || Math.abs(double1 - double2) <= configuration.epsilon)) {
                        result = 0;
                    } else {
                        result = Double.compare(double1, double2);
                    }
                    break;
                case DECIMAL:
                    assert !PUBLIC_COMPARISON_API; // TODO amzn/ion-java/issues/26
                    result = Decimal.equals(((IonDecimal) v1).decimalValue(),
                                            ((IonDecimal) v2).decimalValue())
                                            ? 0 : 1;
                    break;
                case TIMESTAMP:
                    if (configuration.isStrict) {
                        assert !PUBLIC_COMPARISON_API; // TODO amzn/ion-java/issues/26
                        result = (((IonTimestamp) v1).timestampValue().equals(
                                  ((IonTimestamp) v2).timestampValue())
                                  ? 0 : 1);
                    }
                    else {
                        // This is kind of lying here, the 'strict' boolean
                        // (if false) denotes ONLY that annotations are not
                        // check for equality. But what this is doing here is
                        // that it is also ignoring IonTimesamps' precision and
                        // local offset.
                        result = ((IonTimestamp) v1).timestampValue().compareTo(
                                 ((IonTimestamp) v2).timestampValue());
                    }
                    break;
                case STRING:
                    result = (((IonText) v1).stringValue()).compareTo(
                              ((IonText) v2).stringValue());
                    break;
                case SYMBOL:
                    result = compareSymbolTokens(((IonSymbol) v1).symbolValue(),
                                                 ((IonSymbol) v2).symbolValue());
                    break;
                case BLOB:
                case CLOB:
                    result = compareLobContents((IonLob) v1, (IonLob) v2);
                    break;
                case STRUCT:
                    assert !PUBLIC_COMPARISON_API; // TODO amzn/ion-java/issues/26
                    result = compareStructs((IonStruct) v1,
                                            (IonStruct) v2,
                                            configuration);
                    break;
                case LIST:
                case SEXP:
                case DATAGRAM:
                    result = compareSequences((IonSequence) v1,
                                              (IonSequence) v2,
                                              configuration);
                    break;
                }
            }
        }

        // if the values are otherwise equal, but the caller wants strict
        // comparison, then we check the annotations
        if ((result == 0) && configuration.isStrict) {
            // check tuple equality over the annotations
            // (which are symbol tokens)
            result = compareAnnotations(v1.getTypeAnnotationSymbols(),
                                        v2.getTypeAnnotationSymbols());
        }

        return result;
    }