Changeset 14517 in josm


Ignore:
Timestamp:
2018-12-06T10:55:42+01:00 (6 years ago)
Author:
GerdP
Message:

see #17055 improve TagChecker

  • don't suggest fix value when given value is short and Levenshtein distance is 2

surface=u should not be fixed with surface=mud but highway=tra can be fixed with highway=track

Location:
trunk
Files:
2 edited

Legend:

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

    r14508 r14517  
    533533                } else if (!isTagInPresets(key, value)) {
    534534                    // try to fix common typos and check again if value is still unknown
    535                     String fixedValue = harmonizeValue(prop.getValue());
     535                    final String harmonizedValue = harmonizeValue(prop.getValue());
     536                    String fixedValue = null;
    536537                    Set<String> possibleValues = getPresetValues(key);
    537538                    List<String> fixVals = new ArrayList<>();
    538539                    int maxPresetValueLen = 0;
    539                     if (!possibleValues.contains(fixedValue)) {
     540                    if (possibleValues.contains(harmonizedValue)) {
     541                        fixedValue = harmonizedValue;
     542                    } else {
    540543                        // use Levenshtein distance to find typical typos
    541544                        int minDist = MAX_LEVENSHTEIN_DISTANCE + 1;
     
    544547                            if (possibleVal.isEmpty())
    545548                                continue;
     549                            if (harmonizedValue.length() < 3 && possibleVal.length() >= harmonizedValue.length() + MAX_LEVENSHTEIN_DISTANCE) {
     550                                // don't suggest fix value when given value is short and lengths are too different
     551                                // for example surface=u would result in surface=mud
     552                                continue;
     553                            }
    546554                            maxPresetValueLen = Math.max(maxPresetValueLen, possibleVal.length());
    547                             int dist = Utils.getLevenshteinDistance(possibleVal, fixedValue);
     555                            int dist = Utils.getLevenshteinDistance(possibleVal, harmonizedValue);
    548556                            if (dist < minDist) {
    549557                                closest = possibleVal;
     
    555563                            }
    556564                        }
    557                         fixedValue = null;
    558565                        if (minDist <= MAX_LEVENSHTEIN_DISTANCE && maxPresetValueLen > MAX_LEVENSHTEIN_DISTANCE) {
    559566                            if (fixVals.size() < 2) {
  • trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java

    r14508 r14517  
    138138        assertTrue(errors.get(0).isFixable());
    139139    }
     140
    140141    /**
    141142     * Check for misspelled value.
     
    167168        assertTrue(errors.toString(), errors.isEmpty());
    168169    }
     170
     171    /**
     172     * Check regression: Don't fix surface=u -> surface=mud.
     173     * @throws IOException if any I/O error occurs
     174     */
     175    @Test
     176    public void testTooShortToFix() throws IOException {
     177        final List<TestError> errors = test(OsmUtils.createPrimitive("node surface=u"));
     178        assertEquals(1, errors.size());
     179        assertEquals("Presets do not contain property value", errors.get(0).getMessage());
     180        assertEquals("Value 'u' for key 'surface' not in presets.", errors.get(0).getDescription());
     181        assertEquals(Severity.OTHER, errors.get(0).getSeverity());
     182        assertFalse(errors.get(0).isFixable());
     183    }
     184
     185    /**
     186     * Check value with upper case
     187     * @throws IOException if any I/O error occurs
     188     */
     189    @Test
     190    public void testValueDifferentCase() throws IOException {
     191        final List<TestError> errors = test(OsmUtils.createPrimitive("node highway=Residential"));
     192        assertEquals(1, errors.size());
     193        assertEquals("Misspelled property value", errors.get(0).getMessage());
     194        assertEquals("Value 'Residential' for key 'highway' looks like 'residential'.", errors.get(0).getDescription());
     195        assertEquals(Severity.WARNING, errors.get(0).getSeverity());
     196        assertTrue(errors.get(0).isFixable());
     197    }
     198
    169199}
Note: See TracChangeset for help on using the changeset viewer.