/**
*
*/
package querqy.lucene.rewrite;
import java.io.IOException;
import java.util.LinkedList;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BoostQuery;
import org.apache.lucene.search.Query;
/**
* @author rene
*
*/
public class BooleanQueryFactory implements LuceneQueryFactory<Query> {
protected final boolean disableCoord;
protected final LinkedList<Clause> clauses;
protected final boolean normalizeBoost;
public BooleanQueryFactory(boolean disableCoord, boolean normalizeBoost) {
this.disableCoord = disableCoord;
this.normalizeBoost = normalizeBoost;
clauses = new LinkedList<>();
}
public void add(LuceneQueryFactory<?> factory, Occur occur) {
clauses.add(new Clause(factory, occur));
}
public void add(Clause clause) {
clauses.add(clause);
}
@Override
public void prepareDocumentFrequencyCorrection(DocumentFrequencyAndTermContextProvider dftcp, boolean isBelowDMQ) {
for (Clause clause : clauses) {
clause.queryFactory.prepareDocumentFrequencyCorrection(dftcp, isBelowDMQ);
}
}
@Override
public Query createQuery(FieldBoost boost, float dmqTieBreakerMultiplier, DocumentFrequencyAndTermContextProvider dftcp)
throws IOException {
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(disableCoord);
for (Clause clause : clauses) {
builder.add(clause.queryFactory.createQuery(boost, dmqTieBreakerMultiplier, dftcp), clause.occur);
}
Query bq = builder.build();
if (normalizeBoost) {
int size = getNumberOfClauses();
if (size > 0) {
bq = new BoostQuery(bq, 1f / (float) size);
}
}
return bq;
}
public int getNumberOfClauses() {
return clauses.size();
}
public Clause getFirstClause() {
return clauses.getFirst();
}
public static class Clause {
final Occur occur;
final LuceneQueryFactory<?> queryFactory;
public Clause(LuceneQueryFactory<?> queryFactory, Occur occur) {
if (occur == null) {
throw new IllegalArgumentException("Occur must not be null");
}
this.occur = occur;
this.queryFactory = queryFactory;
}
}
public LinkedList<Clause> getClauses() {
return clauses;
}
}