package experiments.collective.entdoccentric.query; import java.io.IOException; import java.util.HashMap; import org.apache.lucene.document.Document; import org.apache.lucene.index.AtomicReader; import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.search.Explanation; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Scorer; import org.apache.lucene.search.Weight; import org.apache.lucene.util.Bits; import experiments.collective.entdoccentric.PriorLoader; import experiments.collective.entdoccentric.StartupInformationLoader; /** * Due to major performance problems if we use an IndexReader request for every * single document, we create a <Concept, Occurence> Hashmap to improve the * overall performance. * * Our StartupInformationLoader provides these necessary information much * faster. * * @author Stefan Zwicklbauer */ public class PriorQuery extends Query { public Weight createWeight(IndexSearcher searcher) throws IOException { return new PriorWeight(); } @Override public String toString(String field) { return "PriorQuery"; } class PriorWeight extends Weight { @Override public Explanation explain(AtomicReaderContext context, int doc) throws IOException { return null; } @Override public Query getQuery() { return PriorQuery.this; } @Override public float getValueForNormalization() throws IOException { return 0; } @Override public void normalize(float norm, float topLevelBoost) { } @Override public Scorer scorer(AtomicReaderContext context, boolean scoreDocsInOrder, boolean topScorer, Bits acceptDocs) throws IOException { return new PriorScorer(this, context); } class PriorScorer extends Scorer { private int lastDoc = -1; private AtomicReaderContext context; PriorScorer(Weight weight, AtomicReaderContext context) { super(weight); this.context = context; } @Override public float score() throws IOException { AtomicReader r = context.reader(); return StartupInformationLoader .getPriorOfDocument(context.docBase + lastDoc); } @Override public int freq() throws IOException { return 1; } @Override public int docID() { return lastDoc; } @Override public int nextDoc() throws IOException { if ((context.reader().numDocs() - 1) > lastDoc) { return ++lastDoc; } else { return NO_MORE_DOCS; } } @Override public int advance(int target) throws IOException { int maxdoc = context.reader().numDocs(); if (target > maxdoc - 1) { return NO_MORE_DOCS; } return lastDoc = target; } @Override public String toString() { return "Prior"; } private float getPrior(Document doc) { String val = doc.get("occurences"); if (val != null && !val.equalsIgnoreCase("")) { String[] splitter = val.split(";;;"); int priorVal = 0; for (int j = 0; j < splitter.length; j++) { String[] splitter1 = splitter[j].split(":::"); priorVal += Integer.valueOf(splitter1[1]); } return priorVal; } return 0; } } } }