Ticket #20424: 20424.patch

File 20424.patch, 3.6 KB (added by GerdP, 3 years ago)

simple approach which may produce duplicate error messages

  • src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java

     
    179179    private MultiMap<RelationPair, OsmPrimitive> relations;
    180180
    181181    /** MultiMap of all relations, regardless of keys */
    182     private MultiMap<List<RelationMember>, OsmPrimitive> relationsNoKeys;
     182    private MultiMap<List<RelationMember>, Relation> relationsNoKeys;
    183183
    184184    /** List of keys without useful information */
    185185    private final Set<String> ignoreKeys = new HashSet<>(AbstractPrimitive.getUninterestingKeys());
     
    211211            }
    212212        }
    213213        relations = null;
    214         for (Set<OsmPrimitive> duplicated : relationsNoKeys.values()) {
     214        for (Set<Relation> duplicated : relationsNoKeys.values()) {
    215215            if (duplicated.size() > 1) {
    216                 TestError testError = TestError.builder(this, Severity.OTHER, SAME_RELATION)
    217                         .message(tr("Relations with same members"))
     216                Set<Relation> realDups = compareKeys(duplicated);
     217                if (realDups.size() < duplicated.size()) {
     218                    TestError testError = TestError.builder(this, Severity.OTHER, SAME_RELATION)
     219                            .message(tr("Relations with same members"))
     220                            .primitives(duplicated)
     221                            .build();
     222                    errors.add(testError);
     223                }
     224            }
     225        }
     226        relationsNoKeys = null;
     227        super.endTest();
     228    }
     229
     230    private Set<Relation> compareKeys(Set<Relation> sameMembers) {
     231        Set<Relation> realDups = new HashSet<>();
     232        MultiMap<Map<String, String>, Relation> sameKeys = new MultiMap<>();
     233        for (Relation r :sameMembers) {
     234            Map<String, String> rkeys = r.getKeys();
     235            for (String key : ignoreKeys) {
     236                rkeys.remove(key);
     237            }
     238            sameKeys.put(rkeys, r);
     239        }
     240        for (Set<Relation> duplicated : sameKeys.values()) {
     241            if (duplicated.size() > 1) {
     242                TestError testError = TestError.builder(this, Severity.ERROR, DUPLICATE_RELATION)
     243                        .message(tr("Duplicated relations"))
    218244                        .primitives(duplicated)
    219245                        .build();
    220246                errors.add(testError);
    221247            }
     248            realDups.addAll(duplicated);
    222249        }
    223         relationsNoKeys = null;
    224         super.endTest();
     250        return realDups;
    225251    }
    226252
    227253    @Override
    228254    public void visit(Relation r) {
    229         if (!r.isUsable() || r.hasIncompleteMembers() || "tmc".equals(r.get("type")) || "TMC".equals(r.get("type"))
    230                || "destination_sign".equals(r.get("type")) || r.getMembers().isEmpty())
     255        if (!r.isUsable() || r.getMembers().isEmpty())
    231256            return;
    232257        List<RelationMember> rMembers = r.getMembers();
     258        relationsNoKeys.put(rMembers, r);
     259
     260        if (r.hasIncompleteMembers() || "tmc".equals(r.get("type")) || "TMC".equals(r.get("type"))
     261                || "destination_sign".equals(r.get("type")))
     262             return;
    233263        Map<String, String> rkeys = r.getKeys();
    234264        for (String key : ignoreKeys) {
    235265            rkeys.remove(key);
     
    236266        }
    237267        RelationPair rKey = new RelationPair(rMembers, rkeys);
    238268        relations.put(rKey, r);
    239         relationsNoKeys.put(rMembers, r);
    240269    }
    241270
    242271    /**