/**
*
*/
package querqy.lucene.rewrite;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.apache.lucene.search.DisjunctionMaxQuery;
import org.apache.lucene.search.Query;
/**
* @author rene
*
*/
public class DisjunctionMaxQueryFactory implements LuceneQueryFactory<DisjunctionMaxQuery> {
protected final LinkedList<LuceneQueryFactory<?>> disjuncts;
public DisjunctionMaxQueryFactory() {
disjuncts = new LinkedList<>();
}
public void add(LuceneQueryFactory<?> disjunct) {
disjuncts.add(disjunct);
}
public int getNumberOfDisjuncts() {
return disjuncts.size();
}
public LuceneQueryFactory<?> getFirstDisjunct() {
return disjuncts.getFirst();
}
@Override
public void prepareDocumentFrequencyCorrection(DocumentFrequencyAndTermContextProvider dftcp, boolean isBelowDMQ) {
if ((!isBelowDMQ) && (dftcp != null)) {
dftcp.newClause();
}
for (LuceneQueryFactory<?> disjunct : disjuncts) {
disjunct.prepareDocumentFrequencyCorrection(dftcp, true);
}
}
@Override
public DisjunctionMaxQuery createQuery(FieldBoost boost, float dmqTieBreakerMultiplier, DocumentFrequencyAndTermContextProvider dftcp)
throws IOException {
List<Query> disjunctList = new LinkedList<>();
for (LuceneQueryFactory<?> disjunct : disjuncts) {
disjunctList.add(disjunct.createQuery(boost, dmqTieBreakerMultiplier, dftcp));
}
return new DisjunctionMaxQuery(disjunctList, dmqTieBreakerMultiplier);
}
}