package com.browseengine.bobo.query; import java.io.IOException; import java.util.Set; import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.index.IndexReader; 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; public class ScoreAdjusterQuery extends Query { private class ScoreAdjusterWeight extends Weight { Weight _innerWeight; public ScoreAdjusterWeight(Weight innerWeight) throws IOException { _innerWeight = innerWeight; } @Override public String toString() { return "weight(" + ScoreAdjusterQuery.this + ")"; } @Override public Query getQuery() { return _innerWeight.getQuery(); } @Override public Scorer scorer(AtomicReaderContext context, boolean scoreDocsInOrder, boolean topScorer, Bits acceptDocs) throws IOException { Scorer innerScorer = _innerWeight.scorer(context, scoreDocsInOrder, topScorer, acceptDocs); return _scorerBuilder .createScorer(innerScorer, context.reader(), scoreDocsInOrder, topScorer); } @Override public Explanation explain(AtomicReaderContext context, int doc) throws IOException { Explanation innerExplain = _innerWeight.explain(context, doc); return _scorerBuilder.explain(context.reader(), doc, innerExplain); } @Override public float getValueForNormalization() throws IOException { return _innerWeight.getValueForNormalization(); } @Override public void normalize(float norm, float topLevelBoost) { _innerWeight.normalize(norm, topLevelBoost); } } protected final Query _query; protected final ScorerBuilder _scorerBuilder; public ScoreAdjusterQuery(Query query, ScorerBuilder scorerBuilder) { _query = query; _scorerBuilder = scorerBuilder; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void extractTerms(Set terms) { _query.extractTerms(terms); } @Override public Weight createWeight(IndexSearcher searcher) throws IOException { return new ScoreAdjusterWeight(_query.createWeight(searcher)); } @Override public Query rewrite(IndexReader reader) throws IOException { _query.rewrite(reader); return this; } @Override public String toString(String field) { return _query.toString(field); } }