private Map<SecondLevelId, Object> getValue() {
        while(true) {
            if (firstVal == null && !firstCursor.hasNext()) {
                return null;
            }
            if (firstVal == null) {
                firstVal = firstCursor.next();
                secondCursor = iterable.iterator();
            }
            while (secondCursor.hasNext()) {
                Map<SecondLevelId, Object> val = Utils.join(firstVal, secondCursor.next());
                if (eqAttrs.execute(val)) {
                    return val;
                }
            }
            firstVal = null;
        }
    }