Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9290d0a4 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Make UserHistoryDictionary use updateEntriesForWordWithNgramContext()

Bug: 14425059
Change-Id: I409ebf90f68f4a0f1638128ac5ee6af859323d30
parent a9089f9a
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.annotation.Nonnull;

/**
 * Implements a static, compacted, binary dictionary of standard words.
 */
@@ -495,8 +497,7 @@ public final class BinaryDictionary extends Dictionary {
    }

    // Update entries for the word occurrence with the ngramContext.
    @UsedForTesting
    public boolean updateEntriesForWordWithNgramContext(final NgramContext ngramContext,
    public boolean updateEntriesForWordWithNgramContext(@Nonnull final NgramContext ngramContext,
            final String word, final boolean isValidWord, final int count, final int timestamp) {
        if (TextUtils.isEmpty(word)) {
            return false;
+47 −13
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import javax.annotation.Nonnull;

/**
 * Abstract base class for an expandable dictionary that can be created and updated dynamically
 * during runtime. When updated it automatically generates a new binary dictionary to handle future
@@ -292,13 +294,9 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
        }
    }

    /**
     * Adds unigram information of a word to the dictionary. May overwrite an existing entry.
     */
    public void addUnigramEntryWithCheckingDistracter(final String word, final int frequency,
            final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord,
            final boolean isBlacklisted, final int timestamp,
            final DistracterFilter distracterFilter) {
    private void updateDictionaryWithWriteLockIfWordIsNotADistracter(
            @Nonnull final Runnable updateTask,
            @Nonnull final String word, @Nonnull final DistracterFilter distracterFilter) {
        reloadDictionaryIfRequired();
        asyncPreCheckAndExecuteTaskWithWriteLock(
                new Callable<Boolean>() {
@@ -315,10 +313,25 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
                            return;
                        }
                        runGCIfRequiredLocked(true /* mindsBlockByGC */);
                        updateTask.run();
                    }
                });
    }

    /**
     * Adds unigram information of a word to the dictionary. May overwrite an existing entry.
     */
    public void addUnigramEntryWithCheckingDistracter(final String word, final int frequency,
            final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord,
            final boolean isBlacklisted, final int timestamp,
            @Nonnull final DistracterFilter distracterFilter) {
        updateDictionaryWithWriteLockIfWordIsNotADistracter(new Runnable() {
            @Override
            public void run() {
                addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq,
                        isNotAWord, isBlacklisted, timestamp);
            }
                });
        }, word, distracterFilter);
    }

    protected void addUnigramLocked(final String word, final int frequency,
@@ -354,7 +367,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
    /**
     * Adds n-gram information of a word to the dictionary. May overwrite an existing entry.
     */
    public void addNgramEntry(final NgramContext ngramContext, final String word,
    public void addNgramEntry(@Nonnull final NgramContext ngramContext, final String word,
            final int frequency, final int timestamp) {
        reloadDictionaryIfRequired();
        asyncExecuteTaskWithWriteLock(new Runnable() {
@@ -369,7 +382,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
        });
    }

    protected void addNgramEntryLocked(final NgramContext ngramContext, final String word,
    protected void addNgramEntryLocked(@Nonnull final NgramContext ngramContext, final String word,
            final int frequency, final int timestamp) {
        if (!mBinaryDictionary.addNgramEntry(ngramContext, word, frequency, timestamp)) {
            if (DEBUG) {
@@ -383,7 +396,8 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
     * Dynamically remove the n-gram entry in the dictionary.
     */
    @UsedForTesting
    public void removeNgramDynamically(final NgramContext ngramContext, final String word) {
    public void removeNgramDynamically(@Nonnull final NgramContext ngramContext,
            final String word) {
        reloadDictionaryIfRequired();
        asyncExecuteTaskWithWriteLock(new Runnable() {
            @Override
@@ -402,6 +416,26 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
        });
    }

    /**
     * Update dictionary for the word with the ngramContext if the word is not a distracter.
     */
    public void updateEntriesForWordWithCheckingDistracter(@Nonnull final NgramContext ngramContext,
            final String word, final boolean isValidWord, final int count, final int timestamp,
            @Nonnull final DistracterFilter distracterFilter) {
        updateDictionaryWithWriteLockIfWordIsNotADistracter(new Runnable() {
            @Override
            public void run() {
                if (!mBinaryDictionary.updateEntriesForWordWithNgramContext(ngramContext, word,
                        isValidWord, count, timestamp)) {
                    if (DEBUG) {
                        Log.e(TAG, "Cannot update counter. word: " + word
                                + " context: "+ ngramContext.toString());
                    }
                }
            }
        }, word, distracterFilter);
    }

    public interface AddMultipleDictionaryEntriesCallback {
        public void onFinished();
    }
@@ -410,7 +444,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
     * Dynamically add multiple entries to the dictionary.
     */
    public void addMultipleDictionaryEntriesDynamically(
            final ArrayList<LanguageModelParam> languageModelParams,
            @Nonnull final ArrayList<LanguageModelParam> languageModelParams,
            final AddMultipleDictionaryEntriesCallback callback) {
        reloadDictionaryIfRequired();
        asyncExecuteTaskWithWriteLock(new Runnable() {
+0 −5
Original line number Diff line number Diff line
@@ -158,11 +158,6 @@ public class NgramContext {
        }
    }

    public NgramContext getTrimmedNgramContext(final int maxPrevWordCount) {
        final int newSize = Math.min(maxPrevWordCount, mPrevWordsCount);
        return new NgramContext(this /* prevWordsInfo */, newSize);
    }

    public int getPrevWordCount() {
        return mPrevWordsCount;
    }
+2 −29
Original line number Diff line number Diff line
@@ -65,34 +65,7 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas
        if (word.length() > Constants.DICTIONARY_MAX_WORD_LENGTH) {
            return;
        }
        final int frequency = isValid ?
                FREQUENCY_FOR_WORDS_IN_DICTS : FREQUENCY_FOR_WORDS_NOT_IN_DICTS;
        userHistoryDictionary.addUnigramEntryWithCheckingDistracter(word, frequency,
                null /* shortcutTarget */, 0 /* shortcutFreq */, false /* isNotAWord */,
                false /* isBlacklisted */, timestamp, distracterFilter);

        final boolean isBeginningOfSentenceContext = ngramContext.isBeginningOfSentenceContext();
        final NgramContext ngramContextToBeSaved =
                ngramContext.getTrimmedNgramContext(SUPPORTED_NGRAM - 1);
        for (int i = 0; i < ngramContextToBeSaved.getPrevWordCount(); i++) {
            final CharSequence prevWord = ngramContextToBeSaved.getNthPrevWord(1 /* n */);
            if (prevWord == null || (prevWord.length() > Constants.DICTIONARY_MAX_WORD_LENGTH)) {
                return;
            }
            // Do not insert a word as a bigram of itself
            if (i == 0 && TextUtils.equals(word, prevWord)) {
                return;
            }
            if (isBeginningOfSentenceContext) {
                // Beginning-of-Sentence n-gram entry is added as an n-gram entry of an OOV word.
                userHistoryDictionary.addNgramEntry(
                        ngramContextToBeSaved.getTrimmedNgramContext(i + 1), word,
                        FREQUENCY_FOR_WORDS_NOT_IN_DICTS, timestamp);
            } else {
                userHistoryDictionary.addNgramEntry(
                        ngramContextToBeSaved.getTrimmedNgramContext(i + 1), word, frequency,
                        timestamp);
            }
        }
        userHistoryDictionary.updateEntriesForWordWithCheckingDistracter(ngramContext, word,
                isValid, 1 /* count */, timestamp, distracterFilter);
    }
}