]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Try to find an exact, non-normalized match.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Fri, 4 Dec 2020 13:57:21 +0000 (14:57 +0100)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Fri, 4 Dec 2020 13:57:21 +0000 (14:57 +0100)
If the search string had to be normalized the match
we found might not be the best one.

Fixes GitHub issue #131.

src/com/hughes/android/dictionary/engine/Index.java

index 67f01fa48bb4f1dd9f6ffc1b1353e39b47ab24a0..0c07472dabf207f82c1e206785d2a5471d67ce84 100644 (file)
@@ -312,6 +312,7 @@ public final class Index {
     }
 
     private int findInsertionPointIndex(String token, final AtomicBoolean interrupted) {
+        String orig_token = token;
         token = normalizeToken(token);
 
         int start = 0;
@@ -329,7 +330,8 @@ public final class Index {
             if (comp == 0)
                 comp = sortCollator.compare(token, midEntry.normalizedToken());
             if (comp == 0) {
-                return windBackCase(token, mid, interrupted);
+                start = end = mid;
+                break;
             } else if (comp < 0) {
                 // System.out.println("Upper bound: " + midEntry + ", norm=" +
                 // midEntry.normalizedToken() + ", mid=" + mid);
@@ -366,6 +368,23 @@ public final class Index {
                 start--;
         }
 
+        // If the search term was normalized, try to find an exact match first
+        if (!orig_token.equalsIgnoreCase(token)) {
+            int matchLen = findMatchLen(sortCollator, token, sortedIndexEntries.get(start).normalizedToken());
+            int scan = start;
+            while (scan >= 0 && scan < sortedIndexEntries.size()) {
+                IndexEntry e = sortedIndexEntries.get(scan);
+                if (e.token.equalsIgnoreCase(orig_token))
+                {
+                    return scan;
+                }
+                if (matchLen > findMatchLen(sortCollator, token, e.normalizedToken()))
+                    break;
+                if (interrupted.get()) return start;
+                scan++;
+            }
+        }
+
         // If we search for a substring of a string that's in there, return
         // that.
         int result = Math.min(start, sortedIndexEntries.size() - 1);