package experiments.collective.entdoccentric.query;
import java.io.IOException;
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 SensePriorQuery extends Query {
private String keyword;
public SensePriorQuery(String keyword) {
super();
this.keyword = keyword;
}
public Weight createWeight(IndexSearcher searcher) throws IOException {
return new PriorWeight();
}
@Override
public String toString(String field) {
return "SensePriorQuery";
}
class PriorWeight extends Weight {
@Override
public Explanation explain(AtomicReaderContext context, int doc)
throws IOException {
return null;
}
@Override
public Query getQuery() {
return SensePriorQuery.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 SensePriorScorer(this, context);
}
class SensePriorScorer extends Scorer {
private int lastDoc = -1;
private AtomicReaderContext context;
SensePriorScorer(Weight weight, AtomicReaderContext context) {
super(weight);
this.context = context;
}
@Override
public float score() throws IOException {
return StartupInformationLoader.getSensePriorOfDocument(
context.docBase + lastDoc, keyword);
}
@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 "SensePrior";
}
}
}
}