--- /dev/null
+package org.apache.lucene.search.suggest;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.lucene.search.spell.Dictionary;
+import org.apache.lucene.search.spell.TermFreqIterator;
+import org.apache.lucene.util.PriorityQueue;
+
+public abstract class Lookup {
+ /**
+ * Result of a lookup.
+ */
+ public static final class LookupResult implements Comparable<LookupResult> {
+ public final String key;
+ public final float value;
+
+ public LookupResult(String key, float value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return key + "/" + value;
+ }
+
+ /** Compare alphabetically. */
+ public int compareTo(LookupResult o) {
+ return this.key.compareTo(o.key);
+ }
+ }
+
+ public static final class LookupPriorityQueue extends PriorityQueue<LookupResult> {
+
+ public LookupPriorityQueue(int size) {
+ initialize(size);
+ }
+
+ @Override
+ protected boolean lessThan(LookupResult a, LookupResult b) {
+ return a.value < b.value;
+ }
+
+ public LookupResult[] getResults() {
+ int size = size();
+ LookupResult[] res = new LookupResult[size];
+ for (int i = size - 1; i >= 0; i--) {
+ res[i] = pop();
+ }
+ return res;
+ }
+ }
+
+ /** Build lookup from a dictionary. Some implementations may require sorted
+ * or unsorted keys from the dictionary's iterator - use
+ * {@link SortedTermFreqIteratorWrapper} or
+ * {@link UnsortedTermFreqIteratorWrapper} in such case.
+ */
+ public void build(Dictionary dict) throws IOException {
+ Iterator<String> it = dict.getWordsIterator();
+ TermFreqIterator tfit;
+ if (it instanceof TermFreqIterator) {
+ tfit = (TermFreqIterator)it;
+ } else {
+ tfit = new TermFreqIterator.TermFreqIteratorWrapper(it);
+ }
+ build(tfit);
+ }
+
+ public abstract void build(TermFreqIterator tfit) throws IOException;
+
+ /**
+ * Persist the constructed lookup data to a directory. Optional operation.
+ * @param storeDir directory where data can be stored.
+ * @return true if successful, false if unsuccessful or not supported.
+ * @throws IOException when fatal IO error occurs.
+ */
+ public abstract boolean store(File storeDir) throws IOException;
+
+ /**
+ * Discard current lookup data and load it from a previously saved copy.
+ * Optional operation.
+ * @param storeDir directory where lookup data was stored.
+ * @return true if completed successfully, false if unsuccessful or not supported.
+ * @throws IOException when fatal IO error occurs.
+ */
+ public abstract boolean load(File storeDir) throws IOException;
+
+ /**
+ * Look up a key and return possible completion for this key.
+ * @param key lookup key. Depending on the implementation this may be
+ * a prefix, misspelling, or even infix.
+ * @param onlyMorePopular return only more popular results
+ * @param num maximum number of results to return
+ * @return a list of possible completions, with their relative weight (e.g. popularity)
+ */
+ public abstract List<LookupResult> lookup(String key, boolean onlyMorePopular, int num);
+
+ /**
+ * Modify the lookup data by recording additional data. Optional operation.
+ * @param key new lookup key
+ * @param value value to associate with this key
+ * @return true if new key is added, false if it already exists or operation
+ * is not supported.
+ */
+ public abstract boolean add(String key, Object value);
+
+ /**
+ * Get value associated with a specific key.
+ * @param key lookup key
+ * @return associated value
+ */
+ public abstract Object get(String key);
+}