package org.apache.solr.spelling.suggest.tst; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; import org.apache.solr.spelling.suggest.Lookup; import org.apache.solr.spelling.suggest.SortedTermFreqIteratorWrapper; import org.apache.solr.util.SortedIterator; import org.apache.solr.util.TermFreqIterator; public class TSTLookup extends Lookup { TernaryTreeNode root; TSTAutocomplete autocomplete; @Override public void init(NamedList config, SolrCore core) { } @Override public void build(TermFreqIterator tfit) throws IOException { root = new TernaryTreeNode(); autocomplete = new TSTAutocomplete(); // buffer first if (!(tfit instanceof SortedIterator)) { // make sure it's sorted tfit = new SortedTermFreqIteratorWrapper(tfit); } ArrayList<String> tokens = new ArrayList<String>(); ArrayList<Float> vals = new ArrayList<Float>(); while (tfit.hasNext()) { tokens.add(tfit.next()); vals.add(new Float(tfit.freq())); } autocomplete.balancedTree(tokens.toArray(), vals.toArray(), 0, tokens.size() - 1, root); } @Override public boolean add(String key, Object value) { autocomplete.insert(root, key, value, 0); // XXX we don't know if a new node was created return true; } @Override public Object get(String key) { throw new UnsupportedOperationException("get() is not supported here"); } @Override public List<LookupResult> lookup(String key, boolean onlyMorePopular, int num) { List<TernaryTreeNode> list = autocomplete.prefixCompletion(root, key, 0); List<LookupResult> res = new ArrayList<LookupResult>(); if (list == null || list.size() == 0) { return res; } int maxCnt = Math.min(num, list.size()); if (onlyMorePopular) { LookupPriorityQueue queue = new LookupPriorityQueue(num); for (TernaryTreeNode ttn : list) { queue.insertWithOverflow(new LookupResult(ttn.token, (Float)ttn.val)); } for (LookupResult lr : queue.getResults()) { res.add(lr); } } else { for (int i = 0; i < maxCnt; i++) { TernaryTreeNode ttn = list.get(i); res.add(new LookupResult(ttn.token, (Float)ttn.val)); } } return res; } @Override public boolean load(File storeDir) throws IOException { return false; } @Override public boolean store(File storeDir) throws IOException { return false; } }