private static boolean compareEquivs()

in ion-java-cli/src/com/amazon/tools/cli/IonJavaCli.java [529:589]


    private static boolean compareEquivs(CompareContext compareContext) throws IOException {
        int i = 0;
        int j = 0;
        List<Event> eventStreamFirst = compareContext.getEventStreamFirst();
        List<Event> eventStreamSecond = compareContext.getEventStreamSecond();
        ComparisonType type = compareContext.getType();

        while (i < eventStreamFirst.size() && j < eventStreamSecond.size()) {
            Event eventFirst = eventStreamFirst.get(i);
            Event eventSecond = eventStreamSecond.get(j);

            if (eventFirst.getEventType() == EventType.STREAM_END
                    && eventSecond.getEventType() == EventType.STREAM_END) {
                break;
            } else if (eventFirst.getEventType() == EventType.STREAM_END
                    || eventSecond.getEventType() == EventType.STREAM_END) {
                setReportInfo(i, j,
                        "The input streams had a different number of comparison sets.", compareContext);
                return type == ComparisonType.NON_EQUIVS;
            } else if (!(eventFirst.getIonType() == IonType.LIST || eventFirst.getIonType() == IonType.SEXP)
                    || !(eventSecond.getIonType() == IonType.LIST || eventSecond.getIonType() == IonType.SEXP)) {
                throw new IonException("Comparison sets must be lists or s-expressions.");
            } else if (isEmbeddedEvent(eventFirst) ^ isEmbeddedEvent(eventSecond)) {
                throw new IonException("Embedded streams set expected.");
            }

            List<Pair> pairsFirst;
            List<Pair> pairsSecond;

            if (isEmbeddedEvent(eventFirst) && isEmbeddedEvent(eventSecond)) {
                pairsFirst = locateEmbeddedStreamBoundaries(eventStreamFirst, i);
                pairsSecond = locateEmbeddedStreamBoundaries(eventStreamSecond, j);
            } else {
                pairsFirst = locateContainerBoundaries(eventStreamFirst, i);
                pairsSecond = locateContainerBoundaries(eventStreamSecond, j);
            }
            i = pairsFirst.size() == 0 ? i + 1 : pairsFirst.get(pairsFirst.size() - 1).right + 1;
            j = pairsSecond.size() == 0 ? j + 1 : pairsSecond.get(pairsSecond.size() - 1).right + 1;

            for (int m = 0; m < pairsFirst.size(); m++) {
                for (int n = 0; n < pairsSecond.size(); n++) {
                    if (compareContext.getType() == ComparisonType.NON_EQUIVS) {
                        if (m == n) continue;
                    }
                    Pair pairFirst = pairsFirst.get(m);
                    Pair pairSecond = pairsSecond.get(n);
                    if (compare(compareContext, pairFirst.left, pairFirst.right, pairSecond.left, pairSecond.right) ^
                            (type == ComparisonType.EQUIVS || type == ComparisonType.EQUIVS_TIMELINE)) {
                        if (type == ComparisonType.NON_EQUIVS) {
                            setReportInfo(pairFirst.left, pairSecond.left,
                                    "Equivalent values in a non-equivs set.", compareContext);
                        }
                        return type == ComparisonType.NON_EQUIVS;
                    }
                }
            }
            i++;
            j++;
        }
        return (type == ComparisonType.EQUIVS || type == ComparisonType.EQUIVS_TIMELINE);
    }