Skip to content
Snippets Groups Projects
Commit 12e63799 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Quit sorting suggestions in AndroidSpellCheckerService."

parents facfd28a 86dee229
No related branches found
No related tags found
No related merge requests found
......@@ -231,66 +231,43 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
}
private final ArrayList<String> mSuggestions;
private final int[] mScores;
private final ArrayList<Integer> mScores;
private final String mOriginalText;
private final float mRecommendedThreshold;
private final int mMaxLength;
private int mLength = 0;
SuggestionsGatherer(final String originalText, final float recommendedThreshold,
final int maxLength) {
mOriginalText = originalText;
mRecommendedThreshold = recommendedThreshold;
mMaxLength = maxLength;
mSuggestions = new ArrayList<>(maxLength + 1);
mScores = new int[mMaxLength];
mSuggestions = new ArrayList<>();
mScores = new ArrayList<>();
}
synchronized public boolean addWord(char[] word, int[] spaceIndices, int wordOffset,
int wordLength, int score) {
final int positionIndex = Arrays.binarySearch(mScores, 0, mLength, score);
// binarySearch returns the index if the element exists, and -<insertion index> - 1
// if it doesn't. See documentation for binarySearch.
final int insertIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1;
// Weak <- insertIndex == 0, ..., insertIndex == mLength -> Strong
if (insertIndex == 0 && mLength >= mMaxLength) {
return true;
public void addResults(final SuggestionResults suggestionResults) {
if (suggestionResults == null) {
return;
}
final String wordString = new String(word, wordOffset, wordLength);
if (mLength < mMaxLength) {
final int copyLen = mLength - insertIndex;
++mLength;
System.arraycopy(mScores, insertIndex, mScores, insertIndex + 1, copyLen);
mSuggestions.add(insertIndex, wordString);
mScores[insertIndex] = score;
} else {
System.arraycopy(mScores, 1, mScores, 0, insertIndex - 1);
mSuggestions.add(insertIndex, wordString);
mSuggestions.remove(0);
mScores[insertIndex - 1] = score;
// suggestionResults is sorted.
for (final SuggestedWordInfo suggestedWordInfo : suggestionResults) {
mSuggestions.add(suggestedWordInfo.mWord);
mScores.add(suggestedWordInfo.mScore);
}
return true;
}
public Result getResults(final int capitalizeType, final Locale locale) {
final String[] gatheredSuggestions;
final boolean hasRecommendedSuggestions;
if (0 == mLength) {
if (mSuggestions.isEmpty()) {
gatheredSuggestions = null;
hasRecommendedSuggestions = false;
} else {
if (DBG) {
if (mLength != mSuggestions.size()) {
Log.e(TAG, "Suggestion size is not the same as stored mLength");
}
for (int i = mLength - 1; i >= 0; --i) {
Log.i(TAG, "" + mScores[i] + " " + mSuggestions.get(i));
for (int i = 0; i < mSuggestions.size(); i++) {
Log.i(TAG, "" + mScores.get(i) + " " + mSuggestions.get(i));
}
}
Collections.reverse(mSuggestions);
StringUtils.removeDupes(mSuggestions);
if (StringUtils.CAPITALIZE_ALL == capitalizeType) {
for (int i = 0; i < mSuggestions.size(); ++i) {
......@@ -309,7 +286,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
// into a String[].
gatheredSuggestions = mSuggestions.toArray(EMPTY_STRING_ARRAY);
final int bestScore = mScores[mLength - 1];
final int bestScore = mScores.get(0);
final String bestSuggestion = mSuggestions.get(0);
final float normalizedScore =
BinaryDictionaryUtils.calcNormalizedScore(
......
......@@ -259,14 +259,6 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
}
final String text = inText.replaceAll(
AndroidSpellCheckerService.APOSTROPHE, AndroidSpellCheckerService.SINGLE_QUOTE);
// TODO: Don't gather suggestions if the limit is <= 0 unless necessary
//final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer(text,
//mService.mSuggestionThreshold, mService.mRecommendedThreshold,
//suggestionsLimit);
final SuggestionsGatherer suggestionsGatherer = mService.newSuggestionsGatherer(
text, suggestionsLimit);
final int capitalizeType = StringUtils.getCapitalizationType(text);
boolean isInDict = true;
if (!mService.hasMainDictionaryForLocale(mLocale)) {
......@@ -289,18 +281,13 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
composer.setComposingWord(codePoints, coordinates);
final SuggestionResults suggestionResults = mService.getSuggestionResults(
mLocale, composer, prevWordsInfo, proximityInfo);
if (suggestionResults != null) {
for (final SuggestedWordInfo suggestion : suggestionResults) {
final String suggestionStr = suggestion.mWord;
suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0,
suggestionStr.length(), suggestion.mScore);
}
}
isInDict = isInDictForAnyCapitalization(text, capitalizeType);
// TODO: Don't gather suggestions if the limit is <= 0 unless necessary
final SuggestionsGatherer suggestionsGatherer = mService.newSuggestionsGatherer(
text, suggestionsLimit);
suggestionsGatherer.addResults(suggestionResults);
final SuggestionsGatherer.Result result = suggestionsGatherer.getResults(
capitalizeType, mLocale);
isInDict = isInDictForAnyCapitalization(text, capitalizeType);
if (DBG) {
Log.i(TAG, "Spell checking results for " + text + " with suggestion limit "
+ suggestionsLimit);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment