Ticket #20424: 20424.patch
File 20424.patch, 3.6 KB (added by , 3 years ago) |
---|
-
src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java
179 179 private MultiMap<RelationPair, OsmPrimitive> relations; 180 180 181 181 /** MultiMap of all relations, regardless of keys */ 182 private MultiMap<List<RelationMember>, OsmPrimitive> relationsNoKeys;182 private MultiMap<List<RelationMember>, Relation> relationsNoKeys; 183 183 184 184 /** List of keys without useful information */ 185 185 private final Set<String> ignoreKeys = new HashSet<>(AbstractPrimitive.getUninterestingKeys()); … … 211 211 } 212 212 } 213 213 relations = null; 214 for (Set< OsmPrimitive> duplicated : relationsNoKeys.values()) {214 for (Set<Relation> duplicated : relationsNoKeys.values()) { 215 215 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")) 218 244 .primitives(duplicated) 219 245 .build(); 220 246 errors.add(testError); 221 247 } 248 realDups.addAll(duplicated); 222 249 } 223 relationsNoKeys = null; 224 super.endTest(); 250 return realDups; 225 251 } 226 252 227 253 @Override 228 254 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()) 231 256 return; 232 257 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; 233 263 Map<String, String> rkeys = r.getKeys(); 234 264 for (String key : ignoreKeys) { 235 265 rkeys.remove(key); … … 236 266 } 237 267 RelationPair rKey = new RelationPair(rMembers, rkeys); 238 268 relations.put(rKey, r); 239 relationsNoKeys.put(rMembers, r);240 269 } 241 270 242 271 /**