Changeset 15788 in josm


Ignore:
Timestamp:
2020-01-27T19:59:00+01:00 (4 weeks ago)
Author:
GerdP
Message:

see #18455: improve performance

  • filter TaggingPreset.data to avoid tests which never match. This reduces significantly the number of iterations.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java

    r15682 r15788  
    1717import java.util.HashMap;
    1818import java.util.HashSet;
     19import java.util.LinkedHashMap;
     20import java.util.LinkedHashSet;
    1921import java.util.List;
    2022import java.util.Locale;
     
    7981    /** often used tags which are not in presets */
    8082    private static volatile MultiMap<String, String> oftenUsedTags = new MultiMap<>();
     83    private static final Map<TaggingPreset, List<TaggingPresetItem>> presetIndex = new LinkedHashMap<>();
    8184
    8285    private static final Pattern UNWANTED_NON_PRINTING_CONTROL_CHARACTERS = Pattern.compile(
     
    244247        ignoreForLevenshtein.clear();
    245248        oftenUsedTags.clear();
     249        presetIndex.clear();
    246250
    247251        StringBuilder errorSources = new StringBuilder();
     
    365369            initAdditionalPresetsValueData();
    366370            for (TaggingPreset p : presets) {
     371                List<TaggingPresetItem> minData = new ArrayList<>();
    367372                for (TaggingPresetItem i : p.data) {
    368373                    if (i instanceof KeyedItem) {
     374                        if (!"none".equals(((KeyedItem) i).match))
     375                            minData.add(i);
    369376                        addPresetValue((KeyedItem) i);
    370377                    } else if (i instanceof CheckGroup) {
     
    373380                        }
    374381                    }
     382                }
     383                if (!minData.isEmpty()) {
     384                    presetIndex .put(p, minData);
    375385                }
    376386            }
     
    622632            TaggingPresetType presetType = TaggingPresetType.forPrimitive(p);
    623633            EnumSet<TaggingPresetType> presetTypes = EnumSet.of(presetType);
    624             Collection<TaggingPreset> matchingPresets = TaggingPresets.getMatchingPresets(null, tags, false);
     634
     635            Collection<TaggingPreset> matchingPresets = new LinkedHashSet<>();
     636            for (Entry<TaggingPreset, List<TaggingPresetItem>> e : presetIndex.entrySet()) {
     637                if (TaggingPresetItem.matches(e.getValue(), tags)) {
     638                    matchingPresets.add(e.getKey());
     639                }
     640            }
    625641            Collection<TaggingPreset> matchingPresetsOK = matchingPresets.stream().filter(
    626642                    tp -> tp.typeMatches(presetTypes)).collect(Collectors.toList());
Note: See TracChangeset for help on using the changeset viewer.