LUCENE-6570: Make BooleanQuery immutable.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1686145 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Adrien Grand 2015-06-18 07:14:05 +00:00
parent 2b96b25046
commit 4aafacfbef
186 changed files with 2362 additions and 2214 deletions

View File

@ -35,6 +35,9 @@ API Changes
* LUCENE-6531: PhraseQuery is now immutable and can be built using the * LUCENE-6531: PhraseQuery is now immutable and can be built using the
PhraseQuery.Builder class. (Adrien Grand) PhraseQuery.Builder class. (Adrien Grand)
* LUCENE-6570: BooleanQuery is now immutable and can be built using the
BooleanQuery.Builder class. (Adrien Grand)
======================= Lucene 5.3.0 ======================= ======================= Lucene 5.3.0 =======================
New Features New Features

View File

@ -131,7 +131,7 @@ public class ShingleAnalyzerWrapperTest extends BaseTokenStreamTestCase {
* in the right order and adjacent to each other. * in the right order and adjacent to each other.
*/ */
public void testShingleAnalyzerWrapperBooleanQuery() throws Exception { public void testShingleAnalyzerWrapperBooleanQuery() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
try (TokenStream ts = analyzer.tokenStream("content", "test sentence")) { try (TokenStream ts = analyzer.tokenStream("content", "test sentence")) {
CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class); CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class);
@ -145,7 +145,7 @@ public class ShingleAnalyzerWrapperTest extends BaseTokenStreamTestCase {
ts.end(); ts.end();
} }
ScoreDoc[] hits = searcher.search(q, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(q.build(), 1000).scoreDocs;
int[] ranks = new int[] { 1, 2, 0 }; int[] ranks = new int[] { 1, 2, 0 };
compareRanks(hits, ranks); compareRanks(hits, ranks);
} }

View File

@ -53,10 +53,10 @@ public class SimpleQueryMaker extends AbstractQueryMaker implements QueryMaker {
qq.add(q1); qq.add(q1);
Query q2 = new TermQuery(new Term(DocMaker.BODY_FIELD,"simple")); Query q2 = new TermQuery(new Term(DocMaker.BODY_FIELD,"simple"));
qq.add(q2); qq.add(q2);
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(q1,Occur.MUST); bq.add(q1,Occur.MUST);
bq.add(q2,Occur.MUST); bq.add(q2,Occur.MUST);
qq.add(bq); qq.add(bq.build());
qq.add(qp.parse("synthetic body")); qq.add(qp.parse("synthetic body"));
qq.add(qp.parse("\"synthetic body\"")); qq.add(qp.parse("\"synthetic body\""));
qq.add(qp.parse("synthetic text")); qq.add(qp.parse("synthetic text"));

View File

@ -66,11 +66,11 @@ public class SimpleQQParser implements QualityQueryParser {
qp = new QueryParser(indexField, new StandardAnalyzer()); qp = new QueryParser(indexField, new StandardAnalyzer());
queryParser.set(qp); queryParser.set(qp);
} }
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
for (int i = 0; i < qqNames.length; i++) for (int i = 0; i < qqNames.length; i++)
bq.add(qp.parse(QueryParserBase.escape(qq.getValue(qqNames[i]))), BooleanClause.Occur.SHOULD); bq.add(qp.parse(QueryParserBase.escape(qq.getValue(qqNames[i]))), BooleanClause.Occur.SHOULD);
return bq; return bq.build();
} }
} }

View File

@ -117,13 +117,13 @@ public class BooleanPerceptronClassifier implements Classifier<Boolean> {
int batchCount = 0; int batchCount = 0;
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new BooleanClause(new WildcardQuery(new Term(classFieldName, "*")), BooleanClause.Occur.MUST)); q.add(new BooleanClause(new WildcardQuery(new Term(classFieldName, "*")), BooleanClause.Occur.MUST));
if (query != null) { if (query != null) {
q.add(new BooleanClause(query, BooleanClause.Occur.MUST)); q.add(new BooleanClause(query, BooleanClause.Occur.MUST));
} }
// run the search and use stored field values // run the search and use stored field values
for (ScoreDoc scoreDoc : indexSearcher.search(q, for (ScoreDoc scoreDoc : indexSearcher.search(q.build(),
Integer.MAX_VALUE).scoreDocs) { Integer.MAX_VALUE).scoreDocs) {
StoredDocument doc = indexSearcher.doc(scoreDoc.doc); StoredDocument doc = indexSearcher.doc(scoreDoc.doc);

View File

@ -181,18 +181,18 @@ public class CachingNaiveBayesClassifier extends SimpleNaiveBayesClassifier {
// if we dont get the answer, but it's relevant we must search it and insert to the cache // if we dont get the answer, but it's relevant we must search it and insert to the cache
if (insertPoint != null || !justCachedTerms) { if (insertPoint != null || !justCachedTerms) {
for (BytesRef cclass : cclasses) { for (BytesRef cclass : cclasses) {
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
BooleanQuery subQuery = new BooleanQuery(); BooleanQuery.Builder subQuery = new BooleanQuery.Builder();
for (String textFieldName : textFieldNames) { for (String textFieldName : textFieldNames) {
subQuery.add(new BooleanClause(new TermQuery(new Term(textFieldName, word)), BooleanClause.Occur.SHOULD)); subQuery.add(new BooleanClause(new TermQuery(new Term(textFieldName, word)), BooleanClause.Occur.SHOULD));
} }
booleanQuery.add(new BooleanClause(subQuery, BooleanClause.Occur.MUST)); booleanQuery.add(new BooleanClause(subQuery.build(), BooleanClause.Occur.MUST));
booleanQuery.add(new BooleanClause(new TermQuery(new Term(classFieldName, cclass)), BooleanClause.Occur.MUST)); booleanQuery.add(new BooleanClause(new TermQuery(new Term(classFieldName, cclass)), BooleanClause.Occur.MUST));
if (query != null) { if (query != null) {
booleanQuery.add(query, BooleanClause.Occur.MUST); booleanQuery.add(query, BooleanClause.Occur.MUST);
} }
TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector(); TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector();
indexSearcher.search(booleanQuery, totalHitCountCollector); indexSearcher.search(booleanQuery.build(), totalHitCountCollector);
int ret = totalHitCountCollector.getTotalHits(); int ret = totalHitCountCollector.getTotalHits();
if (ret != 0) { if (ret != 0) {

View File

@ -126,7 +126,7 @@ public class KNearestNeighborClassifier implements Classifier<BytesRef> {
} }
private TopDocs knnSearch(String text) throws IOException { private TopDocs knnSearch(String text) throws IOException {
BooleanQuery mltQuery = new BooleanQuery(); BooleanQuery.Builder mltQuery = new BooleanQuery.Builder();
for (String textFieldName : textFieldNames) { for (String textFieldName : textFieldNames) {
mltQuery.add(new BooleanClause(mlt.like(textFieldName, new StringReader(text)), BooleanClause.Occur.SHOULD)); mltQuery.add(new BooleanClause(mlt.like(textFieldName, new StringReader(text)), BooleanClause.Occur.SHOULD));
} }
@ -135,7 +135,7 @@ public class KNearestNeighborClassifier implements Classifier<BytesRef> {
if (query != null) { if (query != null) {
mltQuery.add(query, BooleanClause.Occur.MUST); mltQuery.add(query, BooleanClause.Occur.MUST);
} }
return indexSearcher.search(mltQuery, k); return indexSearcher.search(mltQuery.build(), k);
} }
private List<ClassificationResult<BytesRef>> buildListFromTopDocs(TopDocs topDocs) throws IOException { private List<ClassificationResult<BytesRef>> buildListFromTopDocs(TopDocs topDocs) throws IOException {

View File

@ -183,12 +183,12 @@ public class SimpleNaiveBayesClassifier implements Classifier<BytesRef> {
int docCount = MultiFields.getTerms(this.leafReader, this.classFieldName).getDocCount(); int docCount = MultiFields.getTerms(this.leafReader, this.classFieldName).getDocCount();
if (docCount == -1) { // in case codec doesn't support getDocCount if (docCount == -1) { // in case codec doesn't support getDocCount
TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector(); TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector();
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new BooleanClause(new WildcardQuery(new Term(classFieldName, String.valueOf(WildcardQuery.WILDCARD_STRING))), BooleanClause.Occur.MUST)); q.add(new BooleanClause(new WildcardQuery(new Term(classFieldName, String.valueOf(WildcardQuery.WILDCARD_STRING))), BooleanClause.Occur.MUST));
if (query != null) { if (query != null) {
q.add(query, BooleanClause.Occur.MUST); q.add(query, BooleanClause.Occur.MUST);
} }
indexSearcher.search(q, indexSearcher.search(q.build(),
totalHitCountCollector); totalHitCountCollector);
docCount = totalHitCountCollector.getTotalHits(); docCount = totalHitCountCollector.getTotalHits();
} }
@ -251,18 +251,18 @@ public class SimpleNaiveBayesClassifier implements Classifier<BytesRef> {
} }
private int getWordFreqForClass(String word, BytesRef c) throws IOException { private int getWordFreqForClass(String word, BytesRef c) throws IOException {
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
BooleanQuery subQuery = new BooleanQuery(); BooleanQuery.Builder subQuery = new BooleanQuery.Builder();
for (String textFieldName : textFieldNames) { for (String textFieldName : textFieldNames) {
subQuery.add(new BooleanClause(new TermQuery(new Term(textFieldName, word)), BooleanClause.Occur.SHOULD)); subQuery.add(new BooleanClause(new TermQuery(new Term(textFieldName, word)), BooleanClause.Occur.SHOULD));
} }
booleanQuery.add(new BooleanClause(subQuery, BooleanClause.Occur.MUST)); booleanQuery.add(new BooleanClause(subQuery.build(), BooleanClause.Occur.MUST));
booleanQuery.add(new BooleanClause(new TermQuery(new Term(classFieldName, c)), BooleanClause.Occur.MUST)); booleanQuery.add(new BooleanClause(new TermQuery(new Term(classFieldName, c)), BooleanClause.Occur.MUST));
if (query != null) { if (query != null) {
booleanQuery.add(query, BooleanClause.Occur.MUST); booleanQuery.add(query, BooleanClause.Occur.MUST);
} }
TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector(); TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector();
indexSearcher.search(booleanQuery, totalHitCountCollector); indexSearcher.search(booleanQuery.build(), totalHitCountCollector);
return totalHitCountCollector.getTotalHits(); return totalHitCountCollector.getTotalHits();
} }

View File

@ -20,7 +20,7 @@ package org.apache.lucene.search;
import java.util.Objects; import java.util.Objects;
/** A clause in a BooleanQuery. */ /** A clause in a BooleanQuery. */
public class BooleanClause { public final class BooleanClause {
/** Specifies how clauses are to occur in matching documents. */ /** Specifies how clauses are to occur in matching documents. */
public static enum Occur { public static enum Occur {
@ -35,7 +35,7 @@ public class BooleanClause {
* matching documents. For a BooleanQuery with no <code>MUST</code> * matching documents. For a BooleanQuery with no <code>MUST</code>
* clauses one or more <code>SHOULD</code> clauses must match a document * clauses one or more <code>SHOULD</code> clauses must match a document
* for the BooleanQuery to match. * for the BooleanQuery to match.
* @see BooleanQuery#setMinimumNumberShouldMatch * @see BooleanQuery.Builder#setMinimumNumberShouldMatch
*/ */
SHOULD { @Override public String toString() { return ""; } }, SHOULD { @Override public String toString() { return ""; } },
@ -49,9 +49,9 @@ public class BooleanClause {
/** The query whose matching documents are combined by the boolean query. /** The query whose matching documents are combined by the boolean query.
*/ */
private Query query; private final Query query;
private Occur occur; private final Occur occur;
/** Constructs a BooleanClause. /** Constructs a BooleanClause.
@ -66,19 +66,10 @@ public class BooleanClause {
return occur; return occur;
} }
public void setOccur(Occur occur) {
this.occur = Objects.requireNonNull(occur, "Occur must not be null");
}
public Query getQuery() { public Query getQuery() {
return query; return query;
} }
public void setQuery(Query query) {
this.query = Objects.requireNonNull(query, "Query must not be null");
}
public boolean isProhibited() { public boolean isProhibited() {
return Occur.MUST_NOT == occur; return Occur.MUST_NOT == occur;
} }

View File

@ -19,6 +19,8 @@ package org.apache.lucene.search;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -65,33 +67,27 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
BooleanQuery.maxClauseCount = maxClauseCount; BooleanQuery.maxClauseCount = maxClauseCount;
} }
private ArrayList<BooleanClause> clauses = new ArrayList<>(); /** A builder for boolean queries. */
private final boolean disableCoord; public static class Builder {
/** Constructs an empty boolean query. */ private boolean disableCoord;
public BooleanQuery() { private int minimumNumberShouldMatch;
disableCoord = false; private final List<BooleanClause> clauses = new ArrayList<>();
}
/** Constructs an empty boolean query. /** Sole constructor. */
* public Builder() {}
/**
* {@link Similarity#coord(int,int)} may be disabled in scoring, as * {@link Similarity#coord(int,int)} may be disabled in scoring, as
* appropriate. For example, this score factor does not make sense for most * appropriate. For example, this score factor does not make sense for most
* automatically generated queries, like {@link WildcardQuery} and {@link * automatically generated queries, like {@link WildcardQuery} and {@link
* FuzzyQuery}. * FuzzyQuery}.
*
* @param disableCoord disables {@link Similarity#coord(int,int)} in scoring.
*/ */
public BooleanQuery(boolean disableCoord) { public Builder setDisableCoord(boolean disableCoord) {
this.disableCoord = disableCoord; this.disableCoord = disableCoord;
return this;
} }
/** Returns true iff {@link Similarity#coord(int,int)} is disabled in
* scoring for this query instance.
* @see #BooleanQuery(boolean)
*/
public boolean isCoordDisabled() { return disableCoord; }
/** /**
* Specifies a minimum number of the optional BooleanClauses * Specifies a minimum number of the optional BooleanClauses
* which must be satisfied. * which must be satisfied.
@ -109,82 +105,101 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
* *
* @param min the number of optional clauses that must match * @param min the number of optional clauses that must match
*/ */
public void setMinimumNumberShouldMatch(int min) { public Builder setMinimumNumberShouldMatch(int min) {
this.minNrShouldMatch = min; this.minimumNumberShouldMatch = min;
return this;
}
public Builder add(BooleanClause clause) {
add(clause.getQuery(), clause.getOccur());
return this;
}
/**
* @throws TooManyClauses if the new number of clauses exceeds the maximum clause number
*/
public void add(Query query, Occur occur) {
if (clauses.size() >= maxClauseCount) {
throw new TooManyClauses();
}
query = query.clone(); // be defensive
clauses.add(new BooleanClause(query, occur));
}
/** Create a new {@link BooleanQuery} based on the parameters that have
* been set on this builder. */
public BooleanQuery build() {
return new BooleanQuery(disableCoord, minimumNumberShouldMatch, clauses.toArray(new BooleanClause[0]));
}
}
private final boolean disableCoord;
private final int minimumNumberShouldMatch;
private final List<BooleanClause> clauses;
private BooleanQuery(boolean disableCoord, int minimumNumberShouldMatch,
BooleanClause[] clauses) {
this.disableCoord = disableCoord;
this.minimumNumberShouldMatch = minimumNumberShouldMatch;
this.clauses = Collections.unmodifiableList(Arrays.asList(clauses));
}
/**
* Return whether the coord factor is disabled.
*/
public boolean isCoordDisabled() {
return disableCoord;
} }
protected int minNrShouldMatch = 0;
/** /**
* Gets the minimum number of the optional BooleanClauses * Gets the minimum number of the optional BooleanClauses
* which must be satisfied. * which must be satisfied.
*/ */
public int getMinimumNumberShouldMatch() { public int getMinimumNumberShouldMatch() {
return minNrShouldMatch; return minimumNumberShouldMatch;
} }
/** Adds a clause to a boolean query. /** Return a list of the clauses of this {@link BooleanQuery}. */
* public List<BooleanClause> clauses() {
* @throws TooManyClauses if the new number of clauses exceeds the maximum clause number return clauses;
* @see #getMaxClauseCount()
*/
public void add(Query query, BooleanClause.Occur occur) {
add(new BooleanClause(query, occur));
} }
/** Adds a clause to a boolean query.
* @throws TooManyClauses if the new number of clauses exceeds the maximum clause number
* @see #getMaxClauseCount()
*/
public void add(BooleanClause clause) {
Objects.requireNonNull(clause, "BooleanClause must not be null");
if (clauses.size() >= maxClauseCount) {
throw new TooManyClauses();
}
clauses.add(clause);
}
/** Returns the set of clauses in this query. */
public BooleanClause[] getClauses() {
return clauses.toArray(new BooleanClause[clauses.size()]);
}
/** Returns the list of clauses in this query. */
public List<BooleanClause> clauses() { return clauses; }
/** Returns an iterator on the clauses in this query. It implements the {@link Iterable} interface to /** Returns an iterator on the clauses in this query. It implements the {@link Iterable} interface to
* make it possible to do: * make it possible to do:
* <pre class="prettyprint">for (BooleanClause clause : booleanQuery) {}</pre> * <pre class="prettyprint">for (BooleanClause clause : booleanQuery) {}</pre>
*/ */
@Override @Override
public final Iterator<BooleanClause> iterator() { return clauses().iterator(); } public final Iterator<BooleanClause> iterator() {
return clauses.iterator();
}
private static BooleanQuery downgradeMustClauseToFilter(BooleanQuery bq) { private BooleanQuery rewriteNoScoring() {
BooleanQuery clone = bq.clone(); BooleanQuery.Builder newQuery = new BooleanQuery.Builder();
clone.clauses.clear(); // ignore disableCoord, which only matters for scores
for (BooleanClause clause : bq.clauses()) { newQuery.setMinimumNumberShouldMatch(getMinimumNumberShouldMatch());
for (BooleanClause clause : clauses) {
if (clause.getOccur() == Occur.MUST) { if (clause.getOccur() == Occur.MUST) {
clone.add(clause.getQuery(), Occur.FILTER); newQuery.add(clause.getQuery(), Occur.FILTER);
} else { } else {
clone.add(clause); newQuery.add(clause);
} }
} }
return clone; return newQuery.build();
} }
@Override @Override
public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException { public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
BooleanQuery query = this; BooleanQuery query = this;
if (needsScores == false) { if (needsScores == false) {
// we rewrite MUST clauses to FILTER for caching query = rewriteNoScoring();
query = downgradeMustClauseToFilter(query);
} }
return new BooleanWeight(query, searcher, needsScores, disableCoord); return new BooleanWeight(query, searcher, needsScores, disableCoord);
} }
@Override @Override
public Query rewrite(IndexReader reader) throws IOException { public Query rewrite(IndexReader reader) throws IOException {
if (minNrShouldMatch == 0 && clauses.size() == 1) { // optimize 1-clause queries if (minimumNumberShouldMatch == 0 && clauses.size() == 1) {// optimize 1-clause queries
BooleanClause c = clauses.get(0); BooleanClause c = clauses.get(0);
if (!c.isProhibited()) { // just return clause if (!c.isProhibited()) { // just return clause
@ -210,32 +225,24 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
} }
} }
BooleanQuery clone = null; // recursively rewrite BooleanQuery.Builder builder = new BooleanQuery.Builder();
for (int i = 0 ; i < clauses.size(); i++) { builder.setDisableCoord(isCoordDisabled());
BooleanClause c = clauses.get(i); builder.setMinimumNumberShouldMatch(getMinimumNumberShouldMatch());
Query query = c.getQuery().rewrite(reader); boolean actuallyRewritten = false;
if (query != c.getQuery()) { // clause rewrote: must clone for (BooleanClause clause : this) {
if (clone == null) { Query query = clause.getQuery();
// The BooleanQuery clone is lazily initialized so only initialize Query rewritten = query.rewrite(reader);
// it if a rewritten clause differs from the original clause (and hasn't been if (rewritten != query) {
// initialized already). If nothing differs, the clone isn't needlessly created actuallyRewritten = true;
clone = this.clone();
} }
clone.clauses.set(i, new BooleanClause(query, c.getOccur())); builder.add(rewritten, clause.getOccur());
} }
if (actuallyRewritten) {
BooleanQuery rewritten = builder.build();
rewritten.setBoost(getBoost());
return rewritten;
} }
if (clone != null) { return super.rewrite(reader);
return clone; // some clauses rewrote
} else {
return this; // no clauses rewrote
}
}
@Override @SuppressWarnings("unchecked")
public BooleanQuery clone() {
BooleanQuery clone = (BooleanQuery)super.clone();
clone.clauses = new ArrayList<>(clauses);
return clone;
} }
/** Prints a user-readable version of this query. */ /** Prints a user-readable version of this query. */
@ -247,12 +254,11 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
buffer.append("("); buffer.append("(");
} }
for (int i = 0 ; i < clauses.size(); i++) { int i = 0;
BooleanClause c = clauses.get(i); for (BooleanClause c : this) {
buffer.append(c.getOccur().toString()); buffer.append(c.getOccur().toString());
Query subQuery = c.getQuery(); Query subQuery = c.getQuery();
if (subQuery != null) {
if (subQuery instanceof BooleanQuery) { // wrap sub-bools in parens if (subQuery instanceof BooleanQuery) { // wrap sub-bools in parens
buffer.append("("); buffer.append("(");
buffer.append(subQuery.toString(field)); buffer.append(subQuery.toString(field));
@ -260,13 +266,11 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
} else { } else {
buffer.append(subQuery.toString(field)); buffer.append(subQuery.toString(field));
} }
} else {
buffer.append("null");
}
if (i != clauses.size()-1) { if (i != clauses.size() - 1) {
buffer.append(" "); buffer.append(" ");
} }
i += 1;
} }
if (needParens) { if (needParens) {
@ -285,24 +289,20 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
return buffer.toString(); return buffer.toString();
} }
/** Returns true iff <code>o</code> is equal to this. */
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (!(o instanceof BooleanQuery)) { if (super.equals(o) == false) {
return false; return false;
} }
BooleanQuery other = (BooleanQuery)o; BooleanQuery that = (BooleanQuery)o;
return super.equals(o) return this.getMinimumNumberShouldMatch() == that.getMinimumNumberShouldMatch()
&& this.clauses.equals(other.clauses) && this.disableCoord == that.disableCoord
&& this.getMinimumNumberShouldMatch() == other.getMinimumNumberShouldMatch() && clauses.equals(that.clauses);
&& this.disableCoord == other.disableCoord;
} }
/** Returns a hash code value for this object.*/
@Override @Override
public int hashCode() { public int hashCode() {
return super.hashCode() ^ clauses.hashCode() return 31 * super.hashCode() + Objects.hash(disableCoord, minimumNumberShouldMatch, clauses);
+ getMinimumNumberShouldMatch() + (disableCoord ? 17:0);
} }
} }

View File

@ -26,7 +26,7 @@ import org.apache.lucene.util.PriorityQueue;
/** /**
* {@link BulkScorer} that is used for pure disjunctions and disjunctions * {@link BulkScorer} that is used for pure disjunctions and disjunctions
* that have low values of {@link BooleanQuery#setMinimumNumberShouldMatch(int)} * that have low values of {@link BooleanQuery.Builder#setMinimumNumberShouldMatch(int)}
* and dense clauses. This scorer scores documents by batches of 2048 docs. * and dense clauses. This scorer scores documents by batches of 2048 docs.
*/ */
final class BooleanScorer extends BulkScorer { final class BooleanScorer extends BulkScorer {

View File

@ -33,33 +33,35 @@ import org.apache.lucene.util.Bits;
/** /**
* Expert: the Weight for BooleanQuery, used to * Expert: the Weight for BooleanQuery, used to
* normalize, score and explain these queries. * normalize, score and explain these queries.
*
* @lucene.experimental
*/ */
public class BooleanWeight extends Weight { final class BooleanWeight extends Weight {
/** The Similarity implementation. */ /** The Similarity implementation. */
protected Similarity similarity; final Similarity similarity;
protected final BooleanQuery query; final BooleanQuery query;
protected ArrayList<Weight> weights;
protected int maxCoord; // num optional + num required
private final boolean disableCoord;
private final boolean needsScores;
private final float coords[];
public BooleanWeight(BooleanQuery query, IndexSearcher searcher, boolean needsScores, boolean disableCoord) throws IOException { final ArrayList<Weight> weights;
final int maxCoord; // num optional + num required
final boolean disableCoord;
final boolean needsScores;
final float coords[];
BooleanWeight(BooleanQuery query, IndexSearcher searcher, boolean needsScores, boolean disableCoord) throws IOException {
super(query); super(query);
this.query = query; this.query = query;
this.needsScores = needsScores; this.needsScores = needsScores;
this.similarity = searcher.getSimilarity(needsScores); this.similarity = searcher.getSimilarity(needsScores);
weights = new ArrayList<>(query.clauses().size()); weights = new ArrayList<>();
for (int i = 0 ; i < query.clauses().size(); i++) { int i = 0;
BooleanClause c = query.clauses().get(i); int maxCoord = 0;
for (BooleanClause c : query) {
Weight w = searcher.createWeight(c.getQuery(), needsScores && c.isScoring()); Weight w = searcher.createWeight(c.getQuery(), needsScores && c.isScoring());
weights.add(w); weights.add(w);
if (c.isScoring()) { if (c.isScoring()) {
maxCoord++; maxCoord++;
} }
i += 1;
} }
this.maxCoord = maxCoord;
// precompute coords (0..N, N). // precompute coords (0..N, N).
// set disableCoord when its explicit, scores are not needed, no scoring clauses, or the sim doesn't use it. // set disableCoord when its explicit, scores are not needed, no scoring clauses, or the sim doesn't use it.
@ -69,7 +71,7 @@ public class BooleanWeight extends Weight {
if (maxCoord > 0 && needsScores && disableCoord == false) { if (maxCoord > 0 && needsScores && disableCoord == false) {
// compute coords from the similarity, look for any actual ones. // compute coords from the similarity, look for any actual ones.
boolean seenActualCoord = false; boolean seenActualCoord = false;
for (int i = 1; i < coords.length; i++) { for (i = 1; i < coords.length; i++) {
coords[i] = coord(i, maxCoord); coords[i] = coord(i, maxCoord);
seenActualCoord |= (coords[i] != 1F); seenActualCoord |= (coords[i] != 1F);
} }
@ -82,7 +84,7 @@ public class BooleanWeight extends Weight {
@Override @Override
public void extractTerms(Set<Term> terms) { public void extractTerms(Set<Term> terms) {
int i = 0; int i = 0;
for (BooleanClause clause : query.clauses()) { for (BooleanClause clause : query) {
if (clause.isScoring() || (needsScores == false && clause.isProhibited() == false)) { if (clause.isScoring() || (needsScores == false && clause.isProhibited() == false)) {
weights.get(i).extractTerms(terms); weights.get(i).extractTerms(terms);
} }
@ -93,13 +95,15 @@ public class BooleanWeight extends Weight {
@Override @Override
public float getValueForNormalization() throws IOException { public float getValueForNormalization() throws IOException {
float sum = 0.0f; float sum = 0.0f;
for (int i = 0 ; i < weights.size(); i++) { int i = 0;
for (BooleanClause clause : query) {
// call sumOfSquaredWeights for all clauses in case of side effects // call sumOfSquaredWeights for all clauses in case of side effects
float s = weights.get(i).getValueForNormalization(); // sum sub weights float s = weights.get(i).getValueForNormalization(); // sum sub weights
if (query.clauses().get(i).isScoring()) { if (clause.isScoring()) {
// only add to sum for scoring clauses // only add to sum for scoring clauses
sum += s; sum += s;
} }
i += 1;
} }
sum *= query.getBoost() * query.getBoost(); // boost each sub-weight sum *= query.getBoost() * query.getBoost(); // boost each sub-weight
@ -141,7 +145,7 @@ public class BooleanWeight extends Weight {
boolean fail = false; boolean fail = false;
int matchCount = 0; int matchCount = 0;
int shouldMatchCount = 0; int shouldMatchCount = 0;
Iterator<BooleanClause> cIter = query.clauses().iterator(); Iterator<BooleanClause> cIter = query.iterator();
for (Iterator<Weight> wIter = weights.iterator(); wIter.hasNext();) { for (Iterator<Weight> wIter = weights.iterator(); wIter.hasNext();) {
Weight w = wIter.next(); Weight w = wIter.next();
BooleanClause c = cIter.next(); BooleanClause c = cIter.next();
@ -192,7 +196,7 @@ public class BooleanWeight extends Weight {
// pkg-private for forcing use of BooleanScorer in tests // pkg-private for forcing use of BooleanScorer in tests
BooleanScorer booleanScorer(LeafReaderContext context, Bits acceptDocs) throws IOException { BooleanScorer booleanScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
List<BulkScorer> optional = new ArrayList<BulkScorer>(); List<BulkScorer> optional = new ArrayList<BulkScorer>();
Iterator<BooleanClause> cIter = query.clauses().iterator(); Iterator<BooleanClause> cIter = query.iterator();
for (Weight w : weights) { for (Weight w : weights) {
BooleanClause c = cIter.next(); BooleanClause c = cIter.next();
BulkScorer subScorer = w.bulkScorer(context, acceptDocs); BulkScorer subScorer = w.bulkScorer(context, acceptDocs);
@ -218,11 +222,11 @@ public class BooleanWeight extends Weight {
return null; return null;
} }
if (query.minNrShouldMatch > optional.size()) { if (query.getMinimumNumberShouldMatch() > optional.size()) {
return null; return null;
} }
return new BooleanScorer(this, disableCoord, maxCoord, optional, Math.max(1, query.minNrShouldMatch), needsScores); return new BooleanScorer(this, disableCoord, maxCoord, optional, Math.max(1, query.getMinimumNumberShouldMatch()), needsScores);
} }
@Override @Override
@ -231,7 +235,7 @@ public class BooleanWeight extends Weight {
if (bulkScorer != null) { // BooleanScorer is applicable if (bulkScorer != null) { // BooleanScorer is applicable
// TODO: what is the right heuristic here? // TODO: what is the right heuristic here?
final long costThreshold; final long costThreshold;
if (query.minNrShouldMatch <= 1) { if (query.getMinimumNumberShouldMatch() <= 1) {
// when all clauses are optional, use BooleanScorer aggressively // when all clauses are optional, use BooleanScorer aggressively
// TODO: is there actually a threshold under which we should rather // TODO: is there actually a threshold under which we should rather
// use the regular scorer? // use the regular scorer?
@ -258,14 +262,14 @@ public class BooleanWeight extends Weight {
// initially the user provided value, // initially the user provided value,
// but if minNrShouldMatch == optional.size(), // but if minNrShouldMatch == optional.size(),
// we will optimize and move these to required, making this 0 // we will optimize and move these to required, making this 0
int minShouldMatch = query.minNrShouldMatch; int minShouldMatch = query.getMinimumNumberShouldMatch();
List<Scorer> required = new ArrayList<>(); List<Scorer> required = new ArrayList<>();
// clauses that are required AND participate in scoring, subset of 'required' // clauses that are required AND participate in scoring, subset of 'required'
List<Scorer> requiredScoring = new ArrayList<>(); List<Scorer> requiredScoring = new ArrayList<>();
List<Scorer> prohibited = new ArrayList<>(); List<Scorer> prohibited = new ArrayList<>();
List<Scorer> optional = new ArrayList<>(); List<Scorer> optional = new ArrayList<>();
Iterator<BooleanClause> cIter = query.clauses().iterator(); Iterator<BooleanClause> cIter = query.iterator();
for (Weight w : weights) { for (Weight w : weights) {
BooleanClause c = cIter.next(); BooleanClause c = cIter.next();
Scorer subScorer = w.scorer(context, acceptDocs); Scorer subScorer = w.scorer(context, acceptDocs);

View File

@ -339,9 +339,10 @@ public class FilteredQuery extends Query {
} else { } else {
// In that case the filter does not implement random-access anyway so // In that case the filter does not implement random-access anyway so
// we want to take advantage of approximations // we want to take advantage of approximations
BooleanQuery rewritten = new BooleanQuery(); BooleanQuery.Builder builder = new BooleanQuery.Builder();
rewritten.add(queryRewritten, Occur.MUST); builder.add(queryRewritten, Occur.MUST);
rewritten.add(filterRewritten, Occur.FILTER); builder.add(filterRewritten, Occur.FILTER);
BooleanQuery rewritten = builder.build();
rewritten.setBoost(getBoost()); rewritten.setBoost(getBoost());
return rewritten; return rewritten;
} }

View File

@ -18,12 +18,8 @@ package org.apache.lucene.search;
*/ */
import java.io.IOException; import java.io.IOException;
import java.util.Set;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.ToStringUtils; import org.apache.lucene.util.ToStringUtils;
/** /**
@ -34,13 +30,16 @@ public class MatchNoDocsQuery extends Query {
@Override @Override
public Query rewrite(IndexReader reader) throws IOException { public Query rewrite(IndexReader reader) throws IOException {
// Rewrite to an empty BooleanQuery so no Scorer or Weight is required // Rewrite to an empty BooleanQuery so no Scorer or Weight is required
return new BooleanQuery(); BooleanQuery.Builder builder = new BooleanQuery.Builder();
Query rewritten = builder.build();
rewritten.setBoost(getBoost());
return rewritten;
} }
@Override @Override
public String toString(String field) { public String toString(String field) {
StringBuilder buffer = new StringBuilder(); StringBuilder buffer = new StringBuilder();
buffer.append("_none_"); buffer.append("");
buffer.append(ToStringUtils.boost(getBoost())); buffer.append(ToStringUtils.boost(getBoost()));
return buffer.toString(); return buffer.toString();
} }

View File

@ -31,7 +31,7 @@ import static org.apache.lucene.search.DisiPriorityQueue.rightNode;
/** /**
* A {@link Scorer} for {@link BooleanQuery} when * A {@link Scorer} for {@link BooleanQuery} when
* {@link BooleanQuery#setMinimumNumberShouldMatch(int) minShouldMatch} is * {@link BooleanQuery.Builder#setMinimumNumberShouldMatch(int) minShouldMatch} is
* between 2 and the total number of clauses. * between 2 and the total number of clauses.
* *
* This implementation keeps sub scorers in 3 different places: * This implementation keeps sub scorers in 3 different places:

View File

@ -255,15 +255,17 @@ public class MultiPhraseQuery extends Query {
@Override @Override
public Query rewrite(IndexReader reader) { public Query rewrite(IndexReader reader) {
if (termArrays.isEmpty()) { if (termArrays.isEmpty()) {
BooleanQuery bq = new BooleanQuery(); MatchNoDocsQuery rewritten = new MatchNoDocsQuery();
bq.setBoost(getBoost()); rewritten.setBoost(getBoost());
return bq; return rewritten;
} else if (termArrays.size() == 1) { // optimize one-term case } else if (termArrays.size() == 1) { // optimize one-term case
Term[] terms = termArrays.get(0); Term[] terms = termArrays.get(0);
BooleanQuery boq = new BooleanQuery(true); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(true);
for (int i=0; i<terms.length; i++) { for (int i=0; i<terms.length; i++) {
boq.add(new TermQuery(terms[i]), BooleanClause.Occur.SHOULD); builder.add(new TermQuery(terms[i]), BooleanClause.Occur.SHOULD);
} }
BooleanQuery boq = builder.build();
boq.setBoost(getBoost()); boq.setBoost(getBoost());
return boq; return boq;
} else { } else {

View File

@ -30,6 +30,7 @@ import org.apache.lucene.index.TermContext;
import org.apache.lucene.index.TermState; import org.apache.lucene.index.TermState;
import org.apache.lucene.index.Terms; import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum; import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.BooleanQuery.Builder;
import org.apache.lucene.util.AttributeSource; import org.apache.lucene.util.AttributeSource;
/** /**
@ -141,7 +142,7 @@ public abstract class MultiTermQuery extends Query {
* *
* @see #setRewriteMethod * @see #setRewriteMethod
*/ */
public static final class TopTermsScoringBooleanQueryRewrite extends TopTermsRewrite<BooleanQuery> { public static final class TopTermsScoringBooleanQueryRewrite extends TopTermsRewrite<BooleanQuery.Builder> {
/** /**
* Create a TopTermsScoringBooleanQueryRewrite for * Create a TopTermsScoringBooleanQueryRewrite for
@ -160,12 +161,19 @@ public abstract class MultiTermQuery extends Query {
} }
@Override @Override
protected BooleanQuery getTopLevelQuery() { protected BooleanQuery.Builder getTopLevelBuilder() {
return new BooleanQuery(true); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(true);
return builder;
} }
@Override @Override
protected void addClause(BooleanQuery topLevel, Term term, int docCount, float boost, TermContext states) { protected Query build(Builder builder) {
return builder.build();
}
@Override
protected void addClause(BooleanQuery.Builder topLevel, Term term, int docCount, float boost, TermContext states) {
final TermQuery tq = new TermQuery(term, states); final TermQuery tq = new TermQuery(term, states);
tq.setBoost(boost); tq.setBoost(boost);
topLevel.add(tq, BooleanClause.Occur.SHOULD); topLevel.add(tq, BooleanClause.Occur.SHOULD);
@ -186,7 +194,7 @@ public abstract class MultiTermQuery extends Query {
* @see #setRewriteMethod * @see #setRewriteMethod
*/ */
public static final class TopTermsBlendedFreqScoringRewrite extends public static final class TopTermsBlendedFreqScoringRewrite extends
TopTermsRewrite<BooleanQuery> { TopTermsRewrite<BooleanQuery.Builder> {
/** /**
* Create a TopTermsBlendedScoringBooleanQueryRewrite for at most * Create a TopTermsBlendedScoringBooleanQueryRewrite for at most
@ -205,12 +213,19 @@ public abstract class MultiTermQuery extends Query {
} }
@Override @Override
protected BooleanQuery getTopLevelQuery() { protected BooleanQuery.Builder getTopLevelBuilder() {
return new BooleanQuery(true); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(true);
return builder;
} }
@Override @Override
protected void addClause(BooleanQuery topLevel, Term term, int docCount, protected Query build(Builder builder) {
return builder.build();
}
@Override
protected void addClause(BooleanQuery.Builder topLevel, Term term, int docCount,
float boost, TermContext states) { float boost, TermContext states) {
final TermQuery tq = new TermQuery(term, states); final TermQuery tq = new TermQuery(term, states);
tq.setBoost(boost); tq.setBoost(boost);
@ -222,7 +237,6 @@ public abstract class MultiTermQuery extends Query {
if (scoreTerms.length <= 1) { if (scoreTerms.length <= 1) {
return; return;
} }
int maxDoc = reader.maxDoc();
int maxDf = 0; int maxDf = 0;
long maxTtf = 0; long maxTtf = 0;
for (ScoreTerm scoreTerm : scoreTerms) { for (ScoreTerm scoreTerm : scoreTerms) {
@ -282,7 +296,7 @@ public abstract class MultiTermQuery extends Query {
* *
* @see #setRewriteMethod * @see #setRewriteMethod
*/ */
public static final class TopTermsBoostOnlyBooleanQueryRewrite extends TopTermsRewrite<BooleanQuery> { public static final class TopTermsBoostOnlyBooleanQueryRewrite extends TopTermsRewrite<BooleanQuery.Builder> {
/** /**
* Create a TopTermsBoostOnlyBooleanQueryRewrite for * Create a TopTermsBoostOnlyBooleanQueryRewrite for
@ -301,12 +315,19 @@ public abstract class MultiTermQuery extends Query {
} }
@Override @Override
protected BooleanQuery getTopLevelQuery() { protected BooleanQuery.Builder getTopLevelBuilder() {
return new BooleanQuery(true); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(true);
return builder;
} }
@Override @Override
protected void addClause(BooleanQuery topLevel, Term term, int docFreq, float boost, TermContext states) { protected Query build(BooleanQuery.Builder builder) {
return builder.build();
}
@Override
protected void addClause(BooleanQuery.Builder topLevel, Term term, int docFreq, float boost, TermContext states) {
final Query q = new ConstantScoreQuery(new TermQuery(term, states)); final Query q = new ConstantScoreQuery(new TermQuery(term, states));
q.setBoost(boost); q.setBoost(boost);
topLevel.add(q, BooleanClause.Occur.SHOULD); topLevel.add(q, BooleanClause.Occur.SHOULD);

View File

@ -151,13 +151,13 @@ final class MultiTermQueryConstantScoreWrapper<Q extends MultiTermQuery> extends
final List<TermAndState> collectedTerms = new ArrayList<>(); final List<TermAndState> collectedTerms = new ArrayList<>();
if (collectTerms(context, termsEnum, collectedTerms)) { if (collectTerms(context, termsEnum, collectedTerms)) {
// build a boolean query // build a boolean query
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
for (TermAndState t : collectedTerms) { for (TermAndState t : collectedTerms) {
final TermContext termContext = new TermContext(searcher.getTopReaderContext()); final TermContext termContext = new TermContext(searcher.getTopReaderContext());
termContext.register(t.state, context.ord, t.docFreq, t.totalTermFreq); termContext.register(t.state, context.ord, t.docFreq, t.totalTermFreq);
bq.add(new TermQuery(new Term(query.field, t.term), termContext), Occur.SHOULD); bq.add(new TermQuery(new Term(query.field, t.term), termContext), Occur.SHOULD);
} }
Query q = new ConstantScoreQuery(bq); Query q = new ConstantScoreQuery(bq.build());
q.setBoost(score()); q.setBoost(score());
return new WeightOrBitSet(searcher.rewrite(q).createWeight(searcher, needsScores)); return new WeightOrBitSet(searcher.rewrite(q).createWeight(searcher, needsScores));
} }

View File

@ -264,9 +264,9 @@ public class PhraseQuery extends Query {
@Override @Override
public Query rewrite(IndexReader reader) throws IOException { public Query rewrite(IndexReader reader) throws IOException {
if (terms.length == 0) { if (terms.length == 0) {
BooleanQuery bq = new BooleanQuery(); MatchNoDocsQuery q = new MatchNoDocsQuery();
bq.setBoost(getBoost()); q.setBoost(getBoost());
return bq; return q;
} else if (terms.length == 1) { } else if (terms.length == 1) {
TermQuery tq = new TermQuery(terms[0]); TermQuery tq = new TermQuery(terms[0]);
tq.setBoost(getBoost()); tq.setBoost(getBoost());

View File

@ -37,7 +37,7 @@ import org.apache.lucene.util.RamUsageEstimator;
* the scores as computed by the query. * the scores as computed by the query.
* <p> * <p>
* @lucene.internal Only public to be accessible by spans package. */ * @lucene.internal Only public to be accessible by spans package. */
public abstract class ScoringRewrite<Q extends Query> extends TermCollectingRewrite<Q> { public abstract class ScoringRewrite<B> extends TermCollectingRewrite<B> {
/** A rewrite method that first translates each term into /** A rewrite method that first translates each term into
* {@link BooleanClause.Occur#SHOULD} clause in a * {@link BooleanClause.Occur#SHOULD} clause in a
@ -52,14 +52,20 @@ public abstract class ScoringRewrite<Q extends Query> extends TermCollectingRewr
* exceeds {@link BooleanQuery#getMaxClauseCount}. * exceeds {@link BooleanQuery#getMaxClauseCount}.
* *
* @see MultiTermQuery#setRewriteMethod */ * @see MultiTermQuery#setRewriteMethod */
public final static ScoringRewrite<BooleanQuery> SCORING_BOOLEAN_REWRITE = new ScoringRewrite<BooleanQuery>() { public final static ScoringRewrite<BooleanQuery.Builder> SCORING_BOOLEAN_REWRITE = new ScoringRewrite<BooleanQuery.Builder>() {
@Override @Override
protected BooleanQuery getTopLevelQuery() { protected BooleanQuery.Builder getTopLevelBuilder() {
return new BooleanQuery(true); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(true);
return builder;
}
protected Query build(BooleanQuery.Builder builder) {
return builder.build();
} }
@Override @Override
protected void addClause(BooleanQuery topLevel, Term term, int docCount, protected void addClause(BooleanQuery.Builder topLevel, Term term, int docCount,
float boost, TermContext states) { float boost, TermContext states) {
final TermQuery tq = new TermQuery(term, states); final TermQuery tq = new TermQuery(term, states);
tq.setBoost(boost); tq.setBoost(boost);
@ -86,7 +92,7 @@ public abstract class ScoringRewrite<Q extends Query> extends TermCollectingRewr
public final static RewriteMethod CONSTANT_SCORE_BOOLEAN_REWRITE = new RewriteMethod() { public final static RewriteMethod CONSTANT_SCORE_BOOLEAN_REWRITE = new RewriteMethod() {
@Override @Override
public Query rewrite(IndexReader reader, MultiTermQuery query) throws IOException { public Query rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
final BooleanQuery bq = SCORING_BOOLEAN_REWRITE.rewrite(reader, query); final Query bq = SCORING_BOOLEAN_REWRITE.rewrite(reader, query);
// strip the scores off // strip the scores off
final Query result = new ConstantScoreQuery(bq); final Query result = new ConstantScoreQuery(bq);
result.setBoost(query.getBoost()); result.setBoost(query.getBoost());
@ -99,8 +105,8 @@ public abstract class ScoringRewrite<Q extends Query> extends TermCollectingRewr
protected abstract void checkMaxClauseCount(int count) throws IOException; protected abstract void checkMaxClauseCount(int count) throws IOException;
@Override @Override
public final Q rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException { public final Query rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
final Q result = getTopLevelQuery(); final B builder = getTopLevelBuilder();
final ParallelArraysTermCollector col = new ParallelArraysTermCollector(); final ParallelArraysTermCollector col = new ParallelArraysTermCollector();
collectTerms(reader, query, col); collectTerms(reader, query, col);
@ -113,10 +119,10 @@ public abstract class ScoringRewrite<Q extends Query> extends TermCollectingRewr
final int pos = sort[i]; final int pos = sort[i];
final Term term = new Term(query.getField(), col.terms.get(pos, new BytesRef())); final Term term = new Term(query.getField(), col.terms.get(pos, new BytesRef()));
assert termStates[pos].hasOnlyRealTerms() == false || reader.docFreq(term) == termStates[pos].docFreq(); assert termStates[pos].hasOnlyRealTerms() == false || reader.docFreq(term) == termStates[pos].docFreq();
addClause(result, term, termStates[pos].docFreq(), query.getBoost() * boost[pos], termStates[pos]); addClause(builder, term, termStates[pos].docFreq(), query.getBoost() * boost[pos], termStates[pos]);
} }
} }
return result; return build(builder);
} }
final class ParallelArraysTermCollector extends TermCollector { final class ParallelArraysTermCollector extends TermCollector {

View File

@ -20,7 +20,6 @@ package org.apache.lucene.search;
import java.io.IOException; import java.io.IOException;
import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.Fields;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexReaderContext; import org.apache.lucene.index.IndexReaderContext;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
@ -30,18 +29,21 @@ import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.util.AttributeSource; import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.BytesRef;
abstract class TermCollectingRewrite<Q extends Query> extends MultiTermQuery.RewriteMethod { abstract class TermCollectingRewrite<B> extends MultiTermQuery.RewriteMethod {
/** Return a suitable top-level Query for holding all expanded terms. */ /** Return a suitable builder for the top-level Query for holding all expanded terms. */
protected abstract Q getTopLevelQuery() throws IOException; protected abstract B getTopLevelBuilder() throws IOException;
/** Add a MultiTermQuery term to the top-level query */ /** Finalize the creation of the query from the builder. */
protected final void addClause(Q topLevel, Term term, int docCount, float boost) throws IOException { protected abstract Query build(B builder);
/** Add a MultiTermQuery term to the top-level query builder. */
protected final void addClause(B topLevel, Term term, int docCount, float boost) throws IOException {
addClause(topLevel, term, docCount, boost, null); addClause(topLevel, term, docCount, boost, null);
} }
protected abstract void addClause(Q topLevel, Term term, int docCount, float boost, TermContext states) throws IOException; protected abstract void addClause(B topLevel, Term term, int docCount, float boost, TermContext states) throws IOException;
final void collectTerms(IndexReader reader, MultiTermQuery query, TermCollector collector) throws IOException { final void collectTerms(IndexReader reader, MultiTermQuery query, TermCollector collector) throws IOException {

View File

@ -37,7 +37,7 @@ import org.apache.lucene.util.BytesRefBuilder;
* via a priority queue. * via a priority queue.
* @lucene.internal Only public to be accessible by spans package. * @lucene.internal Only public to be accessible by spans package.
*/ */
public abstract class TopTermsRewrite<Q extends Query> extends TermCollectingRewrite<Q> { public abstract class TopTermsRewrite<B> extends TermCollectingRewrite<B> {
private final int size; private final int size;
@ -61,7 +61,7 @@ public abstract class TopTermsRewrite<Q extends Query> extends TermCollectingRew
protected abstract int getMaxSize(); protected abstract int getMaxSize();
@Override @Override
public final Q rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException { public final Query rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
final int maxSize = Math.min(size, getMaxSize()); final int maxSize = Math.min(size, getMaxSize());
final PriorityQueue<ScoreTerm> stQueue = new PriorityQueue<>(); final PriorityQueue<ScoreTerm> stQueue = new PriorityQueue<>();
collectTerms(reader, query, new TermCollector() { collectTerms(reader, query, new TermCollector() {
@ -154,7 +154,7 @@ public abstract class TopTermsRewrite<Q extends Query> extends TermCollectingRew
} }
}); });
final Q q = getTopLevelQuery(); final B b = getTopLevelBuilder();
final ScoreTerm[] scoreTerms = stQueue.toArray(new ScoreTerm[stQueue.size()]); final ScoreTerm[] scoreTerms = stQueue.toArray(new ScoreTerm[stQueue.size()]);
ArrayUtil.timSort(scoreTerms, scoreTermSortByTermComp); ArrayUtil.timSort(scoreTerms, scoreTermSortByTermComp);
@ -162,9 +162,9 @@ public abstract class TopTermsRewrite<Q extends Query> extends TermCollectingRew
for (final ScoreTerm st : scoreTerms) { for (final ScoreTerm st : scoreTerms) {
final Term term = new Term(query.field, st.bytes.toBytesRef()); final Term term = new Term(query.field, st.bytes.toBytesRef());
addClause(q, term, st.termState.docFreq(), query.getBoost() * st.boost, st.termState); // add to query addClause(b, term, st.termState.docFreq(), query.getBoost() * st.boost, st.termState); // add to query
} }
return q; return build(b);
} }
void adjustScoreTerms(IndexReader reader, ScoreTerm[] scoreTerms) { void adjustScoreTerms(IndexReader reader, ScoreTerm[] scoreTerms) {

View File

@ -80,11 +80,9 @@ public class PayloadSpanUtil {
private void queryToSpanQuery(Query query, Collection<byte[]> payloads) private void queryToSpanQuery(Query query, Collection<byte[]> payloads)
throws IOException { throws IOException {
if (query instanceof BooleanQuery) { if (query instanceof BooleanQuery) {
BooleanClause[] queryClauses = ((BooleanQuery) query).getClauses(); for (BooleanClause clause : (BooleanQuery) query) {
if (!clause.isProhibited()) {
for (int i = 0; i < queryClauses.length; i++) { queryToSpanQuery(clause.getQuery(), payloads);
if (!queryClauses[i].isProhibited()) {
queryToSpanQuery(queryClauses[i].getQuery(), payloads);
} }
} }

View File

@ -163,10 +163,14 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
public final static SpanRewriteMethod SCORING_SPAN_QUERY_REWRITE = new SpanRewriteMethod() { public final static SpanRewriteMethod SCORING_SPAN_QUERY_REWRITE = new SpanRewriteMethod() {
private final ScoringRewrite<SpanOrQuery> delegate = new ScoringRewrite<SpanOrQuery>() { private final ScoringRewrite<SpanOrQuery> delegate = new ScoringRewrite<SpanOrQuery>() {
@Override @Override
protected SpanOrQuery getTopLevelQuery() { protected SpanOrQuery getTopLevelBuilder() {
return new SpanOrQuery(); return new SpanOrQuery();
} }
protected Query build(SpanOrQuery builder) {
return builder;
}
@Override @Override
protected void checkMaxClauseCount(int count) { protected void checkMaxClauseCount(int count) {
// we accept all terms as SpanOrQuery has no limits // we accept all terms as SpanOrQuery has no limits
@ -182,7 +186,7 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
@Override @Override
public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException { public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
return delegate.rewrite(reader, query); return (SpanQuery) delegate.rewrite(reader, query);
} }
}; };
@ -212,10 +216,15 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
} }
@Override @Override
protected SpanOrQuery getTopLevelQuery() { protected SpanOrQuery getTopLevelBuilder() {
return new SpanOrQuery(); return new SpanOrQuery();
} }
@Override
protected Query build(SpanOrQuery builder) {
return builder;
}
@Override @Override
protected void addClause(SpanOrQuery topLevel, Term term, int docFreq, float boost, TermContext states) { protected void addClause(SpanOrQuery topLevel, Term term, int docFreq, float boost, TermContext states) {
final SpanTermQuery q = new SpanTermQuery(term, states); final SpanTermQuery q = new SpanTermQuery(term, states);
@ -232,7 +241,7 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
@Override @Override
public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException { public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
return delegate.rewrite(reader, query); return (SpanQuery) delegate.rewrite(reader, query);
} }
@Override @Override

View File

@ -135,7 +135,13 @@ public class QueryBuilder {
Query query = createFieldQuery(analyzer, BooleanClause.Occur.SHOULD, field, queryText, false, 0); Query query = createFieldQuery(analyzer, BooleanClause.Occur.SHOULD, field, queryText, false, 0);
if (query instanceof BooleanQuery) { if (query instanceof BooleanQuery) {
BooleanQuery bq = (BooleanQuery) query; BooleanQuery bq = (BooleanQuery) query;
bq.setMinimumNumberShouldMatch((int) (fraction * bq.clauses().size())); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(bq.isCoordDisabled());
builder.setMinimumNumberShouldMatch((int) (fraction * bq.clauses().size()));
for (BooleanClause clause : bq) {
builder.add(clause);
}
query = builder.build();
} }
return query; return query;
} }
@ -276,7 +282,8 @@ public class QueryBuilder {
* Creates simple boolean query from the cached tokenstream contents * Creates simple boolean query from the cached tokenstream contents
*/ */
private Query analyzeBoolean(String field, TokenStream stream) throws IOException { private Query analyzeBoolean(String field, TokenStream stream) throws IOException {
BooleanQuery q = newBooleanQuery(true); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.setDisableCoord(true);
TermToBytesRefAttribute termAtt = stream.getAttribute(TermToBytesRefAttribute.class); TermToBytesRefAttribute termAtt = stream.getAttribute(TermToBytesRefAttribute.class);
BytesRef bytes = termAtt.getBytesRef(); BytesRef bytes = termAtt.getBytesRef();
@ -288,15 +295,26 @@ public class QueryBuilder {
q.add(currentQuery, BooleanClause.Occur.SHOULD); q.add(currentQuery, BooleanClause.Occur.SHOULD);
} }
return q; return q.build();
}
private void add(BooleanQuery.Builder q, BooleanQuery current, BooleanClause.Occur operator) {
if (current.clauses().isEmpty()) {
return;
}
if (current.clauses().size() == 1) {
q.add(current.clauses().iterator().next().getQuery(), operator);
} else {
q.add(current, operator);
}
} }
/** /**
* Creates complex boolean query from the cached tokenstream contents * Creates complex boolean query from the cached tokenstream contents
*/ */
private Query analyzeMultiBoolean(String field, TokenStream stream, BooleanClause.Occur operator) throws IOException { private Query analyzeMultiBoolean(String field, TokenStream stream, BooleanClause.Occur operator) throws IOException {
BooleanQuery q = newBooleanQuery(false); BooleanQuery.Builder q = newBooleanQuery(false);
Query currentQuery = null; BooleanQuery.Builder currentQuery = newBooleanQuery(true);
TermToBytesRefAttribute termAtt = stream.getAttribute(TermToBytesRefAttribute.class); TermToBytesRefAttribute termAtt = stream.getAttribute(TermToBytesRefAttribute.class);
BytesRef bytes = termAtt.getBytesRef(); BytesRef bytes = termAtt.getBytesRef();
@ -306,23 +324,15 @@ public class QueryBuilder {
stream.reset(); stream.reset();
while (stream.incrementToken()) { while (stream.incrementToken()) {
termAtt.fillBytesRef(); termAtt.fillBytesRef();
if (posIncrAtt.getPositionIncrement() == 0) { if (posIncrAtt.getPositionIncrement() != 0) {
if (!(currentQuery instanceof BooleanQuery)) { add(q, currentQuery.build(), operator);
Query t = currentQuery;
currentQuery = newBooleanQuery(true); currentQuery = newBooleanQuery(true);
((BooleanQuery)currentQuery).add(t, BooleanClause.Occur.SHOULD);
} }
((BooleanQuery)currentQuery).add(newTermQuery(new Term(field, BytesRef.deepCopyOf(bytes))), BooleanClause.Occur.SHOULD); currentQuery.add(newTermQuery(new Term(field, BytesRef.deepCopyOf(bytes))), BooleanClause.Occur.SHOULD);
} else {
if (currentQuery != null) {
q.add(currentQuery, operator);
} }
currentQuery = newTermQuery(new Term(field, BytesRef.deepCopyOf(bytes))); add(q, currentQuery.build(), operator);
}
}
q.add(currentQuery, operator);
return q; return q.build();
} }
/** /**
@ -399,8 +409,10 @@ public class QueryBuilder {
* @param disableCoord disable coord * @param disableCoord disable coord
* @return new BooleanQuery instance * @return new BooleanQuery instance
*/ */
protected BooleanQuery newBooleanQuery(boolean disableCoord) { protected BooleanQuery.Builder newBooleanQuery(boolean disableCoord) {
return new BooleanQuery(disableCoord); BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(disableCoord);
return builder;
} }
/** /**

View File

@ -24,7 +24,6 @@ import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.store.*; import org.apache.lucene.store.*;
import org.apache.lucene.document.*; import org.apache.lucene.document.*;
import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.*;
@ -162,10 +161,10 @@ public class TestSearch extends LuceneTestCase {
private List<Query> buildQueries() { private List<Query> buildQueries() {
List<Query> queries = new ArrayList<>(); List<Query> queries = new ArrayList<>();
BooleanQuery booleanAB = new BooleanQuery(); BooleanQuery.Builder booleanAB = new BooleanQuery.Builder();
booleanAB.add(new TermQuery(new Term("contents", "a")), BooleanClause.Occur.SHOULD); booleanAB.add(new TermQuery(new Term("contents", "a")), BooleanClause.Occur.SHOULD);
booleanAB.add(new TermQuery(new Term("contents", "b")), BooleanClause.Occur.SHOULD); booleanAB.add(new TermQuery(new Term("contents", "b")), BooleanClause.Occur.SHOULD);
queries.add(booleanAB); queries.add(booleanAB.build());
PhraseQuery phraseAB = new PhraseQuery("contents", "a", "b"); PhraseQuery phraseAB = new PhraseQuery("contents", "a", "b");
queries.add(phraseAB); queries.add(phraseAB);
@ -173,10 +172,10 @@ public class TestSearch extends LuceneTestCase {
PhraseQuery phraseABC = new PhraseQuery("contents", "a", "b", "c"); PhraseQuery phraseABC = new PhraseQuery("contents", "a", "b", "c");
queries.add(phraseABC); queries.add(phraseABC);
BooleanQuery booleanAC = new BooleanQuery(); BooleanQuery.Builder booleanAC = new BooleanQuery.Builder();
booleanAC.add(new TermQuery(new Term("contents", "a")), BooleanClause.Occur.SHOULD); booleanAC.add(new TermQuery(new Term("contents", "a")), BooleanClause.Occur.SHOULD);
booleanAC.add(new TermQuery(new Term("contents", "c")), BooleanClause.Occur.SHOULD); booleanAC.add(new TermQuery(new Term("contents", "c")), BooleanClause.Occur.SHOULD);
queries.add(booleanAC); queries.add(booleanAC.build());
PhraseQuery phraseAC = new PhraseQuery("contents", "a", "c"); PhraseQuery phraseAC = new PhraseQuery("contents", "a", "c");
queries.add(phraseAC); queries.add(phraseAC);

View File

@ -125,12 +125,12 @@ public class TestSearchForDuplicates extends LuceneTestCase {
searcher = newSearcher(reader); searcher = newSearcher(reader);
hits = null; hits = null;
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(PRIORITY_FIELD, HIGH_PRIORITY)), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(PRIORITY_FIELD, HIGH_PRIORITY)), BooleanClause.Occur.SHOULD);
booleanQuery.add(new TermQuery(new Term(PRIORITY_FIELD, MED_PRIORITY)), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(PRIORITY_FIELD, MED_PRIORITY)), BooleanClause.Occur.SHOULD);
out.println("Query: " + booleanQuery.toString(PRIORITY_FIELD)); out.println("Query: " + booleanQuery.build().toString(PRIORITY_FIELD));
hits = searcher.search(booleanQuery, MAX_DOCS, sort).scoreDocs; hits = searcher.search(booleanQuery.build(), MAX_DOCS, sort).scoreDocs;
printHits(out, hits, searcher); printHits(out, hits, searcher);
checkHits(hits, MAX_DOCS, searcher); checkHits(hits, MAX_DOCS, searcher);

View File

@ -353,17 +353,17 @@ public class TestIndexableField extends LuceneTestCase {
assertTrue(vectors == null || vectors.terms(name) == null); assertTrue(vectors == null || vectors.terms(name) == null);
} }
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("id", ""+id)), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term("id", ""+id)), BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term(name, "text")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term(name, "text")), BooleanClause.Occur.MUST);
final TopDocs hits2 = s.search(bq, 1); final TopDocs hits2 = s.search(bq.build(), 1);
assertEquals(1, hits2.totalHits); assertEquals(1, hits2.totalHits);
assertEquals(docID, hits2.scoreDocs[0].doc); assertEquals(docID, hits2.scoreDocs[0].doc);
bq = new BooleanQuery(); bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("id", ""+id)), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term("id", ""+id)), BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term(name, ""+counter)), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term(name, ""+counter)), BooleanClause.Occur.MUST);
final TopDocs hits3 = s.search(bq, 1); final TopDocs hits3 = s.search(bq.build(), 1);
assertEquals(1, hits3.totalHits); assertEquals(1, hits3.totalHits);
assertEquals(docID, hits3.scoreDocs[0].doc); assertEquals(docID, hits3.scoreDocs[0].doc);
} }

View File

@ -415,11 +415,11 @@ public class TestOmitTf extends LuceneTestCase {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(q1,Occur.MUST); bq.add(q1,Occur.MUST);
bq.add(q4,Occur.MUST); bq.add(q4,Occur.MUST);
searcher.search(bq, searcher.search(bq.build(),
new CountingHitCollector() { new CountingHitCollector() {
@Override @Override
public final void collect(int doc) throws IOException { public final void collect(int doc) throws IOException {

View File

@ -74,10 +74,10 @@ public class TestParallelCompositeReader extends LuceneTestCase {
queryTest(new TermQuery(new Term("f4", "v1"))); queryTest(new TermQuery(new Term("f4", "v1")));
queryTest(new TermQuery(new Term("f4", "v2"))); queryTest(new TermQuery(new Term("f4", "v2")));
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(new TermQuery(new Term("f1", "v1")), Occur.MUST); bq1.add(new TermQuery(new Term("f1", "v1")), Occur.MUST);
bq1.add(new TermQuery(new Term("f4", "v1")), Occur.MUST); bq1.add(new TermQuery(new Term("f4", "v1")), Occur.MUST);
queryTest(bq1); queryTest(bq1.build());
} }
public void testRefCounts1() throws IOException { public void testRefCounts1() throws IOException {

View File

@ -48,10 +48,10 @@ public class TestParallelLeafReader extends LuceneTestCase {
queryTest(new TermQuery(new Term("f4", "v1"))); queryTest(new TermQuery(new Term("f4", "v1")));
queryTest(new TermQuery(new Term("f4", "v2"))); queryTest(new TermQuery(new Term("f4", "v2")));
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(new TermQuery(new Term("f1", "v1")), Occur.MUST); bq1.add(new TermQuery(new Term("f1", "v1")), Occur.MUST);
bq1.add(new TermQuery(new Term("f4", "v1")), Occur.MUST); bq1.add(new TermQuery(new Term("f4", "v1")), Occur.MUST);
queryTest(bq1); queryTest(bq1.build());
single.getIndexReader().close(); single = null; single.getIndexReader().close(); single = null;
parallel.getIndexReader().close(); parallel = null; parallel.getIndexReader().close(); parallel = null;

View File

@ -31,15 +31,15 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q1 = new TermQuery(t1); TermQuery q1 = new TermQuery(t1);
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.MUST); bq1.add(q1, Occur.MUST);
bq1.add(q2, Occur.MUST); bq1.add(q2, Occur.MUST);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq2.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq2.add(new RandomApproximationQuery(q2, random()), Occur.MUST); bq2.add(new RandomApproximationQuery(q2, random()), Occur.MUST);
assertSameScores(bq1, bq2); assertSameScores(bq1.build(), bq2.build());
} }
public void testNestedConjunction() throws Exception { public void testNestedConjunction() throws Exception {
@ -50,23 +50,23 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
TermQuery q3 = new TermQuery(t3); TermQuery q3 = new TermQuery(t3);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.MUST); bq1.add(q1, Occur.MUST);
bq1.add(q2, Occur.MUST); bq1.add(q2, Occur.MUST);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(bq1, Occur.MUST); bq2.add(bq1.build(), Occur.MUST);
bq2.add(q3, Occur.MUST); bq2.add(q3, Occur.MUST);
BooleanQuery bq3 = new BooleanQuery(); BooleanQuery.Builder bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST);
BooleanQuery bq4 = new BooleanQuery(); BooleanQuery.Builder bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.MUST); bq4.add(bq3.build(), Occur.MUST);
bq4.add(q3, Occur.MUST); bq4.add(q3, Occur.MUST);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
} }
public void testDisjunction() throws Exception { public void testDisjunction() throws Exception {
@ -75,15 +75,15 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q1 = new TermQuery(t1); TermQuery q1 = new TermQuery(t1);
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.SHOULD); bq1.add(q1, Occur.SHOULD);
bq1.add(q2, Occur.SHOULD); bq1.add(q2, Occur.SHOULD);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new RandomApproximationQuery(q1, random()), Occur.SHOULD); bq2.add(new RandomApproximationQuery(q1, random()), Occur.SHOULD);
bq2.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD); bq2.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD);
assertSameScores(bq1, bq2); assertSameScores(bq1.build(), bq2.build());
} }
public void testNestedDisjunction() throws Exception { public void testNestedDisjunction() throws Exception {
@ -94,23 +94,23 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
TermQuery q3 = new TermQuery(t3); TermQuery q3 = new TermQuery(t3);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.SHOULD); bq1.add(q1, Occur.SHOULD);
bq1.add(q2, Occur.SHOULD); bq1.add(q2, Occur.SHOULD);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(bq1, Occur.SHOULD); bq2.add(bq1.build(), Occur.SHOULD);
bq2.add(q3, Occur.SHOULD); bq2.add(q3, Occur.SHOULD);
BooleanQuery bq3 = new BooleanQuery(); BooleanQuery.Builder bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.SHOULD); bq3.add(new RandomApproximationQuery(q1, random()), Occur.SHOULD);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD); bq3.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD);
BooleanQuery bq4 = new BooleanQuery(); BooleanQuery.Builder bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.SHOULD); bq4.add(bq3.build(), Occur.SHOULD);
bq4.add(q3, Occur.SHOULD); bq4.add(q3, Occur.SHOULD);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
} }
public void testDisjunctionInConjunction() throws Exception { public void testDisjunctionInConjunction() throws Exception {
@ -121,23 +121,23 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
TermQuery q3 = new TermQuery(t3); TermQuery q3 = new TermQuery(t3);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.SHOULD); bq1.add(q1, Occur.SHOULD);
bq1.add(q2, Occur.SHOULD); bq1.add(q2, Occur.SHOULD);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(bq1, Occur.MUST); bq2.add(bq1.build(), Occur.MUST);
bq2.add(q3, Occur.MUST); bq2.add(q3, Occur.MUST);
BooleanQuery bq3 = new BooleanQuery(); BooleanQuery.Builder bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.SHOULD); bq3.add(new RandomApproximationQuery(q1, random()), Occur.SHOULD);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD); bq3.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD);
BooleanQuery bq4 = new BooleanQuery(); BooleanQuery.Builder bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.MUST); bq4.add(bq3.build(), Occur.MUST);
bq4.add(q3, Occur.MUST); bq4.add(q3, Occur.MUST);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
} }
public void testConjunctionInDisjunction() throws Exception { public void testConjunctionInDisjunction() throws Exception {
@ -148,23 +148,23 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
TermQuery q3 = new TermQuery(t3); TermQuery q3 = new TermQuery(t3);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.MUST); bq1.add(q1, Occur.MUST);
bq1.add(q2, Occur.MUST); bq1.add(q2, Occur.MUST);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(bq1, Occur.SHOULD); bq2.add(bq1.build(), Occur.SHOULD);
bq2.add(q3, Occur.SHOULD); bq2.add(q3, Occur.SHOULD);
BooleanQuery bq3 = new BooleanQuery(); BooleanQuery.Builder bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST);
BooleanQuery bq4 = new BooleanQuery(); BooleanQuery.Builder bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.SHOULD); bq4.add(bq3.build(), Occur.SHOULD);
bq4.add(q3, Occur.SHOULD); bq4.add(q3, Occur.SHOULD);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
} }
public void testConstantScore() throws Exception { public void testConstantScore() throws Exception {
@ -173,15 +173,15 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q1 = new TermQuery(t1); TermQuery q1 = new TermQuery(t1);
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(new ConstantScoreQuery(q1), Occur.MUST); bq1.add(new ConstantScoreQuery(q1), Occur.MUST);
bq1.add(new ConstantScoreQuery(q2), Occur.MUST); bq1.add(new ConstantScoreQuery(q2), Occur.MUST);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new ConstantScoreQuery(new RandomApproximationQuery(q1, random())), Occur.MUST); bq2.add(new ConstantScoreQuery(new RandomApproximationQuery(q1, random())), Occur.MUST);
bq2.add(new ConstantScoreQuery(new RandomApproximationQuery(q2, random())), Occur.MUST); bq2.add(new ConstantScoreQuery(new RandomApproximationQuery(q2, random())), Occur.MUST);
assertSameScores(bq1, bq2); assertSameScores(bq1.build(), bq2.build());
} }
public void testExclusion() throws Exception { public void testExclusion() throws Exception {
@ -190,15 +190,15 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q1 = new TermQuery(t1); TermQuery q1 = new TermQuery(t1);
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.MUST); bq1.add(q1, Occur.MUST);
bq1.add(q2, Occur.MUST_NOT); bq1.add(q2, Occur.MUST_NOT);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq2.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq2.add(new RandomApproximationQuery(q2, random()), Occur.MUST_NOT); bq2.add(new RandomApproximationQuery(q2, random()), Occur.MUST_NOT);
assertSameScores(bq1, bq2); assertSameScores(bq1.build(), bq2.build());
} }
public void testNestedExclusion() throws Exception { public void testNestedExclusion() throws Exception {
@ -209,46 +209,46 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
TermQuery q3 = new TermQuery(t3); TermQuery q3 = new TermQuery(t3);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.MUST); bq1.add(q1, Occur.MUST);
bq1.add(q2, Occur.MUST_NOT); bq1.add(q2, Occur.MUST_NOT);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(bq1, Occur.MUST); bq2.add(bq1.build(), Occur.MUST);
bq2.add(q3, Occur.MUST); bq2.add(q3, Occur.MUST);
// Both req and excl have approximations // Both req and excl have approximations
BooleanQuery bq3 = new BooleanQuery(); BooleanQuery.Builder bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST_NOT); bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST_NOT);
BooleanQuery bq4 = new BooleanQuery(); BooleanQuery.Builder bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.MUST); bq4.add(bq3.build(), Occur.MUST);
bq4.add(q3, Occur.MUST); bq4.add(q3, Occur.MUST);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
// Only req has an approximation // Only req has an approximation
bq3 = new BooleanQuery(); bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq3.add(q2, Occur.MUST_NOT); bq3.add(q2, Occur.MUST_NOT);
bq4 = new BooleanQuery(); bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.MUST); bq4.add(bq3.build(), Occur.MUST);
bq4.add(q3, Occur.MUST); bq4.add(q3, Occur.MUST);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
// Only excl has an approximation // Only excl has an approximation
bq3 = new BooleanQuery(); bq3 = new BooleanQuery.Builder();
bq3.add(q1, Occur.MUST); bq3.add(q1, Occur.MUST);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST_NOT); bq3.add(new RandomApproximationQuery(q2, random()), Occur.MUST_NOT);
bq4 = new BooleanQuery(); bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.MUST); bq4.add(bq3.build(), Occur.MUST);
bq4.add(q3, Occur.MUST); bq4.add(q3, Occur.MUST);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
} }
public void testReqOpt() throws Exception { public void testReqOpt() throws Exception {
@ -259,23 +259,23 @@ public class TestApproximationSearchEquivalence extends SearchEquivalenceTestBas
TermQuery q2 = new TermQuery(t2); TermQuery q2 = new TermQuery(t2);
TermQuery q3 = new TermQuery(t3); TermQuery q3 = new TermQuery(t3);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(q1, Occur.MUST); bq1.add(q1, Occur.MUST);
bq1.add(q2, Occur.SHOULD); bq1.add(q2, Occur.SHOULD);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(bq1, Occur.MUST); bq2.add(bq1.build(), Occur.MUST);
bq2.add(q3, Occur.MUST); bq2.add(q3, Occur.MUST);
BooleanQuery bq3 = new BooleanQuery(); BooleanQuery.Builder bq3 = new BooleanQuery.Builder();
bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST); bq3.add(new RandomApproximationQuery(q1, random()), Occur.MUST);
bq3.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD); bq3.add(new RandomApproximationQuery(q2, random()), Occur.SHOULD);
BooleanQuery bq4 = new BooleanQuery(); BooleanQuery.Builder bq4 = new BooleanQuery.Builder();
bq4.add(bq3, Occur.MUST); bq4.add(bq3.build(), Occur.MUST);
bq4.add(q3, Occur.MUST); bq4.add(q3, Occur.MUST);
assertSameScores(bq2, bq4); assertSameScores(bq2.build(), bq4.build());
} }
} }

View File

@ -31,7 +31,6 @@ import org.apache.lucene.search.similarities.DefaultSimilarity;
import org.apache.lucene.search.similarities.Similarity; import org.apache.lucene.search.similarities.Similarity;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.store.MockDirectoryWrapper; import org.apache.lucene.store.MockDirectoryWrapper;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.TestUtil; import org.apache.lucene.util.TestUtil;
import org.junit.AfterClass; import org.junit.AfterClass;
@ -148,93 +147,93 @@ public class TestBoolean2 extends LuceneTestCase {
@Test @Test
public void testQueries01() throws Exception { public void testQueries01() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST);
int[] expDocNrs = {2,3}; int[] expDocNrs = {2,3};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries02() throws Exception { public void testQueries02() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.SHOULD);
int[] expDocNrs = {2,3,1,0}; int[] expDocNrs = {2,3,1,0};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries03() throws Exception { public void testQueries03() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.SHOULD);
int[] expDocNrs = {2,3,1,0}; int[] expDocNrs = {2,3,1,0};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries04() throws Exception { public void testQueries04() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT);
int[] expDocNrs = {1,0}; int[] expDocNrs = {1,0};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries05() throws Exception { public void testQueries05() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT);
int[] expDocNrs = {1,0}; int[] expDocNrs = {1,0};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries06() throws Exception { public void testQueries06() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT);
query.add(new TermQuery(new Term(field, "w5")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "w5")), BooleanClause.Occur.MUST_NOT);
int[] expDocNrs = {1}; int[] expDocNrs = {1};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries07() throws Exception { public void testQueries07() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST_NOT);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST_NOT);
query.add(new TermQuery(new Term(field, "w5")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "w5")), BooleanClause.Occur.MUST_NOT);
int[] expDocNrs = {}; int[] expDocNrs = {};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries08() throws Exception { public void testQueries08() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(field, "w5")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(field, "w5")), BooleanClause.Occur.MUST_NOT);
int[] expDocNrs = {2,3,1}; int[] expDocNrs = {2,3,1};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries09() throws Exception { public void testQueries09() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "w2")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w2")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "zz")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(field, "zz")), BooleanClause.Occur.SHOULD);
int[] expDocNrs = {2, 3}; int[] expDocNrs = {2, 3};
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} }
@Test @Test
public void testQueries10() throws Exception { public void testQueries10() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w3")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "xx")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(field, "w2")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(field, "w2")), BooleanClause.Occur.MUST);
@ -249,7 +248,7 @@ public class TestBoolean2 extends LuceneTestCase {
return overlap / ((float)maxOverlap - 1); return overlap / ((float)maxOverlap - 1);
} }
}); });
queriesTest(query, expDocNrs); queriesTest(query.build(), expDocNrs);
} finally { } finally {
searcher.setSimilarity(oldSimilarity); searcher.setSimilarity(oldSimilarity);
} }
@ -268,7 +267,7 @@ public class TestBoolean2 extends LuceneTestCase {
int num = atLeast(20); int num = atLeast(20);
for (int i=0; i<num; i++) { for (int i=0; i<num; i++) {
int level = random().nextInt(3); int level = random().nextInt(3);
q1 = randBoolQuery(new Random(random().nextLong()), random().nextBoolean(), level, field, vals, null); q1 = randBoolQuery(new Random(random().nextLong()), random().nextBoolean(), level, field, vals, null).build();
// Can't sort by relevance since floating point numbers may not quite // Can't sort by relevance since floating point numbers may not quite
// match up. // match up.
@ -297,10 +296,10 @@ public class TestBoolean2 extends LuceneTestCase {
tot+=hits2.length; tot+=hits2.length;
CheckHits.checkEqual(q1, hits1, hits2); CheckHits.checkEqual(q1, hits1, hits2);
BooleanQuery q3 = new BooleanQuery(); BooleanQuery.Builder q3 = new BooleanQuery.Builder();
q3.add(q1, BooleanClause.Occur.SHOULD); q3.add(q1, BooleanClause.Occur.SHOULD);
q3.add(new PrefixQuery(new Term("field2", "b")), BooleanClause.Occur.SHOULD); q3.add(new PrefixQuery(new Term("field2", "b")), BooleanClause.Occur.SHOULD);
TopDocs hits4 = bigSearcher.search(q3, 1); TopDocs hits4 = bigSearcher.search(q3.build(), 1);
assertEquals(mulFactor*collector.totalHits + NUM_EXTRA_DOCS/2, hits4.totalHits); assertEquals(mulFactor*collector.totalHits + NUM_EXTRA_DOCS/2, hits4.totalHits);
} }
@ -317,13 +316,14 @@ public class TestBoolean2 extends LuceneTestCase {
// used to set properties or change every BooleanQuery // used to set properties or change every BooleanQuery
// generated from randBoolQuery. // generated from randBoolQuery.
public static interface Callback { public static interface Callback {
public void postCreate(BooleanQuery q); public void postCreate(BooleanQuery.Builder q);
} }
// Random rnd is passed in so that the exact same random query may be created // Random rnd is passed in so that the exact same random query may be created
// more than once. // more than once.
public static BooleanQuery randBoolQuery(Random rnd, boolean allowMust, int level, String field, String[] vals, Callback cb) { public static BooleanQuery.Builder randBoolQuery(Random rnd, boolean allowMust, int level, String field, String[] vals, Callback cb) {
BooleanQuery current = new BooleanQuery(rnd.nextInt()<0); BooleanQuery.Builder current = new BooleanQuery.Builder();
current.setDisableCoord(rnd.nextBoolean());
for (int i=0; i<rnd.nextInt(vals.length)+1; i++) { for (int i=0; i<rnd.nextInt(vals.length)+1; i++) {
int qType=0; // term query int qType=0; // term query
if (level>0) { if (level>0) {
@ -339,7 +339,7 @@ public class TestBoolean2 extends LuceneTestCase {
} else if (qType < 7) { } else if (qType < 7) {
q = new WildcardQuery(new Term(field, "w*")); q = new WildcardQuery(new Term(field, "w*"));
} else { } else {
q = randBoolQuery(rnd, allowMust, level-1, field, vals, cb); q = randBoolQuery(rnd, allowMust, level-1, field, vals, cb).build();
} }
int r = rnd.nextInt(10); int r = rnd.nextInt(10);

View File

@ -128,579 +128,613 @@ public class TestBooleanCoord extends LuceneTestCase {
// disjunctions // disjunctions
public void testDisjunction1TermMatches() throws Exception { public void testDisjunction1TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/1f, bq); assertScore(1 * 1/1f, bq.build());
} }
public void testDisjunction2TermMatches() throws Exception { public void testDisjunction2TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
assertScore(2 * 1/1f, bq); assertScore(2 * 1/1f, bq.build());
} }
public void testDisjunction1OutOf2() throws Exception { public void testDisjunction1OutOf2() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/2f, bq); assertScore(1 * 1/2f, bq.build());
} }
public void testDisjunction1OutOf2Missing() throws Exception { public void testDisjunction1OutOf2Missing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/2f, bq); assertScore(1 * 1/2f, bq.build());
} }
public void testDisjunction1OutOf3() throws Exception { public void testDisjunction1OutOf3() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testDisjunction1OutOf3MissingOne() throws Exception { public void testDisjunction1OutOf3MissingOne() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testDisjunction1OutOf3MissingTwo() throws Exception { public void testDisjunction1OutOf3MissingTwo() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Y"), BooleanClause.Occur.SHOULD); bq.add(term("Y"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testDisjunction2OutOf3() throws Exception { public void testDisjunction2OutOf3() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testDisjunction2OutOf3Missing() throws Exception { public void testDisjunction2OutOf3Missing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
// disjunctions with coord disabled // disjunctions with coord disabled
public void testDisjunction1TermMatchesCoordDisabled() throws Exception { public void testDisjunction1TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testDisjunction2TermMatchesCoordDisabled() throws Exception { public void testDisjunction2TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testDisjunction1OutOf2CoordDisabled() throws Exception { public void testDisjunction1OutOf2CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testDisjunction1OutOf2MissingCoordDisabled() throws Exception { public void testDisjunction1OutOf2MissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testDisjunction1OutOf3CoordDisabled() throws Exception { public void testDisjunction1OutOf3CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testDisjunction1OutOf3MissingOneCoordDisabled() throws Exception { public void testDisjunction1OutOf3MissingOneCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testDisjunction1OutOf3MissingTwoCoordDisabled() throws Exception { public void testDisjunction1OutOf3MissingTwoCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Y"), BooleanClause.Occur.SHOULD); bq.add(term("Y"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testDisjunction2OutOf3CoordDisabled() throws Exception { public void testDisjunction2OutOf3CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testDisjunction2OutOf3MissingCoordDisabled() throws Exception { public void testDisjunction2OutOf3MissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
// minShouldMatch // minShouldMatch
public void testMinShouldMatch1TermMatches() throws Exception { public void testMinShouldMatch1TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/1f, bq); assertScore(1 * 1/1f, bq.build());
} }
public void testMinShouldMatchn2TermMatches() throws Exception { public void testMinShouldMatchn2TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
assertScore(2 * 1/1f, bq); assertScore(2 * 1/1f, bq.build());
} }
public void testMinShouldMatch1OutOf2() throws Exception { public void testMinShouldMatch1OutOf2() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/2f, bq); assertScore(1 * 1/2f, bq.build());
} }
public void testMinShouldMatch1OutOf2Missing() throws Exception { public void testMinShouldMatch1OutOf2Missing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/2f, bq); assertScore(1 * 1/2f, bq.build());
} }
public void testMinShouldMatch1OutOf3() throws Exception { public void testMinShouldMatch1OutOf3() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testMinShouldMatch1OutOf3MissingOne() throws Exception { public void testMinShouldMatch1OutOf3MissingOne() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testMinShouldMatch1OutOf3MissingTwo() throws Exception { public void testMinShouldMatch1OutOf3MissingTwo() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Y"), BooleanClause.Occur.SHOULD); bq.add(term("Y"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testMinShouldMatch2OutOf3() throws Exception { public void testMinShouldMatch2OutOf3() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testMinShouldMatch2OutOf3Missing() throws Exception { public void testMinShouldMatch2OutOf3Missing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testMinShouldMatch2OutOf4() throws Exception { public void testMinShouldMatch2OutOf4() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/4f, bq); assertScore(2 * 2/4f, bq.build());
} }
public void testMinShouldMatch2OutOf4Missing() throws Exception { public void testMinShouldMatch2OutOf4Missing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/4f, bq); assertScore(2 * 2/4f, bq.build());
} }
// minShouldMatch with coord disabled // minShouldMatch with coord disabled
public void testMinShouldMatch1TermMatchesCoordDisabled() throws Exception { public void testMinShouldMatch1TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMinShouldMatch2TermMatchesCoordDisabled() throws Exception { public void testMinShouldMatch2TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMinShouldMatch1OutOf2CoordDisabled() throws Exception { public void testMinShouldMatch1OutOf2CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMinShouldMatch1OutOf2MissingCoordDisabled() throws Exception { public void testMinShouldMatch1OutOf2MissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMinShouldMatch1OutOf3CoordDisabled() throws Exception { public void testMinShouldMatch1OutOf3CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMinShouldMatch1OutOf3MissingOneCoordDisabled() throws Exception { public void testMinShouldMatch1OutOf3MissingOneCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMinShouldMatch1OutOf3MissingTwoCoordDisabled() throws Exception { public void testMinShouldMatch1OutOf3MissingTwoCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("Y"), BooleanClause.Occur.SHOULD); bq.add(term("Y"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMinShouldMatch2OutOf3CoordDisabled() throws Exception { public void testMinShouldMatch2OutOf3CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMinShouldMatch2OutOf3MissingCoordDisabled() throws Exception { public void testMinShouldMatch2OutOf3MissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMinShouldMatch2OutOf4CoordDisabled() throws Exception { public void testMinShouldMatch2OutOf4CoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMinShouldMatch2OutOf4MissingCoordDisabled() throws Exception { public void testMinShouldMatch2OutOf4MissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.SHOULD); bq.add(term("A"), BooleanClause.Occur.SHOULD);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
// conjunctions // conjunctions
public void testConjunction1TermMatches() throws Exception { public void testConjunction1TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
assertScore(1 * 1/1f, bq); assertScore(1 * 1/1f, bq.build());
} }
public void testConjunction1TermMatches1Prohib() throws Exception { public void testConjunction1TermMatches1Prohib() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.MUST_NOT); bq.add(term("1"), BooleanClause.Occur.MUST_NOT);
assertScore(1 * 1/1f, bq); assertScore(1 * 1/1f, bq.build());
} }
public void testConjunction1TermMatches2Prohib() throws Exception { public void testConjunction1TermMatches2Prohib() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.MUST_NOT); bq.add(term("1"), BooleanClause.Occur.MUST_NOT);
bq.add(term("2"), BooleanClause.Occur.MUST_NOT); bq.add(term("2"), BooleanClause.Occur.MUST_NOT);
assertScore(1 * 1/1f, bq); assertScore(1 * 1/1f, bq.build());
} }
public void testConjunction2TermMatches() throws Exception { public void testConjunction2TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.MUST); bq.add(term("B"), BooleanClause.Occur.MUST);
assertScore(2 * 1/1f, bq); assertScore(2 * 1/1f, bq.build());
} }
// conjunctions coord disabled // conjunctions coord disabled
public void testConjunction1TermMatchesCoordDisabled() throws Exception { public void testConjunction1TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testConjunction1TermMatches1ProhibCoordDisabled() throws Exception { public void testConjunction1TermMatches1ProhibCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.MUST_NOT); bq.add(term("1"), BooleanClause.Occur.MUST_NOT);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testConjunction1TermMatches2ProhibCoordDisabled() throws Exception { public void testConjunction1TermMatches2ProhibCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.MUST_NOT); bq.add(term("1"), BooleanClause.Occur.MUST_NOT);
bq.add(term("2"), BooleanClause.Occur.MUST_NOT); bq.add(term("2"), BooleanClause.Occur.MUST_NOT);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testConjunction2TermMatchesCoordDisabled() throws Exception { public void testConjunction2TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.MUST); bq.add(term("B"), BooleanClause.Occur.MUST);
assertScore(2, bq); assertScore(2, bq.build());
} }
// optional + mandatory mix // optional + mandatory mix
public void testMix2TermMatches() throws Exception { public void testMix2TermMatches() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/2f, bq); assertScore(2 * 2/2f, bq.build());
} }
public void testMixMatch1OutOfTwo() throws Exception { public void testMixMatch1OutOfTwo() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/2f, bq); assertScore(1 * 1/2f, bq.build());
} }
public void testMixMatch1OutOfTwoMissing() throws Exception { public void testMixMatch1OutOfTwoMissing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/2f, bq); assertScore(1 * 1/2f, bq.build());
} }
public void testMixMatch1OutOfThree() throws Exception { public void testMixMatch1OutOfThree() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testMixMatch1OutOfThreeOneMissing() throws Exception { public void testMixMatch1OutOfThreeOneMissing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testMixMatch2OutOfThree() throws Exception { public void testMixMatch2OutOfThree() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testMixMatch2OutOfThreeMissing() throws Exception { public void testMixMatch2OutOfThreeMissing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testMix2TermMatchesCoordDisabled() throws Exception { public void testMix2TermMatchesCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMixMatch1OutOfTwoCoordDisabled() throws Exception { public void testMixMatch1OutOfTwoCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMixMatch1OutOfTwoMissingCoordDisabled() throws Exception { public void testMixMatch1OutOfTwoMissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMixMatch1OutOfThreeCoordDisabled() throws Exception { public void testMixMatch1OutOfThreeCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("2"), BooleanClause.Occur.SHOULD); bq.add(term("2"), BooleanClause.Occur.SHOULD);
assertScore(1, bq); assertScore(1, bq.build());
} }
public void testMixMatch1OutOfThreeOneMissingCoordDisabled() throws Exception { public void testMixMatch1OutOfThreeOneMissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(1 * 1/3f, bq); assertScore(1 * 1/3f, bq.build());
} }
public void testMixMatch2OutOfThreeCoordDisabled() throws Exception { public void testMixMatch2OutOfThreeCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMixMatch2OutOfThreeMissingCoordDisabled() throws Exception { public void testMixMatch2OutOfThreeMissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
// min should match + mandatory mix // min should match + mandatory mix
public void testMixMinShouldMatch2OutOfThree() throws Exception { public void testMixMinShouldMatch2OutOfThree() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testMixMinShouldMatch2OutOfThreeMissing() throws Exception { public void testMixMinShouldMatch2OutOfThreeMissing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2 * 2/3f, bq); assertScore(2 * 2/3f, bq.build());
} }
public void testMixMinShouldMatch3OutOfFour() throws Exception { public void testMixMinShouldMatch3OutOfFour() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("C"), BooleanClause.Occur.SHOULD); bq.add(term("C"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(3 * 3/4f, bq); assertScore(3 * 3/4f, bq.build());
} }
public void testMixMinShouldMatch3OutOfFourMissing() throws Exception { public void testMixMinShouldMatch3OutOfFourMissing() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("C"), BooleanClause.Occur.SHOULD); bq.add(term("C"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(3 * 3/4f, bq); assertScore(3 * 3/4f, bq.build());
} }
public void testMixMinShouldMatch2OutOfThreeCoordDisabled() throws Exception { public void testMixMinShouldMatch2OutOfThreeCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMixMinShouldMatch2OutOfThreeMissingCoordDisabled() throws Exception { public void testMixMinShouldMatch2OutOfThreeMissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(2, bq); assertScore(2, bq.build());
} }
public void testMixMinShouldMatch3OutOfFourCoordDisabled() throws Exception { public void testMixMinShouldMatch3OutOfFourCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("C"), BooleanClause.Occur.SHOULD); bq.add(term("C"), BooleanClause.Occur.SHOULD);
bq.add(term("1"), BooleanClause.Occur.SHOULD); bq.add(term("1"), BooleanClause.Occur.SHOULD);
assertScore(3, bq); assertScore(3, bq.build());
} }
public void testMixMinShouldMatch3OutOfFourMissingCoordDisabled() throws Exception { public void testMixMinShouldMatch3OutOfFourMissingCoordDisabled() throws Exception {
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq =new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
bq.add(term("A"), BooleanClause.Occur.MUST); bq.add(term("A"), BooleanClause.Occur.MUST);
bq.add(term("B"), BooleanClause.Occur.SHOULD); bq.add(term("B"), BooleanClause.Occur.SHOULD);
bq.add(term("C"), BooleanClause.Occur.SHOULD); bq.add(term("C"), BooleanClause.Occur.SHOULD);
bq.add(term("Z"), BooleanClause.Occur.SHOULD); bq.add(term("Z"), BooleanClause.Occur.SHOULD);
assertScore(3, bq); assertScore(3, bq.build());
} }
/** asserts score for our single matching good doc */ /** asserts score for our single matching good doc */

View File

@ -107,18 +107,18 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
public void testAllOptional() throws Exception { public void testAllOptional() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
for (int i = 1; i <=4; i++) { for (int i = 1; i <=4; i++) {
q.add(new TermQuery(new Term("data",""+i)), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data",""+i)), BooleanClause.Occur.SHOULD);//false, false);
} }
q.setMinimumNumberShouldMatch(2); // match at least two of 4 q.setMinimumNumberShouldMatch(2); // match at least two of 4
verifyNrHits(q, 2); verifyNrHits(q.build(), 2);
} }
public void testOneReqAndSomeOptional() throws Exception { public void testOneReqAndSomeOptional() throws Exception {
/* one required, some optional */ /* one required, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "4" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "4" )), BooleanClause.Occur.SHOULD);//false, false);
@ -126,13 +126,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(2); // 2 of 3 optional q.setMinimumNumberShouldMatch(2); // 2 of 3 optional
verifyNrHits(q, 5); verifyNrHits(q.build(), 5);
} }
public void testSomeReqAndSomeOptional() throws Exception { public void testSomeReqAndSomeOptional() throws Exception {
/* two required, some optional */ /* two required, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
@ -141,13 +141,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(2); // 2 of 3 optional q.setMinimumNumberShouldMatch(2); // 2 of 3 optional
verifyNrHits(q, 5); verifyNrHits(q.build(), 5);
} }
public void testOneProhibAndSomeOptional() throws Exception { public void testOneProhibAndSomeOptional() throws Exception {
/* one prohibited, some optional */ /* one prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("data", "1" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "1" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.MUST_NOT);//false, true ); q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.MUST_NOT);//false, true );
@ -155,13 +155,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(2); // 2 of 3 optional q.setMinimumNumberShouldMatch(2); // 2 of 3 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testSomeProhibAndSomeOptional() throws Exception { public void testSomeProhibAndSomeOptional() throws Exception {
/* two prohibited, some optional */ /* two prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("data", "1" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "1" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.MUST_NOT);//false, true ); q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.MUST_NOT);//false, true );
@ -170,13 +170,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(2); // 2 of 3 optional q.setMinimumNumberShouldMatch(2); // 2 of 3 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testOneReqOneProhibAndSomeOptional() throws Exception { public void testOneReqOneProhibAndSomeOptional() throws Exception {
/* one required, one prohibited, some optional */ /* one required, one prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);// true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);// true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "4" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "4" )), BooleanClause.Occur.SHOULD);//false, false);
@ -186,13 +186,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(3); // 3 of 4 optional q.setMinimumNumberShouldMatch(3); // 3 of 4 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testSomeReqOneProhibAndSomeOptional() throws Exception { public void testSomeReqOneProhibAndSomeOptional() throws Exception {
/* two required, one prohibited, some optional */ /* two required, one prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all")), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all")), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
@ -203,13 +203,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(3); // 3 of 4 optional q.setMinimumNumberShouldMatch(3); // 3 of 4 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testOneReqSomeProhibAndSomeOptional() throws Exception { public void testOneReqSomeProhibAndSomeOptional() throws Exception {
/* one required, two prohibited, some optional */ /* one required, two prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "4" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "4" )), BooleanClause.Occur.SHOULD);//false, false);
@ -220,13 +220,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(3); // 3 of 4 optional q.setMinimumNumberShouldMatch(3); // 3 of 4 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testSomeReqSomeProhibAndSomeOptional() throws Exception { public void testSomeReqSomeProhibAndSomeOptional() throws Exception {
/* two required, two prohibited, some optional */ /* two required, two prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all")), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all")), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
@ -238,13 +238,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(3); // 3 of 4 optional q.setMinimumNumberShouldMatch(3); // 3 of 4 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testMinHigherThenNumOptional() throws Exception { public void testMinHigherThenNumOptional() throws Exception {
/* two required, two prohibited, some optional */ /* two required, two prohibited, some optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all")), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all")), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "5" )), BooleanClause.Occur.SHOULD);//false, false);
@ -256,13 +256,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(90); // 90 of 4 optional ?!?!?! q.setMinimumNumberShouldMatch(90); // 90 of 4 optional ?!?!?!
verifyNrHits(q, 0); verifyNrHits(q.build(), 0);
} }
public void testMinEqualToNumOptional() throws Exception { public void testMinEqualToNumOptional() throws Exception {
/* two required, two optional */ /* two required, two optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "6" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.MUST);//true, false);
@ -270,43 +270,43 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
q.setMinimumNumberShouldMatch(2); // 2 of 2 optional q.setMinimumNumberShouldMatch(2); // 2 of 2 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testOneOptionalEqualToMin() throws Exception { public void testOneOptionalEqualToMin() throws Exception {
/* two required, one optional */ /* two required, one optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.SHOULD);//false, false); q.add(new TermQuery(new Term("data", "3" )), BooleanClause.Occur.SHOULD);//false, false);
q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.MUST);//true, false);
q.setMinimumNumberShouldMatch(1); // 1 of 1 optional q.setMinimumNumberShouldMatch(1); // 1 of 1 optional
verifyNrHits(q, 1); verifyNrHits(q.build(), 1);
} }
public void testNoOptionalButMin() throws Exception { public void testNoOptionalButMin() throws Exception {
/* two required, no optional */ /* two required, no optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false);
q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("data", "2" )), BooleanClause.Occur.MUST);//true, false);
q.setMinimumNumberShouldMatch(1); // 1 of 0 optional q.setMinimumNumberShouldMatch(1); // 1 of 0 optional
verifyNrHits(q, 0); verifyNrHits(q.build(), 0);
} }
public void testNoOptionalButMin2() throws Exception { public void testNoOptionalButMin2() throws Exception {
/* one required, no optional */ /* one required, no optional */
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false); q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false);
q.setMinimumNumberShouldMatch(1); // 1 of 0 optional q.setMinimumNumberShouldMatch(1); // 1 of 0 optional
verifyNrHits(q, 0); verifyNrHits(q.build(), 0);
} }
public void testRandomQueries() throws Exception { public void testRandomQueries() throws Exception {
@ -317,11 +317,10 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
// callback object to set a random setMinimumNumberShouldMatch // callback object to set a random setMinimumNumberShouldMatch
TestBoolean2.Callback minNrCB = new TestBoolean2.Callback() { TestBoolean2.Callback minNrCB = new TestBoolean2.Callback() {
@Override @Override
public void postCreate(BooleanQuery q) { public void postCreate(BooleanQuery.Builder q) {
BooleanClause[] c =q.getClauses();
int opt=0; int opt=0;
for (int i=0; i<c.length;i++) { for (BooleanClause clause : q.build().clauses()) {
if (c[i].getOccur() == BooleanClause.Occur.SHOULD) opt++; if (clause.getOccur() == BooleanClause.Occur.SHOULD) opt++;
} }
q.setMinimumNumberShouldMatch(random().nextInt(opt+2)); q.setMinimumNumberShouldMatch(random().nextInt(opt+2));
if (random().nextBoolean()) { if (random().nextBoolean()) {
@ -339,9 +338,9 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
for (int i=0; i<num; i++) { for (int i=0; i<num; i++) {
int lev = random().nextInt(maxLev); int lev = random().nextInt(maxLev);
final long seed = random().nextLong(); final long seed = random().nextLong();
BooleanQuery q1 = TestBoolean2.randBoolQuery(new Random(seed), true, lev, field, vals, null); BooleanQuery.Builder q1 = TestBoolean2.randBoolQuery(new Random(seed), true, lev, field, vals, null);
// BooleanQuery q2 = TestBoolean2.randBoolQuery(new Random(seed), lev, field, vals, minNrCB); // BooleanQuery q2 = TestBoolean2.randBoolQuery(new Random(seed), lev, field, vals, minNrCB);
BooleanQuery q2 = TestBoolean2.randBoolQuery(new Random(seed), true, lev, field, vals, null); BooleanQuery.Builder q2 = TestBoolean2.randBoolQuery(new Random(seed), true, lev, field, vals, null);
// only set minimumNumberShouldMatch on the top level query since setting // only set minimumNumberShouldMatch on the top level query since setting
// at a lower level can change the score. // at a lower level can change the score.
minNrCB.postCreate(q2); minNrCB.postCreate(q2);
@ -349,13 +348,13 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
// Can't use Hits because normalized scores will mess things // Can't use Hits because normalized scores will mess things
// up. The non-sorting version of search() that returns TopDocs // up. The non-sorting version of search() that returns TopDocs
// will not normalize scores. // will not normalize scores.
TopDocs top1 = s.search(q1,100); TopDocs top1 = s.search(q1.build(),100);
TopDocs top2 = s.search(q2,100); TopDocs top2 = s.search(q2.build(),100);
if (i < 100) { if (i < 100) {
QueryUtils.check(random(), q1,s); QueryUtils.check(random(), q1.build(),s);
QueryUtils.check(random(), q2,s); QueryUtils.check(random(), q2.build(),s);
} }
assertSubsetOfSameScores(q2, top1, top2); assertSubsetOfSameScores(q2.build(), top1, top2);
} }
// System.out.println("Total hits:"+tot); // System.out.println("Total hits:"+tot);
} }
@ -405,14 +404,14 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
return overlap / ((float)maxOverlap + 1); return overlap / ((float)maxOverlap + 1);
} }
}); });
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD); q1.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD);
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD); q2.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD);
q2.setMinimumNumberShouldMatch(1); q2.setMinimumNumberShouldMatch(1);
TopDocs top1 = s.search(q1,100); TopDocs top1 = s.search(q1.build(),100);
TopDocs top2 = s.search(q2,100); TopDocs top2 = s.search(q2.build(),100);
assertSubsetOfSameScores(q2, top1, top2); assertSubsetOfSameScores(q2.build(), top1, top2);
} finally { } finally {
s.setSimilarity(oldSimilarity); s.setSimilarity(oldSimilarity);
} }
@ -427,14 +426,14 @@ public class TestBooleanMinShouldMatch extends LuceneTestCase {
return overlap / ((float)maxOverlap + 1); return overlap / ((float)maxOverlap + 1);
} }
}); });
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD); q1.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD);
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD); q2.add(new TermQuery(new Term("data", "1")), BooleanClause.Occur.SHOULD);
q2.add(new TermQuery(new Term("data", "Z")), BooleanClause.Occur.MUST_NOT); q2.add(new TermQuery(new Term("data", "Z")), BooleanClause.Occur.MUST_NOT);
TopDocs top1 = s.search(q1,100); TopDocs top1 = s.search(q1.build(),100);
TopDocs top2 = s.search(q2,100); TopDocs top2 = s.search(q2.build(),100);
assertSubsetOfSameScores(q2, top1, top2); assertSubsetOfSameScores(q2.build(), top1, top2);
} finally { } finally {
s.setSimilarity(oldSimilarity); s.setSimilarity(oldSimilarity);
} }

View File

@ -23,10 +23,10 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import com.carrotsearch.randomizedtesting.generators.RandomInts; import com.carrotsearch.randomizedtesting.generators.RandomInts;
import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document; import org.apache.lucene.document.Document;
import org.apache.lucene.document.TextField; import org.apache.lucene.document.TextField;
import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
@ -67,12 +67,12 @@ public class TestBooleanOr extends LuceneTestCase {
* it works. * it works.
*/ */
public void testFlat() throws IOException { public void testFlat() throws IOException {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD)); q.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD));
q.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD)); q.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD));
q.add(new BooleanClause(c1, BooleanClause.Occur.SHOULD)); q.add(new BooleanClause(c1, BooleanClause.Occur.SHOULD));
q.add(new BooleanClause(c2, BooleanClause.Occur.SHOULD)); q.add(new BooleanClause(c2, BooleanClause.Occur.SHOULD));
assertEquals(1, search(q)); assertEquals(1, search(q.build()));
} }
/** /**
@ -80,16 +80,16 @@ public class TestBooleanOr extends LuceneTestCase {
* it works. * it works.
*/ */
public void testParenthesisMust() throws IOException { public void testParenthesisMust() throws IOException {
BooleanQuery q3 = new BooleanQuery(); BooleanQuery.Builder q3 = new BooleanQuery.Builder();
q3.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD)); q3.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD));
q3.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD)); q3.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD));
BooleanQuery q4 = new BooleanQuery(); BooleanQuery.Builder q4 = new BooleanQuery.Builder();
q4.add(new BooleanClause(c1, BooleanClause.Occur.MUST)); q4.add(new BooleanClause(c1, BooleanClause.Occur.MUST));
q4.add(new BooleanClause(c2, BooleanClause.Occur.MUST)); q4.add(new BooleanClause(c2, BooleanClause.Occur.MUST));
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(q3, BooleanClause.Occur.SHOULD); q2.add(q3.build(), BooleanClause.Occur.SHOULD);
q2.add(q4, BooleanClause.Occur.SHOULD); q2.add(q4.build(), BooleanClause.Occur.SHOULD);
assertEquals(1, search(q2)); assertEquals(1, search(q2.build()));
} }
/** /**
@ -97,16 +97,16 @@ public class TestBooleanOr extends LuceneTestCase {
* not working. results NO HIT. * not working. results NO HIT.
*/ */
public void testParenthesisMust2() throws IOException { public void testParenthesisMust2() throws IOException {
BooleanQuery q3 = new BooleanQuery(); BooleanQuery.Builder q3 = new BooleanQuery.Builder();
q3.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD)); q3.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD));
q3.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD)); q3.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD));
BooleanQuery q4 = new BooleanQuery(); BooleanQuery.Builder q4 = new BooleanQuery.Builder();
q4.add(new BooleanClause(c1, BooleanClause.Occur.SHOULD)); q4.add(new BooleanClause(c1, BooleanClause.Occur.SHOULD));
q4.add(new BooleanClause(c2, BooleanClause.Occur.SHOULD)); q4.add(new BooleanClause(c2, BooleanClause.Occur.SHOULD));
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(q3, BooleanClause.Occur.SHOULD); q2.add(q3.build(), BooleanClause.Occur.SHOULD);
q2.add(q4, BooleanClause.Occur.MUST); q2.add(q4.build(), BooleanClause.Occur.MUST);
assertEquals(1, search(q2)); assertEquals(1, search(q2.build()));
} }
/** /**
@ -114,16 +114,16 @@ public class TestBooleanOr extends LuceneTestCase {
* not working. results NO HIT. * not working. results NO HIT.
*/ */
public void testParenthesisShould() throws IOException { public void testParenthesisShould() throws IOException {
BooleanQuery q3 = new BooleanQuery(); BooleanQuery.Builder q3 = new BooleanQuery.Builder();
q3.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD)); q3.add(new BooleanClause(t1, BooleanClause.Occur.SHOULD));
q3.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD)); q3.add(new BooleanClause(t2, BooleanClause.Occur.SHOULD));
BooleanQuery q4 = new BooleanQuery(); BooleanQuery.Builder q4 = new BooleanQuery.Builder();
q4.add(new BooleanClause(c1, BooleanClause.Occur.SHOULD)); q4.add(new BooleanClause(c1, BooleanClause.Occur.SHOULD));
q4.add(new BooleanClause(c2, BooleanClause.Occur.SHOULD)); q4.add(new BooleanClause(c2, BooleanClause.Occur.SHOULD));
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(q3, BooleanClause.Occur.SHOULD); q2.add(q3.build(), BooleanClause.Occur.SHOULD);
q2.add(q4, BooleanClause.Occur.SHOULD); q2.add(q4.build(), BooleanClause.Occur.SHOULD);
assertEquals(1, search(q2)); assertEquals(1, search(q2.build()));
} }
@Override @Override
@ -181,11 +181,11 @@ public class TestBooleanOr extends LuceneTestCase {
riw.close(); riw.close();
IndexSearcher s = newSearcher(r); IndexSearcher s = newSearcher(r);
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD);
Weight w = s.createNormalizedWeight(bq, true); Weight w = s.createNormalizedWeight(bq.build(), true);
assertEquals(1, s.getIndexReader().leaves().size()); assertEquals(1, s.getIndexReader().leaves().size());
BulkScorer scorer = w.bulkScorer(s.getIndexReader().leaves().get(0), null); BulkScorer scorer = w.bulkScorer(s.getIndexReader().leaves().get(0), null);

View File

@ -55,23 +55,23 @@ import org.apache.lucene.util.TestUtil;
public class TestBooleanQuery extends LuceneTestCase { public class TestBooleanQuery extends LuceneTestCase {
public void testEquality() throws Exception { public void testEquality() throws Exception {
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD); bq1.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD);
bq1.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD); bq1.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD);
BooleanQuery nested1 = new BooleanQuery(); BooleanQuery.Builder nested1 = new BooleanQuery.Builder();
nested1.add(new TermQuery(new Term("field", "nestedvalue1")), BooleanClause.Occur.SHOULD); nested1.add(new TermQuery(new Term("field", "nestedvalue1")), BooleanClause.Occur.SHOULD);
nested1.add(new TermQuery(new Term("field", "nestedvalue2")), BooleanClause.Occur.SHOULD); nested1.add(new TermQuery(new Term("field", "nestedvalue2")), BooleanClause.Occur.SHOULD);
bq1.add(nested1, BooleanClause.Occur.SHOULD); bq1.add(nested1.build(), BooleanClause.Occur.SHOULD);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD); bq2.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD);
bq2.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD); bq2.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD);
BooleanQuery nested2 = new BooleanQuery(); BooleanQuery.Builder nested2 = new BooleanQuery.Builder();
nested2.add(new TermQuery(new Term("field", "nestedvalue1")), BooleanClause.Occur.SHOULD); nested2.add(new TermQuery(new Term("field", "nestedvalue1")), BooleanClause.Occur.SHOULD);
nested2.add(new TermQuery(new Term("field", "nestedvalue2")), BooleanClause.Occur.SHOULD); nested2.add(new TermQuery(new Term("field", "nestedvalue2")), BooleanClause.Occur.SHOULD);
bq2.add(nested2, BooleanClause.Occur.SHOULD); bq2.add(nested2.build(), BooleanClause.Occur.SHOULD);
assertEquals(bq1, bq2); assertEquals(bq1.build(), bq2.build());
} }
public void testException() { public void testException() {
@ -97,44 +97,47 @@ public class TestBooleanQuery extends LuceneTestCase {
// otherwise scores are different! // otherwise scores are different!
s.setSimilarity(new DefaultSimilarity()); s.setSimilarity(new DefaultSimilarity());
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD);
// LUCENE-2617: make sure that a term not in the index still contributes to the score via coord factor // LUCENE-2617: make sure that a term not in the index still contributes to the score via coord factor
float score = s.search(q, 10).getMaxScore(); float score = s.search(q.build(), 10).getMaxScore();
Query subQuery = new TermQuery(new Term("field", "not_in_index")); Query subQuery = new TermQuery(new Term("field", "not_in_index"));
subQuery.setBoost(0); subQuery.setBoost(0);
q.add(subQuery, BooleanClause.Occur.SHOULD); q.add(subQuery, BooleanClause.Occur.SHOULD);
float score2 = s.search(q, 10).getMaxScore(); float score2 = s.search(q.build(), 10).getMaxScore();
assertEquals(score*.5F, score2, 1e-6); assertEquals(score*.5F, score2, 1e-6);
// LUCENE-2617: make sure that a clause not in the index still contributes to the score via coord factor // LUCENE-2617: make sure that a clause not in the index still contributes to the score via coord factor
BooleanQuery qq = q.clone(); BooleanQuery.Builder qq = new BooleanQuery.Builder();
for (BooleanClause clause : q.build()) {
qq.add(clause);
}
PhraseQuery phrase = new PhraseQuery("field", "not_in_index", "another_not_in_index"); PhraseQuery phrase = new PhraseQuery("field", "not_in_index", "another_not_in_index");
phrase.setBoost(0); phrase.setBoost(0);
qq.add(phrase, BooleanClause.Occur.SHOULD); qq.add(phrase, BooleanClause.Occur.SHOULD);
score2 = s.search(qq, 10).getMaxScore(); score2 = s.search(qq.build(), 10).getMaxScore();
assertEquals(score*(1/3F), score2, 1e-6); assertEquals(score*(1/3F), score2, 1e-6);
// now test BooleanScorer2 // now test BooleanScorer2
subQuery = new TermQuery(new Term("field", "b")); subQuery = new TermQuery(new Term("field", "b"));
subQuery.setBoost(0); subQuery.setBoost(0);
q.add(subQuery, BooleanClause.Occur.MUST); q.add(subQuery, BooleanClause.Occur.MUST);
score2 = s.search(q, 10).getMaxScore(); score2 = s.search(q.build(), 10).getMaxScore();
assertEquals(score*(2/3F), score2, 1e-6); assertEquals(score*(2/3F), score2, 1e-6);
// PhraseQuery w/ no terms added returns a null scorer // PhraseQuery w/ no terms added returns a null scorer
PhraseQuery pq = new PhraseQuery("field", new String[0]); PhraseQuery pq = new PhraseQuery("field", new String[0]);
q.add(pq, BooleanClause.Occur.SHOULD); q.add(pq, BooleanClause.Occur.SHOULD);
assertEquals(1, s.search(q, 10).totalHits); assertEquals(1, s.search(q.build(), 10).totalHits);
// A required clause which returns null scorer should return null scorer to // A required clause which returns null scorer should return null scorer to
// IndexSearcher. // IndexSearcher.
q = new BooleanQuery(); q = new BooleanQuery.Builder();
pq = new PhraseQuery("field", new String[0]); pq = new PhraseQuery("field", new String[0]);
q.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD);
q.add(pq, BooleanClause.Occur.MUST); q.add(pq, BooleanClause.Occur.MUST);
assertEquals(0, s.search(q, 10).totalHits); assertEquals(0, s.search(q.build(), 10).totalHits);
DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(1.0f); DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(1.0f);
dmq.add(new TermQuery(new Term("field", "a"))); dmq.add(new TermQuery(new Term("field", "a")));
@ -163,7 +166,7 @@ public class TestBooleanQuery extends LuceneTestCase {
IndexReader reader2 = iw2.getReader(); IndexReader reader2 = iw2.getReader();
iw2.close(); iw2.close();
BooleanQuery query = new BooleanQuery(); // Query: +foo -ba* BooleanQuery.Builder query = new BooleanQuery.Builder(); // Query: +foo -ba*
query.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST);
WildcardQuery wildcardQuery = new WildcardQuery(new Term("field", "ba*")); WildcardQuery wildcardQuery = new WildcardQuery(new Term("field", "ba*"));
wildcardQuery.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_REWRITE); wildcardQuery.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_REWRITE);
@ -171,13 +174,13 @@ public class TestBooleanQuery extends LuceneTestCase {
MultiReader multireader = new MultiReader(reader1, reader2); MultiReader multireader = new MultiReader(reader1, reader2);
IndexSearcher searcher = newSearcher(multireader); IndexSearcher searcher = newSearcher(multireader);
assertEquals(0, searcher.search(query, 10).totalHits); assertEquals(0, searcher.search(query.build(), 10).totalHits);
final ExecutorService es = Executors.newCachedThreadPool(new NamedThreadFactory("NRT search threads")); final ExecutorService es = Executors.newCachedThreadPool(new NamedThreadFactory("NRT search threads"));
searcher = new IndexSearcher(multireader, es); searcher = new IndexSearcher(multireader, es);
if (VERBOSE) if (VERBOSE)
System.out.println("rewritten form: " + searcher.rewrite(query)); System.out.println("rewritten form: " + searcher.rewrite(query.build()));
assertEquals(0, searcher.search(query, 10).totalHits); assertEquals(0, searcher.search(query.build(), 10).totalHits);
es.shutdown(); es.shutdown();
es.awaitTermination(1, TimeUnit.SECONDS); es.awaitTermination(1, TimeUnit.SECONDS);
@ -232,12 +235,12 @@ public class TestBooleanQuery extends LuceneTestCase {
System.out.println(" terms=" + terms); System.out.println(" terms=" + terms);
} }
final BooleanQuery q = new BooleanQuery(); final BooleanQuery.Builder q = new BooleanQuery.Builder();
for(String term : terms) { for(String term : terms) {
q.add(new BooleanClause(new TermQuery(new Term("field", term)), BooleanClause.Occur.SHOULD)); q.add(new BooleanClause(new TermQuery(new Term("field", term)), BooleanClause.Occur.SHOULD));
} }
Weight weight = s.createNormalizedWeight(q, true); Weight weight = s.createNormalizedWeight(q.build(), true);
Scorer scorer = weight.scorer(s.leafContexts.get(0), null); Scorer scorer = weight.scorer(s.leafContexts.get(0), null);
@ -255,7 +258,7 @@ public class TestBooleanQuery extends LuceneTestCase {
// verify exact match: // verify exact match:
for(int iter2=0;iter2<10;iter2++) { for(int iter2=0;iter2<10;iter2++) {
weight = s.createNormalizedWeight(q, true); weight = s.createNormalizedWeight(q.build(), true);
scorer = weight.scorer(s.leafContexts.get(0), null); scorer = weight.scorer(s.leafContexts.get(0), null);
if (VERBOSE) { if (VERBOSE) {
@ -313,13 +316,13 @@ public class TestBooleanQuery extends LuceneTestCase {
IndexReader indexReader = DirectoryReader.open(directory); IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher searcher = newSearcher(indexReader); IndexSearcher searcher = newSearcher(indexReader);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
SpanQuery sq1 = new SpanTermQuery(new Term(FIELD, "clockwork")); SpanQuery sq1 = new SpanTermQuery(new Term(FIELD, "clockwork"));
SpanQuery sq2 = new SpanTermQuery(new Term(FIELD, "clckwork")); SpanQuery sq2 = new SpanTermQuery(new Term(FIELD, "clckwork"));
query.add(sq1, BooleanClause.Occur.SHOULD); query.add(sq1, BooleanClause.Occur.SHOULD);
query.add(sq2, BooleanClause.Occur.SHOULD); query.add(sq2, BooleanClause.Occur.SHOULD);
TopScoreDocCollector collector = TopScoreDocCollector.create(1000); TopScoreDocCollector collector = TopScoreDocCollector.create(1000);
searcher.search(query, collector); searcher.search(query.build(), collector);
hits = collector.topDocs().scoreDocs.length; hits = collector.topDocs().scoreDocs.length;
for (ScoreDoc scoreDoc : collector.topDocs().scoreDocs){ for (ScoreDoc scoreDoc : collector.topDocs().scoreDocs){
System.out.println(scoreDoc.doc); System.out.println(scoreDoc.doc);
@ -352,10 +355,10 @@ public class TestBooleanQuery extends LuceneTestCase {
actual.setBoost(BOOST); actual.setBoost(BOOST);
} }
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(actual, random().nextBoolean() bq.add(actual, random().nextBoolean()
? BooleanClause.Occur.SHOULD : BooleanClause.Occur.MUST); ? BooleanClause.Occur.SHOULD : BooleanClause.Occur.MUST);
actual = bq; actual = bq.build();
} }
if (needBoost) { if (needBoost) {
actual.setBoost(BOOST); actual.setBoost(BOOST);
@ -376,13 +379,13 @@ public class TestBooleanQuery extends LuceneTestCase {
w.addDocument(doc); w.addDocument(doc);
IndexReader r = DirectoryReader.open(w, true); IndexReader r = DirectoryReader.open(w, true);
IndexSearcher s = newSearcher(r); IndexSearcher s = newSearcher(r);
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "b")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", "b")), BooleanClause.Occur.SHOULD);
// No doc can match: BQ has only 2 clauses and we are asking for minShouldMatch=4 // No doc can match: BQ has only 2 clauses and we are asking for minShouldMatch=4
bq.setMinimumNumberShouldMatch(4); bq.setMinimumNumberShouldMatch(4);
assertEquals(0, s.search(bq, 1).totalHits); assertEquals(0, s.search(bq.build(), 1).totalHits);
r.close(); r.close();
w.close(); w.close();
dir.close(); dir.close();
@ -432,16 +435,16 @@ public class TestBooleanQuery extends LuceneTestCase {
Arrays.asList("d"), Arrays.asList("d"),
Arrays.asList("e"), Arrays.asList("e"),
Arrays.asList())) { Arrays.asList())) {
final BooleanQuery bq1 = new BooleanQuery(); final BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
final BooleanQuery bq2 = new BooleanQuery(); final BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
for (String term : requiredTerms) { for (String term : requiredTerms) {
final Query q = new TermQuery(new Term("field", term)); final Query q = new TermQuery(new Term("field", term));
bq1.add(q, Occur.MUST); bq1.add(q, Occur.MUST);
bq2.add(q, Occur.FILTER); bq2.add(q, Occur.FILTER);
} }
final BitSet matches1 = getMatches(searcher, bq1); final BitSet matches1 = getMatches(searcher, bq1.build());
final BitSet matches2 = getMatches(searcher, bq2); final BitSet matches2 = getMatches(searcher, bq2.build());
assertEquals(matches1, matches2); assertEquals(matches1, matches2);
} }
@ -451,13 +454,14 @@ public class TestBooleanQuery extends LuceneTestCase {
} }
private void assertSameScoresWithoutFilters(IndexSearcher searcher, BooleanQuery bq) throws IOException { private void assertSameScoresWithoutFilters(IndexSearcher searcher, BooleanQuery bq) throws IOException {
final BooleanQuery bq2 = new BooleanQuery(); final BooleanQuery.Builder bq2Builder = new BooleanQuery.Builder();
for (BooleanClause c : bq.getClauses()) { for (BooleanClause c : bq) {
if (c.getOccur() != Occur.FILTER) { if (c.getOccur() != Occur.FILTER) {
bq2.add(c); bq2Builder.add(c);
} }
} }
bq2.setMinimumNumberShouldMatch(bq.getMinimumNumberShouldMatch()); bq2Builder.setMinimumNumberShouldMatch(bq.getMinimumNumberShouldMatch());
BooleanQuery bq2 = bq2Builder.build();
bq2.setBoost(bq.getBoost()); bq2.setBoost(bq.getBoost());
final AtomicBoolean matched = new AtomicBoolean(); final AtomicBoolean matched = new AtomicBoolean();
@ -509,46 +513,54 @@ public class TestBooleanQuery extends LuceneTestCase {
DirectoryReader reader = w.getReader(); DirectoryReader reader = w.getReader();
final IndexSearcher searcher = new IndexSearcher(reader); final IndexSearcher searcher = new IndexSearcher(reader);
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder qBuilder = new BooleanQuery.Builder();
BooleanQuery q = qBuilder.build();
q.setBoost(random().nextFloat()); q.setBoost(random().nextFloat());
q.add(new TermQuery(new Term("field", "a")), Occur.FILTER); qBuilder.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
// With a single clause, we will rewrite to the underlying // With a single clause, we will rewrite to the underlying
// query. Make sure that it returns null scores // query. Make sure that it returns null scores
assertSameScoresWithoutFilters(searcher, q); assertSameScoresWithoutFilters(searcher, qBuilder.build());
// Now with two clauses, we will get a conjunction scorer // Now with two clauses, we will get a conjunction scorer
// Make sure it returns null scores // Make sure it returns null scores
q.add(new TermQuery(new Term("field", "b")), Occur.FILTER); qBuilder.add(new TermQuery(new Term("field", "b")), Occur.FILTER);
q = qBuilder.build();
q.setBoost(random().nextFloat());
assertSameScoresWithoutFilters(searcher, q); assertSameScoresWithoutFilters(searcher, q);
// Now with a scoring clause, we need to make sure that // Now with a scoring clause, we need to make sure that
// the boolean scores are the same as those from the term // the boolean scores are the same as those from the term
// query // query
q.add(new TermQuery(new Term("field", "c")), Occur.SHOULD); qBuilder.add(new TermQuery(new Term("field", "c")), Occur.SHOULD);
q = qBuilder.build();
q.setBoost(random().nextFloat());
assertSameScoresWithoutFilters(searcher, q); assertSameScoresWithoutFilters(searcher, q);
// FILTER and empty SHOULD // FILTER and empty SHOULD
q = new BooleanQuery(); qBuilder = new BooleanQuery.Builder();
qBuilder.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
qBuilder.add(new TermQuery(new Term("field", "e")), Occur.SHOULD);
q = qBuilder.build();
q.setBoost(random().nextFloat()); q.setBoost(random().nextFloat());
q.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
q.add(new TermQuery(new Term("field", "e")), Occur.SHOULD);
assertSameScoresWithoutFilters(searcher, q); assertSameScoresWithoutFilters(searcher, q);
// mix of FILTER and MUST // mix of FILTER and MUST
q = new BooleanQuery(); qBuilder = new BooleanQuery.Builder();
qBuilder.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
qBuilder.add(new TermQuery(new Term("field", "d")), Occur.MUST);
q = qBuilder.build();
q.setBoost(random().nextFloat()); q.setBoost(random().nextFloat());
q.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
q.add(new TermQuery(new Term("field", "d")), Occur.MUST);
assertSameScoresWithoutFilters(searcher, q); assertSameScoresWithoutFilters(searcher, q);
// FILTER + minShouldMatch // FILTER + minShouldMatch
q = new BooleanQuery(); qBuilder = new BooleanQuery.Builder();
qBuilder.add(new TermQuery(new Term("field", "b")), Occur.FILTER);
qBuilder.add(new TermQuery(new Term("field", "a")), Occur.SHOULD);
qBuilder.add(new TermQuery(new Term("field", "d")), Occur.SHOULD);
qBuilder.setMinimumNumberShouldMatch(1);
q = qBuilder.build();
q.setBoost(random().nextFloat()); q.setBoost(random().nextFloat());
q.add(new TermQuery(new Term("field", "b")), Occur.FILTER);
q.add(new TermQuery(new Term("field", "a")), Occur.SHOULD);
q.add(new TermQuery(new Term("field", "d")), Occur.SHOULD);
q.setMinimumNumberShouldMatch(1);
assertSameScoresWithoutFilters(searcher, q); assertSameScoresWithoutFilters(searcher, q);
reader.close(); reader.close();
@ -568,21 +580,21 @@ public class TestBooleanQuery extends LuceneTestCase {
DirectoryReader reader = w.getReader(); DirectoryReader reader = w.getReader();
final IndexSearcher searcher = new IndexSearcher(reader); final IndexSearcher searcher = new IndexSearcher(reader);
BooleanQuery query1 = new BooleanQuery(); BooleanQuery.Builder query1 = new BooleanQuery.Builder();
query1.add(new TermQuery(new Term("field", "a")), Occur.FILTER); query1.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
// Single clauses rewrite to a term query // Single clauses rewrite to a term query
final Query rewritten1 = query1.rewrite(reader); final Query rewritten1 = query1.build().rewrite(reader);
assertTrue(rewritten1 instanceof ConstantScoreQuery); assertTrue(rewritten1 instanceof ConstantScoreQuery);
assertEquals(0f, rewritten1.getBoost(), 0f); assertEquals(0f, rewritten1.getBoost(), 0f);
// When there are two clauses, we cannot rewrite, but if one of them creates // When there are two clauses, we cannot rewrite, but if one of them creates
// a null scorer we will end up with a single filter scorer and will need to // a null scorer we will end up with a single filter scorer and will need to
// make sure to set score=0 // make sure to set score=0
BooleanQuery query2 = new BooleanQuery(); BooleanQuery.Builder query2 = new BooleanQuery.Builder();
query2.add(new TermQuery(new Term("field", "a")), Occur.FILTER); query2.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
query2.add(new TermQuery(new Term("field", "b")), Occur.SHOULD); query2.add(new TermQuery(new Term("field", "b")), Occur.SHOULD);
final Weight weight = searcher.createNormalizedWeight(query2, true); final Weight weight = searcher.createNormalizedWeight(query2.build(), true);
final Scorer scorer = weight.scorer(reader.leaves().get(0), null); final Scorer scorer = weight.scorer(reader.leaves().get(0), null);
assertEquals(0, scorer.nextDoc()); assertEquals(0, scorer.nextDoc());
assertTrue(scorer.getClass().getName(), scorer instanceof FilterScorer); assertTrue(scorer.getClass().getName(), scorer instanceof FilterScorer);
@ -610,11 +622,11 @@ public class TestBooleanQuery extends LuceneTestCase {
PhraseQuery pq = new PhraseQuery("field", "a", "b"); PhraseQuery pq = new PhraseQuery("field", "a", "b");
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(pq, Occur.MUST); q.add(pq, Occur.MUST);
q.add(new TermQuery(new Term("field", "c")), Occur.FILTER); q.add(new TermQuery(new Term("field", "c")), Occur.FILTER);
final Weight weight = searcher.createNormalizedWeight(q, random().nextBoolean()); final Weight weight = searcher.createNormalizedWeight(q.build(), random().nextBoolean());
final Scorer scorer = weight.scorer(searcher.getIndexReader().leaves().get(0), null); final Scorer scorer = weight.scorer(searcher.getIndexReader().leaves().get(0), null);
assertTrue(scorer instanceof ConjunctionScorer); assertTrue(scorer instanceof ConjunctionScorer);
assertNotNull(scorer.asTwoPhaseIterator()); assertNotNull(scorer.asTwoPhaseIterator());
@ -639,11 +651,11 @@ public class TestBooleanQuery extends LuceneTestCase {
PhraseQuery pq = new PhraseQuery("field", "a", "b"); PhraseQuery pq = new PhraseQuery("field", "a", "b");
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(pq, Occur.SHOULD); q.add(pq, Occur.SHOULD);
q.add(new TermQuery(new Term("field", "c")), Occur.SHOULD); q.add(new TermQuery(new Term("field", "c")), Occur.SHOULD);
final Weight weight = searcher.createNormalizedWeight(q, random().nextBoolean()); final Weight weight = searcher.createNormalizedWeight(q.build(), random().nextBoolean());
final Scorer scorer = weight.scorer(reader.leaves().get(0), null); final Scorer scorer = weight.scorer(reader.leaves().get(0), null);
assertTrue(scorer instanceof DisjunctionScorer); assertTrue(scorer instanceof DisjunctionScorer);
assertNotNull(scorer.asTwoPhaseIterator()); assertNotNull(scorer.asTwoPhaseIterator());
@ -670,11 +682,11 @@ public class TestBooleanQuery extends LuceneTestCase {
PhraseQuery pq = new PhraseQuery("field", "a", "b"); PhraseQuery pq = new PhraseQuery("field", "a", "b");
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(pq, Occur.SHOULD); q.add(pq, Occur.SHOULD);
q.add(new TermQuery(new Term("field", "d")), Occur.SHOULD); q.add(new TermQuery(new Term("field", "d")), Occur.SHOULD);
final Weight weight = searcher.createNormalizedWeight(q, random().nextBoolean()); final Weight weight = searcher.createNormalizedWeight(q.build(), random().nextBoolean());
final Scorer scorer = weight.scorer(searcher.getIndexReader().leaves().get(0), null); final Scorer scorer = weight.scorer(searcher.getIndexReader().leaves().get(0), null);
assertTrue(scorer instanceof BoostedScorer || scorer instanceof ExactPhraseScorer); assertTrue(scorer instanceof BoostedScorer || scorer instanceof ExactPhraseScorer);
assertNotNull(scorer.asTwoPhaseIterator()); assertNotNull(scorer.asTwoPhaseIterator());
@ -699,11 +711,11 @@ public class TestBooleanQuery extends LuceneTestCase {
PhraseQuery pq = new PhraseQuery("field", "a", "b"); PhraseQuery pq = new PhraseQuery("field", "a", "b");
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(pq, Occur.SHOULD); q.add(pq, Occur.SHOULD);
q.add(new TermQuery(new Term("field", "c")), Occur.MUST_NOT); q.add(new TermQuery(new Term("field", "c")), Occur.MUST_NOT);
final Weight weight = searcher.createNormalizedWeight(q, random().nextBoolean()); final Weight weight = searcher.createNormalizedWeight(q.build(), random().nextBoolean());
final Scorer scorer = weight.scorer(reader.leaves().get(0), null); final Scorer scorer = weight.scorer(reader.leaves().get(0), null);
assertTrue(scorer instanceof ReqExclScorer); assertTrue(scorer instanceof ReqExclScorer);
assertNotNull(scorer.asTwoPhaseIterator()); assertNotNull(scorer.asTwoPhaseIterator());
@ -728,11 +740,11 @@ public class TestBooleanQuery extends LuceneTestCase {
PhraseQuery pq = new PhraseQuery("field", "a", "b"); PhraseQuery pq = new PhraseQuery("field", "a", "b");
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(pq, Occur.MUST); q.add(pq, Occur.MUST);
q.add(new TermQuery(new Term("field", "c")), Occur.SHOULD); q.add(new TermQuery(new Term("field", "c")), Occur.SHOULD);
final Weight weight = searcher.createNormalizedWeight(q, true); final Weight weight = searcher.createNormalizedWeight(q.build(), true);
final Scorer scorer = weight.scorer(reader.leaves().get(0), null); final Scorer scorer = weight.scorer(reader.leaves().get(0), null);
assertTrue(scorer instanceof ReqOptSumScorer); assertTrue(scorer instanceof ReqOptSumScorer);
assertNotNull(scorer.asTwoPhaseIterator()); assertNotNull(scorer.asTwoPhaseIterator());
@ -743,12 +755,12 @@ public class TestBooleanQuery extends LuceneTestCase {
} }
public void testToString() { public void testToString() {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "a")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "a")), Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "b")), Occur.MUST); bq.add(new TermQuery(new Term("field", "b")), Occur.MUST);
bq.add(new TermQuery(new Term("field", "c")), Occur.MUST_NOT); bq.add(new TermQuery(new Term("field", "c")), Occur.MUST_NOT);
bq.add(new TermQuery(new Term("field", "d")), Occur.FILTER); bq.add(new TermQuery(new Term("field", "d")), Occur.FILTER);
assertEquals("a +b -c #d", bq.toString("field")); assertEquals("a +b -c #d", bq.build().toString("field"));
} }
public void testExtractTerms() throws IOException { public void testExtractTerms() throws IOException {
@ -756,12 +768,13 @@ public class TestBooleanQuery extends LuceneTestCase {
Term b = new Term("f", "b"); Term b = new Term("f", "b");
Term c = new Term("f", "c"); Term c = new Term("f", "c");
Term d = new Term("f", "d"); Term d = new Term("f", "d");
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder();
bq.add(new TermQuery(a), Occur.SHOULD); bqBuilder.add(new TermQuery(a), Occur.SHOULD);
bq.add(new TermQuery(b), Occur.MUST); bqBuilder.add(new TermQuery(b), Occur.MUST);
bq.add(new TermQuery(c), Occur.FILTER); bqBuilder.add(new TermQuery(c), Occur.FILTER);
bq.add(new TermQuery(d), Occur.MUST_NOT); bqBuilder.add(new TermQuery(d), Occur.MUST_NOT);
IndexSearcher searcher = new IndexSearcher(new MultiReader()); IndexSearcher searcher = new IndexSearcher(new MultiReader());
BooleanQuery bq = bqBuilder.build();
Set<Term> scoringTerms = new HashSet<>(); Set<Term> scoringTerms = new HashSet<>();
searcher.createNormalizedWeight(bq, true).extractTerms(scoringTerms); searcher.createNormalizedWeight(bq, true).extractTerms(scoringTerms);

View File

@ -38,7 +38,6 @@ import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.Scorer.ChildScorer; import org.apache.lucene.search.Scorer.ChildScorer;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
// TODO: refactor to a base class, that collects freqs from the scorer tree // TODO: refactor to a base class, that collects freqs from the scorer tree
@ -48,6 +47,7 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
Analyzer analyzer; Analyzer analyzer;
IndexReader reader; IndexReader reader;
IndexSearcher searcher; IndexSearcher searcher;
IndexSearcher scorerSearcher;
Directory dir; Directory dir;
static final String F1 = "title"; static final String F1 = "title";
@ -69,6 +69,7 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
// we do not use newSearcher because the assertingXXX layers break // we do not use newSearcher because the assertingXXX layers break
// the toString representations we are relying on // the toString representations we are relying on
searcher = new IndexSearcher(reader); searcher = new IndexSearcher(reader);
scorerSearcher = new ScorerIndexSearcher(reader);
} }
@Override @Override
@ -79,11 +80,11 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
} }
public void testDisjunctions() throws IOException { public void testDisjunctions() throws IOException {
BooleanQuery2 bq = new BooleanQuery2(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term(F1, "lucene")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term(F1, "lucene")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term(F2, "lucene")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term(F2, "lucene")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term(F2, "search")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term(F2, "search")), BooleanClause.Occur.SHOULD);
Map<Integer,Integer> tfs = getDocCounts(searcher, bq); Map<Integer,Integer> tfs = getDocCounts(scorerSearcher, bq.build());
assertEquals(3, tfs.size()); // 3 documents assertEquals(3, tfs.size()); // 3 documents
assertEquals(3, tfs.get(0).intValue()); // f1:lucene + f2:lucene + f2:search assertEquals(3, tfs.get(0).intValue()); // f1:lucene + f2:lucene + f2:search
assertEquals(2, tfs.get(1).intValue()); // f2:search + f2:lucene assertEquals(2, tfs.get(1).intValue()); // f2:search + f2:lucene
@ -91,13 +92,13 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
} }
public void testNestedDisjunctions() throws IOException { public void testNestedDisjunctions() throws IOException {
BooleanQuery2 bq = new BooleanQuery2(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term(F1, "lucene")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term(F1, "lucene")), BooleanClause.Occur.SHOULD);
BooleanQuery2 bq2 = new BooleanQuery2(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new TermQuery(new Term(F2, "lucene")), BooleanClause.Occur.SHOULD); bq2.add(new TermQuery(new Term(F2, "lucene")), BooleanClause.Occur.SHOULD);
bq2.add(new TermQuery(new Term(F2, "search")), BooleanClause.Occur.SHOULD); bq2.add(new TermQuery(new Term(F2, "search")), BooleanClause.Occur.SHOULD);
bq.add(bq2, BooleanClause.Occur.SHOULD); bq.add(bq2.build(), BooleanClause.Occur.SHOULD);
Map<Integer,Integer> tfs = getDocCounts(searcher, bq); Map<Integer,Integer> tfs = getDocCounts(scorerSearcher, bq.build());
assertEquals(3, tfs.size()); // 3 documents assertEquals(3, tfs.size()); // 3 documents
assertEquals(3, tfs.get(0).intValue()); // f1:lucene + f2:lucene + f2:search assertEquals(3, tfs.get(0).intValue()); // f1:lucene + f2:lucene + f2:search
assertEquals(2, tfs.get(1).intValue()); // f2:search + f2:lucene assertEquals(2, tfs.get(1).intValue()); // f2:search + f2:lucene
@ -105,10 +106,10 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
} }
public void testConjunctions() throws IOException { public void testConjunctions() throws IOException {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term(F2, "lucene")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term(F2, "lucene")), BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term(F2, "is")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term(F2, "is")), BooleanClause.Occur.MUST);
Map<Integer,Integer> tfs = getDocCounts(searcher, bq); Map<Integer,Integer> tfs = getDocCounts(searcher, bq.build());
assertEquals(3, tfs.size()); // 3 documents assertEquals(3, tfs.size()); // 3 documents
assertEquals(2, tfs.get(0).intValue()); // f2:lucene + f2:is assertEquals(2, tfs.get(0).intValue()); // f2:lucene + f2:is
assertEquals(3, tfs.get(1).intValue()); // f2:is + f2:is + f2:lucene assertEquals(3, tfs.get(1).intValue()); // f2:is + f2:is + f2:lucene
@ -185,14 +186,14 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
} }
public void testGetChildrenMinShouldMatchSumScorer() throws IOException { public void testGetChildrenMinShouldMatchSumScorer() throws IOException {
final BooleanQuery query = new BooleanQuery(); final BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(F2, "nutch")), Occur.SHOULD); query.add(new TermQuery(new Term(F2, "nutch")), Occur.SHOULD);
query.add(new TermQuery(new Term(F2, "web")), Occur.SHOULD); query.add(new TermQuery(new Term(F2, "web")), Occur.SHOULD);
query.add(new TermQuery(new Term(F2, "crawler")), Occur.SHOULD); query.add(new TermQuery(new Term(F2, "crawler")), Occur.SHOULD);
query.setMinimumNumberShouldMatch(2); query.setMinimumNumberShouldMatch(2);
query.add(new MatchAllDocsQuery(), Occur.MUST); query.add(new MatchAllDocsQuery(), Occur.MUST);
ScorerSummarizingCollector collector = new ScorerSummarizingCollector(); ScorerSummarizingCollector collector = new ScorerSummarizingCollector();
searcher.search(query, collector); searcher.search(query.build(), collector);
assertEquals(1, collector.getNumHits()); assertEquals(1, collector.getNumHits());
assertFalse(collector.getSummaries().isEmpty()); assertFalse(collector.getSummaries().isEmpty());
for (String summary : collector.getSummaries()) { for (String summary : collector.getSummaries()) {
@ -208,11 +209,11 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
} }
public void testGetChildrenBoosterScorer() throws IOException { public void testGetChildrenBoosterScorer() throws IOException {
final BooleanQuery2 query = new BooleanQuery2(); final BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(F2, "nutch")), Occur.SHOULD); query.add(new TermQuery(new Term(F2, "nutch")), Occur.SHOULD);
query.add(new TermQuery(new Term(F2, "miss")), Occur.SHOULD); query.add(new TermQuery(new Term(F2, "miss")), Occur.SHOULD);
ScorerSummarizingCollector collector = new ScorerSummarizingCollector(); ScorerSummarizingCollector collector = new ScorerSummarizingCollector();
searcher.search(query, collector); scorerSearcher.search(query.build(), collector);
assertEquals(1, collector.getNumHits()); assertEquals(1, collector.getNumHits());
assertFalse(collector.getSummaries().isEmpty()); assertFalse(collector.getSummaries().isEmpty());
for (String summary : collector.getSummaries()) { for (String summary : collector.getSummaries()) {
@ -280,21 +281,4 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
} }
} }
static class BooleanQuery2 extends BooleanQuery {
@Override
public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
return new BooleanWeight(this, searcher, needsScores, false) {
@Override
public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
Scorer scorer = scorer(context, acceptDocs);
if (scorer == null) {
return null;
}
return new DefaultBulkScorer(scorer);
}
};
}
}
} }

View File

@ -47,16 +47,16 @@ public class TestBooleanScorer extends LuceneTestCase {
IndexReader ir = writer.getReader(); IndexReader ir = writer.getReader();
writer.close(); writer.close();
BooleanQuery booleanQuery1 = new BooleanQuery(); BooleanQuery.Builder booleanQuery1 = new BooleanQuery.Builder();
booleanQuery1.add(new TermQuery(new Term(FIELD, "1")), BooleanClause.Occur.SHOULD); booleanQuery1.add(new TermQuery(new Term(FIELD, "1")), BooleanClause.Occur.SHOULD);
booleanQuery1.add(new TermQuery(new Term(FIELD, "2")), BooleanClause.Occur.SHOULD); booleanQuery1.add(new TermQuery(new Term(FIELD, "2")), BooleanClause.Occur.SHOULD);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(booleanQuery1, BooleanClause.Occur.MUST); query.add(booleanQuery1.build(), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(FIELD, "9")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(FIELD, "9")), BooleanClause.Occur.MUST_NOT);
IndexSearcher indexSearcher = newSearcher(ir); IndexSearcher indexSearcher = newSearcher(ir);
ScoreDoc[] hits = indexSearcher.search(query, 1000).scoreDocs; ScoreDoc[] hits = indexSearcher.search(query.build(), 1000).scoreDocs;
assertEquals("Number of matched documents", 2, hits.length); assertEquals("Number of matched documents", 2, hits.length);
ir.close(); ir.close();
directory.close(); directory.close();
@ -129,15 +129,15 @@ public class TestBooleanScorer extends LuceneTestCase {
w.close(); w.close();
IndexSearcher s = new IndexSearcher(r); IndexSearcher s = new IndexSearcher(r);
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(new Term("field", "little")), BooleanClause.Occur.SHOULD); q1.add(new TermQuery(new Term("field", "little")), BooleanClause.Occur.SHOULD);
q1.add(new TermQuery(new Term("field", "diseases")), BooleanClause.Occur.SHOULD); q1.add(new TermQuery(new Term("field", "diseases")), BooleanClause.Occur.SHOULD);
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(q1, BooleanClause.Occur.SHOULD); q2.add(q1.build(), BooleanClause.Occur.SHOULD);
q2.add(new CrazyMustUseBulkScorerQuery(), BooleanClause.Occur.SHOULD); q2.add(new CrazyMustUseBulkScorerQuery(), BooleanClause.Occur.SHOULD);
assertEquals(1, s.search(q2, 10).totalHits); assertEquals(1, s.search(q2.build(), 10).totalHits);
r.close(); r.close();
dir.close(); dir.close();
} }

View File

@ -83,18 +83,18 @@ public class TestCachingWrapperQuery extends LuceneTestCase {
/** test null iterator */ /** test null iterator */
public void testEmpty() throws Exception { public void testEmpty() throws Exception {
Query expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
Query cached = new CachingWrapperQuery(expected, MAYBE_CACHE_POLICY); Query cached = new CachingWrapperQuery(expected.build(), MAYBE_CACHE_POLICY);
assertQueryEquals(expected, cached); assertQueryEquals(expected.build(), cached);
} }
/** test iterator returns NO_MORE_DOCS */ /** test iterator returns NO_MORE_DOCS */
public void testEmpty2() throws Exception { public void testEmpty2() throws Exception {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("id", "0")), BooleanClause.Occur.MUST); expected.add(new TermQuery(new Term("id", "0")), BooleanClause.Occur.MUST);
expected.add(new TermQuery(new Term("id", "0")), BooleanClause.Occur.MUST_NOT); expected.add(new TermQuery(new Term("id", "0")), BooleanClause.Occur.MUST_NOT);
Query cached = new CachingWrapperQuery(expected, MAYBE_CACHE_POLICY); Query cached = new CachingWrapperQuery(expected.build(), MAYBE_CACHE_POLICY);
assertQueryEquals(expected, cached); assertQueryEquals(expected.build(), cached);
} }
/** test iterator returns single document */ /** test iterator returns single document */

View File

@ -58,7 +58,7 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
public void test1() throws Exception { public void test1() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
PhraseQuery phraseQuery = new PhraseQuery(1, FIELD, "w1", "w2"); PhraseQuery phraseQuery = new PhraseQuery(1, FIELD, "w1", "w2");
q.add(phraseQuery, Occur.MUST); q.add(phraseQuery, Occur.MUST);
@ -84,18 +84,18 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
4, true)); 4, true));
dm.add(new TermQuery(new Term(FIELD, "QQ"))); dm.add(new TermQuery(new Term(FIELD, "QQ")));
BooleanQuery xxYYZZ = new BooleanQuery(); BooleanQuery.Builder xxYYZZ = new BooleanQuery.Builder();;
xxYYZZ.add(new TermQuery(new Term(FIELD, "xx")), Occur.SHOULD); xxYYZZ.add(new TermQuery(new Term(FIELD, "xx")), Occur.SHOULD);
xxYYZZ.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD); xxYYZZ.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD);
xxYYZZ.add(new TermQuery(new Term(FIELD, "zz")), Occur.MUST_NOT); xxYYZZ.add(new TermQuery(new Term(FIELD, "zz")), Occur.MUST_NOT);
dm.add(xxYYZZ); dm.add(xxYYZZ.build());
BooleanQuery xxW1 = new BooleanQuery(); BooleanQuery.Builder xxW1 = new BooleanQuery.Builder();;
xxW1.add(new TermQuery(new Term(FIELD, "xx")), Occur.MUST_NOT); xxW1.add(new TermQuery(new Term(FIELD, "xx")), Occur.MUST_NOT);
xxW1.add(new TermQuery(new Term(FIELD, "w1")), Occur.MUST_NOT); xxW1.add(new TermQuery(new Term(FIELD, "w1")), Occur.MUST_NOT);
dm.add(xxW1); dm.add(xxW1.build());
DisjunctionMaxQuery dm2 = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery dm2 = new DisjunctionMaxQuery(0.5f);
dm2.add(new TermQuery(new Term(FIELD, "w1"))); dm2.add(new TermQuery(new Term(FIELD, "w1")));
@ -105,20 +105,20 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
q.add(dm, Occur.SHOULD); q.add(dm, Occur.SHOULD);
BooleanQuery b = new BooleanQuery(); BooleanQuery.Builder b = new BooleanQuery.Builder();;
b.setMinimumNumberShouldMatch(2); b.setMinimumNumberShouldMatch(2);
b.add(snear("w1","w2",1,true), Occur.SHOULD); b.add(snear("w1","w2",1,true), Occur.SHOULD);
b.add(snear("w2","w3",1,true), Occur.SHOULD); b.add(snear("w2","w3",1,true), Occur.SHOULD);
b.add(snear("w1","w3",3,true), Occur.SHOULD); b.add(snear("w1","w3",3,true), Occur.SHOULD);
q.add(b, Occur.SHOULD); q.add(b.build(), Occur.SHOULD);
qtest(q, new int[] { 0,1,2 }); qtest(q.build(), new int[] { 0,1,2 });
} }
public void test2() throws Exception { public void test2() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
PhraseQuery phraseQuery = new PhraseQuery(1, FIELD, "w1", "w2"); PhraseQuery phraseQuery = new PhraseQuery(1, FIELD, "w1", "w2");
q.add(phraseQuery, Occur.MUST); q.add(phraseQuery, Occur.MUST);
@ -144,18 +144,18 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
4, true)); 4, true));
dm.add(new TermQuery(new Term(FIELD, "QQ"))); dm.add(new TermQuery(new Term(FIELD, "QQ")));
BooleanQuery xxYYZZ = new BooleanQuery(); BooleanQuery.Builder xxYYZZ = new BooleanQuery.Builder();;
xxYYZZ.add(new TermQuery(new Term(FIELD, "xx")), Occur.SHOULD); xxYYZZ.add(new TermQuery(new Term(FIELD, "xx")), Occur.SHOULD);
xxYYZZ.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD); xxYYZZ.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD);
xxYYZZ.add(new TermQuery(new Term(FIELD, "zz")), Occur.MUST_NOT); xxYYZZ.add(new TermQuery(new Term(FIELD, "zz")), Occur.MUST_NOT);
dm.add(xxYYZZ); dm.add(xxYYZZ.build());
BooleanQuery xxW1 = new BooleanQuery(); BooleanQuery.Builder xxW1 = new BooleanQuery.Builder();;
xxW1.add(new TermQuery(new Term(FIELD, "xx")), Occur.MUST_NOT); xxW1.add(new TermQuery(new Term(FIELD, "xx")), Occur.MUST_NOT);
xxW1.add(new TermQuery(new Term(FIELD, "w1")), Occur.MUST_NOT); xxW1.add(new TermQuery(new Term(FIELD, "w1")), Occur.MUST_NOT);
dm.add(xxW1); dm.add(xxW1.build());
DisjunctionMaxQuery dm2 = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery dm2 = new DisjunctionMaxQuery(0.5f);
dm2.add(new TermQuery(new Term(FIELD, "w1"))); dm2.add(new TermQuery(new Term(FIELD, "w1")));
@ -165,16 +165,17 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
q.add(dm, Occur.SHOULD); q.add(dm, Occur.SHOULD);
BooleanQuery b = new BooleanQuery(); BooleanQuery.Builder builder = new BooleanQuery.Builder();;
b.setMinimumNumberShouldMatch(2); builder.setMinimumNumberShouldMatch(2);
b.add(snear("w1","w2",1,true), Occur.SHOULD); builder.add(snear("w1","w2",1,true), Occur.SHOULD);
b.add(snear("w2","w3",1,true), Occur.SHOULD); builder.add(snear("w2","w3",1,true), Occur.SHOULD);
b.add(snear("w1","w3",3,true), Occur.SHOULD); builder.add(snear("w1","w3",3,true), Occur.SHOULD);
BooleanQuery b = builder.build();
b.setBoost(0.0f); b.setBoost(0.0f);
q.add(b, Occur.SHOULD); q.add(b, Occur.SHOULD);
qtest(q, new int[] { 0,1,2 }); qtest(q.build(), new int[] { 0,1,2 });
} }
// :TODO: we really need more crazy complex cases. // :TODO: we really need more crazy complex cases.
@ -213,13 +214,13 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
public void testDMQ10() throws Exception { public void testDMQ10() throws Exception {
DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();;
query.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD);
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5"));
boostedQuery.setBoost(100); boostedQuery.setBoost(100);
query.add(boostedQuery, Occur.SHOULD); query.add(boostedQuery, Occur.SHOULD);
q.add(query); q.add(query.build());
TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx")); TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx"));
xxBoostedQuery.setBoost(0); xxBoostedQuery.setBoost(0);
@ -240,48 +241,51 @@ public class TestComplexExplanations extends BaseExplanationTestCase {
public void testBQ12() throws Exception { public void testBQ12() throws Exception {
// NOTE: using qtest not bqtest // NOTE: using qtest not bqtest
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();;
query.add(new TermQuery(new Term(FIELD, "w1")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "w1")), Occur.SHOULD);
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w2")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w2"));
boostedQuery.setBoost(0); boostedQuery.setBoost(0);
query.add(boostedQuery, Occur.SHOULD); query.add(boostedQuery, Occur.SHOULD);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ13() throws Exception { public void testBQ13() throws Exception {
// NOTE: using qtest not bqtest // NOTE: using qtest not bqtest
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();;
query.add(new TermQuery(new Term(FIELD, "w1")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "w1")), Occur.SHOULD);
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5"));
boostedQuery.setBoost(0); boostedQuery.setBoost(0);
query.add(boostedQuery, Occur.MUST_NOT); query.add(boostedQuery, Occur.MUST_NOT);
qtest(query, new int[] { 1,2,3 }); qtest(query.build(), new int[] { 1,2,3 });
} }
public void testBQ18() throws Exception { public void testBQ18() throws Exception {
// NOTE: using qtest not bqtest // NOTE: using qtest not bqtest
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();;
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1"));
boostedQuery.setBoost(0); boostedQuery.setBoost(0);
query.add(boostedQuery, Occur.MUST); query.add(boostedQuery, Occur.MUST);
query.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ21() throws Exception { public void testBQ21() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder builder = new BooleanQuery.Builder();;
query.add(new TermQuery(new Term(FIELD, "w1")), Occur.MUST); builder.add(new TermQuery(new Term(FIELD, "w1")), Occur.MUST);
query.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD); builder.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD);
Query query = builder.build();
query.setBoost(0); query.setBoost(0);
bqtest(query, new int[] { 0,1,2,3 }); bqtest(query, new int[] { 0,1,2,3 });
} }
public void testBQ22() throws Exception { public void testBQ22() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder builder = new BooleanQuery.Builder();;
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1"));
boostedQuery.setBoost(0); boostedQuery.setBoost(0);
query.add(boostedQuery, Occur.MUST); builder.add(boostedQuery, Occur.MUST);
query.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD); builder.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD);
BooleanQuery query = builder.build();
query.setBoost(0); query.setBoost(0);
bqtest(query, new int[] { 0,1,2,3 }); bqtest(query, new int[] { 0,1,2,3 });

View File

@ -70,10 +70,10 @@ public class TestConjunctions extends LuceneTestCase {
} }
public void testTermConjunctionsWithOmitTF() throws Exception { public void testTermConjunctionsWithOmitTF() throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term(F1, "nutch")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term(F1, "nutch")), BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term(F2, "is")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term(F2, "is")), BooleanClause.Occur.MUST);
TopDocs td = searcher.search(bq, 3); TopDocs td = searcher.search(bq.build(), 3);
assertEquals(1, td.totalHits); assertEquals(1, td.totalHits);
assertEquals(3F, td.scoreDocs[0].score, 0.001F); // f1:nutch + f2:is + f2:is assertEquals(3F, td.scoreDocs[0].score, 0.001F); // f1:nutch + f2:is + f2:is
} }

View File

@ -114,11 +114,11 @@ public class TestConstantScoreQuery extends LuceneTestCase {
final Query csq2 = new ConstantScoreQuery(csq1); final Query csq2 = new ConstantScoreQuery(csq1);
csq2.setBoost(5.0f); csq2.setBoost(5.0f);
final BooleanQuery bq = new BooleanQuery(); final BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(csq1, BooleanClause.Occur.SHOULD); bq.add(csq1, BooleanClause.Occur.SHOULD);
bq.add(csq2, BooleanClause.Occur.SHOULD); bq.add(csq2, BooleanClause.Occur.SHOULD);
final Query csqbq = new ConstantScoreQuery(bq); final Query csqbq = new ConstantScoreQuery(bq.build());
csqbq.setBoost(17.0f); csqbq.setBoost(17.0f);
checkHits(searcher, csq1, csq1.getBoost(), TermScorer.class); checkHits(searcher, csq1, csq1.getBoost(), TermScorer.class);

View File

@ -194,21 +194,21 @@ public class TestCustomSearcherSort extends LuceneTestCase {
@Override @Override
public TopFieldDocs search(Query query, int nDocs, Sort sort) public TopFieldDocs search(Query query, int nDocs, Sort sort)
throws IOException { throws IOException {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(query, BooleanClause.Occur.MUST); bq.add(query, BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term("mandant", Integer.toString(switcher))), bq.add(new TermQuery(new Term("mandant", Integer.toString(switcher))),
BooleanClause.Occur.MUST); BooleanClause.Occur.MUST);
return super.search(bq, nDocs, sort); return super.search(bq.build(), nDocs, sort);
} }
@Override @Override
public TopDocs search(Query query, int nDocs) public TopDocs search(Query query, int nDocs)
throws IOException { throws IOException {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(query, BooleanClause.Occur.MUST); bq.add(query, BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term("mandant", Integer.toString(switcher))), bq.add(new TermQuery(new Term("mandant", Integer.toString(switcher))),
BooleanClause.Occur.MUST); BooleanClause.Occur.MUST);
return super.search(bq, nDocs); return super.search(bq.build(), nDocs);
} }
} }

View File

@ -301,7 +301,7 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
public void testBooleanRequiredEqualScores() throws Exception { public void testBooleanRequiredEqualScores() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
{ {
DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.0f); DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.0f);
q1.add(tq("hed", "albino")); q1.add(tq("hed", "albino"));
@ -318,9 +318,9 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
QueryUtils.check(random(), q2, s); QueryUtils.check(random(), q2, s);
} }
QueryUtils.check(random(), q, s); QueryUtils.check(random(), q.build(), s);
ScoreDoc[] h = s.search(q, 1000).scoreDocs; ScoreDoc[] h = s.search(q.build(), 1000).scoreDocs;
try { try {
assertEquals("3 docs should match " + q.toString(), 3, h.length); assertEquals("3 docs should match " + q.toString(), 3, h.length);
@ -337,7 +337,7 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
public void testBooleanOptionalNoTiebreaker() throws Exception { public void testBooleanOptionalNoTiebreaker() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
{ {
DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.0f); DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.0f);
q1.add(tq("hed", "albino")); q1.add(tq("hed", "albino"));
@ -350,9 +350,9 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
q2.add(tq("dek", "elephant")); q2.add(tq("dek", "elephant"));
q.add(q2, BooleanClause.Occur.SHOULD);// false,false); q.add(q2, BooleanClause.Occur.SHOULD);// false,false);
} }
QueryUtils.check(random(), q, s); QueryUtils.check(random(), q.build(), s);
ScoreDoc[] h = s.search(q, 1000).scoreDocs; ScoreDoc[] h = s.search(q.build(), 1000).scoreDocs;
try { try {
assertEquals("4 docs should match " + q.toString(), 4, h.length); assertEquals("4 docs should match " + q.toString(), 4, h.length);
@ -373,7 +373,7 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
public void testBooleanOptionalWithTiebreaker() throws Exception { public void testBooleanOptionalWithTiebreaker() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
{ {
DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.01f); DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.01f);
q1.add(tq("hed", "albino")); q1.add(tq("hed", "albino"));
@ -386,9 +386,9 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
q2.add(tq("dek", "elephant")); q2.add(tq("dek", "elephant"));
q.add(q2, BooleanClause.Occur.SHOULD);// false,false); q.add(q2, BooleanClause.Occur.SHOULD);// false,false);
} }
QueryUtils.check(random(), q, s); QueryUtils.check(random(), q.build(), s);
ScoreDoc[] h = s.search(q, 1000).scoreDocs; ScoreDoc[] h = s.search(q.build(), 1000).scoreDocs;
try { try {
@ -427,7 +427,7 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
public void testBooleanOptionalWithTiebreakerAndBoost() throws Exception { public void testBooleanOptionalWithTiebreakerAndBoost() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
{ {
DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.01f); DisjunctionMaxQuery q1 = new DisjunctionMaxQuery(0.01f);
q1.add(tq("hed", "albino", 1.5f)); q1.add(tq("hed", "albino", 1.5f));
@ -440,9 +440,9 @@ public class TestDisjunctionMaxQuery extends LuceneTestCase {
q2.add(tq("dek", "elephant")); q2.add(tq("dek", "elephant"));
q.add(q2, BooleanClause.Occur.SHOULD);// false,false); q.add(q2, BooleanClause.Occur.SHOULD);// false,false);
} }
QueryUtils.check(random(), q, s); QueryUtils.check(random(), q.build(), s);
ScoreDoc[] h = s.search(q, 1000).scoreDocs; ScoreDoc[] h = s.search(q.build(), 1000).scoreDocs;
try { try {

View File

@ -68,7 +68,7 @@ public class TestElevationComparator extends LuceneTestCase {
private void runTest(IndexSearcher searcher, boolean reversed) throws Throwable { private void runTest(IndexSearcher searcher, boolean reversed) throws Throwable {
BooleanQuery newq = new BooleanQuery(false); BooleanQuery.Builder newq = new BooleanQuery.Builder();
TermQuery query = new TermQuery(new Term("title", "ipod")); TermQuery query = new TermQuery(new Term("title", "ipod"));
newq.add(query, BooleanClause.Occur.SHOULD); newq.add(query, BooleanClause.Occur.SHOULD);
@ -80,7 +80,7 @@ public class TestElevationComparator extends LuceneTestCase {
); );
TopDocsCollector<Entry> topCollector = TopFieldCollector.create(sort, 50, false, true, true); TopDocsCollector<Entry> topCollector = TopFieldCollector.create(sort, 50, false, true, true);
searcher.search(newq, topCollector); searcher.search(newq.build(), topCollector);
TopDocs topDocs = topCollector.topDocs(0, 10); TopDocs topDocs = topCollector.topDocs(0, 10);
int nDocsReturned = topDocs.scoreDocs.length; int nDocsReturned = topDocs.scoreDocs.length;
@ -113,14 +113,15 @@ public class TestElevationComparator extends LuceneTestCase {
} }
private Query getElevatedQuery(String[] vals) { private Query getElevatedQuery(String[] vals) {
BooleanQuery q = new BooleanQuery(false); BooleanQuery.Builder b = new BooleanQuery.Builder();
q.setBoost(0);
int max = (vals.length / 2) + 5; int max = (vals.length / 2) + 5;
for (int i = 0; i < vals.length - 1; i += 2) { for (int i = 0; i < vals.length - 1; i += 2) {
q.add(new TermQuery(new Term(vals[i], vals[i + 1])), BooleanClause.Occur.SHOULD); b.add(new TermQuery(new Term(vals[i], vals[i + 1])), BooleanClause.Occur.SHOULD);
priority.put(new BytesRef(vals[i + 1]), Integer.valueOf(max--)); priority.put(new BytesRef(vals[i + 1]), Integer.valueOf(max--));
// System.out.println(" pri doc=" + vals[i+1] + " pri=" + (1+max)); // System.out.println(" pri doc=" + vals[i+1] + " pri=" + (1+max));
} }
BooleanQuery q = b.build();
q.setBoost(0);
return q; return q;
} }

View File

@ -93,19 +93,19 @@ public class TestFieldValueQuery extends LuceneTestCase {
final IndexSearcher searcher = newSearcher(reader); final IndexSearcher searcher = newSearcher(reader);
iw.close(); iw.close();
BooleanQuery ref = new BooleanQuery(); BooleanQuery.Builder ref = new BooleanQuery.Builder();
ref.add(new TermQuery(new Term("f", "yes")), Occur.MUST); ref.add(new TermQuery(new Term("f", "yes")), Occur.MUST);
ref.add(new TermQuery(new Term("has_value", "yes")), Occur.FILTER); ref.add(new TermQuery(new Term("has_value", "yes")), Occur.FILTER);
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
bq1.add(new TermQuery(new Term("f", "yes")), Occur.MUST); bq1.add(new TermQuery(new Term("f", "yes")), Occur.MUST);
bq1.add(new FieldValueQuery("dv1"), Occur.FILTER); bq1.add(new FieldValueQuery("dv1"), Occur.FILTER);
assertSameMatches(searcher, ref, bq1, true); assertSameMatches(searcher, ref.build(), bq1.build(), true);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(new TermQuery(new Term("f", "yes")), Occur.MUST); bq2.add(new TermQuery(new Term("f", "yes")), Occur.MUST);
bq2.add(new FieldValueQuery("dv2"), Occur.FILTER); bq2.add(new FieldValueQuery("dv2"), Occur.FILTER);
assertSameMatches(searcher, ref, bq2, true); assertSameMatches(searcher, ref.build(), bq2.build(), true);
reader.close(); reader.close();
dir.close(); dir.close();

View File

@ -172,19 +172,19 @@ public class TestFilteredQuery extends LuceneTestCase {
Filter f = newStaticFilterA(); Filter f = newStaticFilterA();
float boost = 2.5f; float boost = 2.5f;
BooleanQuery bq1 = new BooleanQuery(); BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
TermQuery tq = new TermQuery (new Term ("field", "one")); TermQuery tq = new TermQuery (new Term ("field", "one"));
tq.setBoost(boost); tq.setBoost(boost);
bq1.add(tq, Occur.MUST); bq1.add(tq, Occur.MUST);
bq1.add(new TermQuery (new Term ("field", "five")), Occur.MUST); bq1.add(new TermQuery (new Term ("field", "five")), Occur.MUST);
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
tq = new TermQuery (new Term ("field", "one")); tq = new TermQuery (new Term ("field", "one"));
filteredquery = new FilteredQuery(tq, f, randomFilterStrategy(random(), useRandomAccess)); filteredquery = new FilteredQuery(tq, f, randomFilterStrategy(random(), useRandomAccess));
filteredquery.setBoost(boost); filteredquery.setBoost(boost);
bq2.add(filteredquery, Occur.MUST); bq2.add(filteredquery, Occur.MUST);
bq2.add(new TermQuery (new Term ("field", "five")), Occur.MUST); bq2.add(new TermQuery (new Term ("field", "five")), Occur.MUST);
assertScoreEquals(bq1, bq2); assertScoreEquals(bq1.build(), bq2.build());
assertEquals(boost, filteredquery.getBoost(), 0); assertEquals(boost, filteredquery.getBoost(), 0);
assertEquals(1.0f, tq.getBoost(), 0); // the boost value of the underlying query shouldn't have changed assertEquals(1.0f, tq.getBoost(), 0); // the boost value of the underlying query shouldn't have changed
@ -248,12 +248,12 @@ public class TestFilteredQuery extends LuceneTestCase {
} }
private void tBooleanMUST(final boolean useRandomAccess) throws Exception { private void tBooleanMUST(final boolean useRandomAccess) throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
Query query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(0), randomFilterStrategy(random(), useRandomAccess)); Query query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(0), randomFilterStrategy(random(), useRandomAccess));
bq.add(query, BooleanClause.Occur.MUST); bq.add(query, BooleanClause.Occur.MUST);
query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(1), randomFilterStrategy(random(), useRandomAccess)); query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(1), randomFilterStrategy(random(), useRandomAccess));
bq.add(query, BooleanClause.Occur.MUST); bq.add(query, BooleanClause.Occur.MUST);
ScoreDoc[] hits = searcher.search(bq, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(bq.build(), 1000).scoreDocs;
assertEquals(0, hits.length); assertEquals(0, hits.length);
QueryUtils.check(random(), query,searcher); QueryUtils.check(random(), query,searcher);
} }
@ -266,12 +266,12 @@ public class TestFilteredQuery extends LuceneTestCase {
} }
private void tBooleanSHOULD(final boolean useRandomAccess) throws Exception { private void tBooleanSHOULD(final boolean useRandomAccess) throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
Query query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(0), randomFilterStrategy(random(), useRandomAccess)); Query query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(0), randomFilterStrategy(random(), useRandomAccess));
bq.add(query, BooleanClause.Occur.SHOULD); bq.add(query, BooleanClause.Occur.SHOULD);
query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(1), randomFilterStrategy(random(), useRandomAccess)); query = new FilteredQuery(new TermQuery(new Term("field", "one")), new SingleDocTestFilter(1), randomFilterStrategy(random(), useRandomAccess));
bq.add(query, BooleanClause.Occur.SHOULD); bq.add(query, BooleanClause.Occur.SHOULD);
ScoreDoc[] hits = searcher.search(bq, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(bq.build(), 1000).scoreDocs;
assertEquals(2, hits.length); assertEquals(2, hits.length);
QueryUtils.check(random(), query,searcher); QueryUtils.check(random(), query,searcher);
} }
@ -286,10 +286,10 @@ public class TestFilteredQuery extends LuceneTestCase {
} }
private void tBoolean2(final boolean useRandomAccess) throws Exception { private void tBoolean2(final boolean useRandomAccess) throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
Query query = new FilteredQuery(bq, new SingleDocTestFilter(0), randomFilterStrategy(random(), useRandomAccess));
bq.add(new TermQuery(new Term("field", "one")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", "one")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "two")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", "two")), BooleanClause.Occur.SHOULD);
Query query = new FilteredQuery(bq.build(), new SingleDocTestFilter(0), randomFilterStrategy(random(), useRandomAccess));
ScoreDoc[] hits = searcher.search(query, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(query, 1000).scoreDocs;
assertEquals(1, hits.length); assertEquals(1, hits.length);
QueryUtils.check(random(), query, searcher); QueryUtils.check(random(), query, searcher);

View File

@ -70,13 +70,13 @@ public class TestFilteredSearch extends LuceneTestCase {
} }
writer.close(); writer.close();
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "36")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "36")), BooleanClause.Occur.SHOULD);
IndexReader reader = DirectoryReader.open(directory); IndexReader reader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = newSearcher(reader); IndexSearcher indexSearcher = newSearcher(reader);
ScoreDoc[] hits = indexSearcher.search(new FilteredQuery(booleanQuery, filter), 1000).scoreDocs; ScoreDoc[] hits = indexSearcher.search(new FilteredQuery(booleanQuery.build(), filter), 1000).scoreDocs;
assertEquals("Number of matched documents", 1, hits.length); assertEquals("Number of matched documents", 1, hits.length);
reader.close(); reader.close();
} }

View File

@ -300,7 +300,7 @@ public class TestFuzzyQuery extends LuceneTestCase {
writer.close(); writer.close();
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
String commonSearchTerm = "michael"; String commonSearchTerm = "michael";
FuzzyQuery commonQuery = new FuzzyQuery(new Term("field", commonSearchTerm), 2, 1); FuzzyQuery commonQuery = new FuzzyQuery(new Term("field", commonSearchTerm), 2, 1);
query.add(commonQuery, Occur.SHOULD); query.add(commonQuery, Occur.SHOULD);
@ -308,7 +308,7 @@ public class TestFuzzyQuery extends LuceneTestCase {
String rareSearchTerm = "cutting"; String rareSearchTerm = "cutting";
FuzzyQuery rareQuery = new FuzzyQuery(new Term("field", rareSearchTerm), 2, 1); FuzzyQuery rareQuery = new FuzzyQuery(new Term("field", rareSearchTerm), 2, 1);
query.add(rareQuery, Occur.SHOULD); query.add(rareQuery, Occur.SHOULD);
ScoreDoc[] hits = searcher.search(query, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(query.build(), 1000).scoreDocs;
// Matches on the rare surname should be worth more than matches on the common forename // Matches on the rare surname should be worth more than matches on the common forename
assertEquals(7, hits.length); assertEquals(7, hits.length);

View File

@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import com.carrotsearch.randomizedtesting.generators.RandomPicks; import com.carrotsearch.randomizedtesting.generators.RandomPicks;
import org.apache.lucene.document.Document; import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField; import org.apache.lucene.document.StringField;
@ -740,7 +741,7 @@ public class TestLRUQueryCache extends LuceneTestCase {
public void testUseRewrittenQueryAsCacheKey() throws IOException { public void testUseRewrittenQueryAsCacheKey() throws IOException {
final Query expectedCacheKey = new TermQuery(new Term("foo", "bar")); final Query expectedCacheKey = new TermQuery(new Term("foo", "bar"));
final BooleanQuery query = new BooleanQuery(); final BooleanQuery.Builder query = new BooleanQuery.Builder();
final Query sub = expectedCacheKey.clone(); final Query sub = expectedCacheKey.clone();
sub.setBoost(42); sub.setBoost(42);
query.add(sub, Occur.MUST); query.add(sub, Occur.MUST);
@ -772,7 +773,7 @@ public class TestLRUQueryCache extends LuceneTestCase {
searcher.setQueryCache(queryCache); searcher.setQueryCache(queryCache);
searcher.setQueryCachingPolicy(policy); searcher.setQueryCachingPolicy(policy);
searcher.search(query, new TotalHitCountCollector()); searcher.search(query.build(), new TotalHitCountCollector());
reader.close(); reader.close();
dir.close(); dir.close();
@ -793,7 +794,7 @@ public class TestLRUQueryCache extends LuceneTestCase {
searcher.setQueryCache(queryCache); searcher.setQueryCache(queryCache);
searcher.setQueryCachingPolicy(QueryCachingPolicy.ALWAYS_CACHE); searcher.setQueryCachingPolicy(QueryCachingPolicy.ALWAYS_CACHE);
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
TermQuery should = new TermQuery(new Term("foo", "baz")); TermQuery should = new TermQuery(new Term("foo", "baz"));
TermQuery must = new TermQuery(new Term("foo", "bar")); TermQuery must = new TermQuery(new Term("foo", "bar"));
TermQuery filter = new TermQuery(new Term("foo", "bar")); TermQuery filter = new TermQuery(new Term("foo", "bar"));
@ -804,20 +805,20 @@ public class TestLRUQueryCache extends LuceneTestCase {
bq.add(mustNot, Occur.MUST_NOT); bq.add(mustNot, Occur.MUST_NOT);
// same bq but with FILTER instead of MUST // same bq but with FILTER instead of MUST
BooleanQuery bq2 = new BooleanQuery(); BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
bq2.add(should, Occur.SHOULD); bq2.add(should, Occur.SHOULD);
bq2.add(must, Occur.FILTER); bq2.add(must, Occur.FILTER);
bq2.add(filter, Occur.FILTER); bq2.add(filter, Occur.FILTER);
bq2.add(mustNot, Occur.MUST_NOT); bq2.add(mustNot, Occur.MUST_NOT);
assertEquals(Collections.emptySet(), new HashSet<>(queryCache.cachedQueries())); assertEquals(Collections.emptySet(), new HashSet<>(queryCache.cachedQueries()));
searcher.search(bq, 1); searcher.search(bq.build(), 1);
assertEquals(new HashSet<>(Arrays.asList(filter, mustNot)), new HashSet<>(queryCache.cachedQueries())); assertEquals(new HashSet<>(Arrays.asList(filter, mustNot)), new HashSet<>(queryCache.cachedQueries()));
queryCache.clear(); queryCache.clear();
assertEquals(Collections.emptySet(), new HashSet<>(queryCache.cachedQueries())); assertEquals(Collections.emptySet(), new HashSet<>(queryCache.cachedQueries()));
searcher.search(new ConstantScoreQuery(bq), 1); searcher.search(new ConstantScoreQuery(bq.build()), 1);
assertEquals(new HashSet<>(Arrays.asList(bq2, should, must, filter, mustNot)), new HashSet<>(queryCache.cachedQueries())); assertEquals(new HashSet<>(Arrays.asList(bq2.build(), should, must, filter, mustNot)), new HashSet<>(queryCache.cachedQueries()));
reader.close(); reader.close();
dir.close(); dir.close();
@ -837,7 +838,7 @@ public class TestLRUQueryCache extends LuceneTestCase {
case 0: case 0:
return new TermQuery(randomTerm()); return new TermQuery(randomTerm());
case 1: case 1:
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
final int numClauses = TestUtil.nextInt(random(), 1, 3); final int numClauses = TestUtil.nextInt(random(), 1, 3);
int numShould = 0; int numShould = 0;
for (int i = 0; i < numClauses; ++i) { for (int i = 0; i < numClauses; ++i) {
@ -848,7 +849,7 @@ public class TestLRUQueryCache extends LuceneTestCase {
} }
} }
bq.setMinimumNumberShouldMatch(TestUtil.nextInt(random(), 0, numShould)); bq.setMinimumNumberShouldMatch(TestUtil.nextInt(random(), 0, numShould));
return bq; return bq.build();
case 2: case 2:
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();

View File

@ -27,7 +27,6 @@ import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
/** /**
@ -62,16 +61,16 @@ public class TestMatchAllDocsQuery extends LuceneTestCase {
// some artificial queries to trigger the use of skipTo(): // some artificial queries to trigger the use of skipTo():
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
hits = is.search(bq, 1000).scoreDocs; hits = is.search(bq.build(), 1000).scoreDocs;
assertEquals(3, hits.length); assertEquals(3, hits.length);
bq = new BooleanQuery(); bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term("key", "three")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term("key", "three")), BooleanClause.Occur.MUST);
hits = is.search(bq, 1000).scoreDocs; hits = is.search(bq.build(), 1000).scoreDocs;
assertEquals(1, hits.length); assertEquals(1, hits.length);
iw.deleteDocuments(new Term("key", "one")); iw.deleteDocuments(new Term("key", "one"));

View File

@ -118,13 +118,13 @@ public class TestMinShouldMatch2 extends LuceneTestCase {
} }
private Scorer scorer(String values[], int minShouldMatch, Mode mode) throws Exception { private Scorer scorer(String values[], int minShouldMatch, Mode mode) throws Exception {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
for (String value : values) { for (String value : values) {
bq.add(new TermQuery(new Term("field", value)), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("field", value)), BooleanClause.Occur.SHOULD);
} }
bq.setMinimumNumberShouldMatch(minShouldMatch); bq.setMinimumNumberShouldMatch(minShouldMatch);
BooleanWeight weight = (BooleanWeight) searcher.createNormalizedWeight(bq, true); BooleanWeight weight = (BooleanWeight) searcher.createNormalizedWeight(bq.build(), true);
switch (mode) { switch (mode) {
case DOC_VALUES: case DOC_VALUES:
@ -325,7 +325,7 @@ public class TestMinShouldMatch2 extends LuceneTestCase {
BooleanQuery bq = (BooleanQuery) weight.getQuery(); BooleanQuery bq = (BooleanQuery) weight.getQuery();
this.minNrShouldMatch = bq.getMinimumNumberShouldMatch(); this.minNrShouldMatch = bq.getMinimumNumberShouldMatch();
this.sims = new SimScorer[(int)dv.getValueCount()]; this.sims = new SimScorer[(int)dv.getValueCount()];
for (BooleanClause clause : bq.getClauses()) { for (BooleanClause clause : bq.clauses()) {
assert !clause.isProhibited(); assert !clause.isProhibited();
assert !clause.isRequired(); assert !clause.isRequired();
Term term = ((TermQuery)clause.getQuery()).getTerm(); Term term = ((TermQuery)clause.getQuery()).getTerm();

View File

@ -215,7 +215,7 @@ public class TestMultiPhraseQuery extends LuceneTestCase {
IndexReader reader = writer.getReader(); IndexReader reader = writer.getReader();
IndexSearcher searcher = newSearcher(reader); IndexSearcher searcher = newSearcher(reader);
// This query will be equivalent to +body:pie +body:"blue*" // This query will be equivalent to +body:pie +body:"blue*"
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("body", "pie")), BooleanClause.Occur.MUST); q.add(new TermQuery(new Term("body", "pie")), BooleanClause.Occur.MUST);
MultiPhraseQuery trouble = new MultiPhraseQuery(); MultiPhraseQuery trouble = new MultiPhraseQuery();
@ -224,12 +224,12 @@ public class TestMultiPhraseQuery extends LuceneTestCase {
q.add(trouble, BooleanClause.Occur.MUST); q.add(trouble, BooleanClause.Occur.MUST);
// exception will be thrown here without fix // exception will be thrown here without fix
ScoreDoc[] hits = searcher.search(q, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(q.build(), 1000).scoreDocs;
assertEquals("Wrong number of hits", 2, hits.length); assertEquals("Wrong number of hits", 2, hits.length);
// just make sure no exc: // just make sure no exc:
searcher.explain(q, 0); searcher.explain(q.build(), 0);
writer.close(); writer.close();
reader.close(); reader.close();
@ -246,7 +246,7 @@ public class TestMultiPhraseQuery extends LuceneTestCase {
IndexSearcher searcher = newSearcher(reader); IndexSearcher searcher = newSearcher(reader);
// This query will be equivalent to +type:note +body:"a t*" // This query will be equivalent to +type:note +body:"a t*"
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(new TermQuery(new Term("type", "note")), BooleanClause.Occur.MUST); q.add(new TermQuery(new Term("type", "note")), BooleanClause.Occur.MUST);
MultiPhraseQuery trouble = new MultiPhraseQuery(); MultiPhraseQuery trouble = new MultiPhraseQuery();
@ -256,7 +256,7 @@ public class TestMultiPhraseQuery extends LuceneTestCase {
q.add(trouble, BooleanClause.Occur.MUST); q.add(trouble, BooleanClause.Occur.MUST);
// exception will be thrown here without fix for #35626: // exception will be thrown here without fix for #35626:
ScoreDoc[] hits = searcher.search(q, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(q.build(), 1000).scoreDocs;
assertEquals("Wrong number of hits", 0, hits.length); assertEquals("Wrong number of hits", 0, hits.length);
writer.close(); writer.close();
reader.close(); reader.close();

View File

@ -179,10 +179,10 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
TermQuery dummyTerm = new TermQuery(new Term("data", "1")); TermQuery dummyTerm = new TermQuery(new Term("data", "1"));
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc
bq.add(csrq("data", "#", "#", T, T), BooleanClause.Occur.SHOULD); // hits no docs bq.add(csrq("data", "#", "#", T, T), BooleanClause.Occur.SHOULD); // hits no docs
result = search.search(bq, 1000).scoreDocs; result = search.search(bq.build(), 1000).scoreDocs;
int numHits = result.length; int numHits = result.length;
assertEquals("wrong number of results", 1, numHits); assertEquals("wrong number of results", 1, numHits);
float score = result[0].score; float score = result[0].score;
@ -191,10 +191,10 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
result[i].score, SCORE_COMP_THRESH); result[i].score, SCORE_COMP_THRESH);
} }
bq = new BooleanQuery(); bq = new BooleanQuery.Builder();
bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc
bq.add(csrq("data", "#", "#", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE), BooleanClause.Occur.SHOULD); // hits no docs bq.add(csrq("data", "#", "#", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE), BooleanClause.Occur.SHOULD); // hits no docs
result = search.search(bq, 1000).scoreDocs; result = search.search(bq.build(), 1000).scoreDocs;
numHits = result.length; numHits = result.length;
assertEquals("wrong number of results", 1, numHits); assertEquals("wrong number of results", 1, numHits);
for (int i = 0; i < numHits; i++) { for (int i = 0; i < numHits; i++) {
@ -202,10 +202,10 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
result[i].score, SCORE_COMP_THRESH); result[i].score, SCORE_COMP_THRESH);
} }
bq = new BooleanQuery(); bq = new BooleanQuery.Builder();
bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc
bq.add(csrq("data", "#", "#", T, T, MultiTermQuery.CONSTANT_SCORE_REWRITE), BooleanClause.Occur.SHOULD); // hits no docs bq.add(csrq("data", "#", "#", T, T, MultiTermQuery.CONSTANT_SCORE_REWRITE), BooleanClause.Occur.SHOULD); // hits no docs
result = search.search(bq, 1000).scoreDocs; result = search.search(bq.build(), 1000).scoreDocs;
numHits = result.length; numHits = result.length;
assertEquals("wrong number of results", 1, numHits); assertEquals("wrong number of results", 1, numHits);
for (int i = 0; i < numHits; i++) { for (int i = 0; i < numHits; i++) {
@ -255,11 +255,12 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
Query q1 = csrq("data", "A", "A", T, T); // matches document #0 Query q1 = csrq("data", "A", "A", T, T); // matches document #0
q1.setBoost(.1f); q1.setBoost(.1f);
Query q2 = csrq("data", "Z", "Z", T, T); // matches document #1 Query q2 = csrq("data", "Z", "Z", T, T); // matches document #1
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(q1, BooleanClause.Occur.SHOULD); bq.add(q1, BooleanClause.Occur.SHOULD);
bq.add(q2, BooleanClause.Occur.SHOULD); bq.add(q2, BooleanClause.Occur.SHOULD);
ScoreDoc[] hits = search.search(bq, 1000).scoreDocs; ScoreDoc[] hits = search.search(bq.build(), 1000).scoreDocs;
Assert.assertEquals(1, hits[0].doc); Assert.assertEquals(1, hits[0].doc);
Assert.assertEquals(0, hits[1].doc); Assert.assertEquals(0, hits[1].doc);
assertTrue(hits[0].score > hits[1].score); assertTrue(hits[0].score > hits[1].score);
@ -267,11 +268,12 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
q1 = csrq("data", "A", "A", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE); // matches document #0 q1 = csrq("data", "A", "A", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE); // matches document #0
q1.setBoost(.1f); q1.setBoost(.1f);
q2 = csrq("data", "Z", "Z", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE); // matches document #1 q2 = csrq("data", "Z", "Z", T, T, MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE); // matches document #1
bq = new BooleanQuery(true); bq = new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(q1, BooleanClause.Occur.SHOULD); bq.add(q1, BooleanClause.Occur.SHOULD);
bq.add(q2, BooleanClause.Occur.SHOULD); bq.add(q2, BooleanClause.Occur.SHOULD);
hits = search.search(bq, 1000).scoreDocs; hits = search.search(bq.build(), 1000).scoreDocs;
Assert.assertEquals(1, hits[0].doc); Assert.assertEquals(1, hits[0].doc);
Assert.assertEquals(0, hits[1].doc); Assert.assertEquals(0, hits[1].doc);
assertTrue(hits[0].score > hits[1].score); assertTrue(hits[0].score > hits[1].score);
@ -279,11 +281,11 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
q1 = csrq("data", "A", "A", T, T); // matches document #0 q1 = csrq("data", "A", "A", T, T); // matches document #0
q1.setBoost(10f); q1.setBoost(10f);
q2 = csrq("data", "Z", "Z", T, T); // matches document #1 q2 = csrq("data", "Z", "Z", T, T); // matches document #1
bq = new BooleanQuery(true); bq = new BooleanQuery.Builder();
bq.add(q1, BooleanClause.Occur.SHOULD); bq.add(q1, BooleanClause.Occur.SHOULD);
bq.add(q2, BooleanClause.Occur.SHOULD); bq.add(q2, BooleanClause.Occur.SHOULD);
hits = search.search(bq, 1000).scoreDocs; hits = search.search(bq.build(), 1000).scoreDocs;
Assert.assertEquals(0, hits[0].doc); Assert.assertEquals(0, hits[0].doc);
Assert.assertEquals(1, hits[1].doc); Assert.assertEquals(1, hits[1].doc);
assertTrue(hits[0].score > hits[1].score); assertTrue(hits[0].score > hits[1].score);
@ -306,11 +308,11 @@ public class TestMultiTermConstantScore extends BaseTestRangeFilter {
// now do a boolean where which also contains a // now do a boolean where which also contains a
// ConstantScoreRangeQuery and make sure hte order is the same // ConstantScoreRangeQuery and make sure hte order is the same
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.add(rq, BooleanClause.Occur.MUST);// T, F); q.add(rq, BooleanClause.Occur.MUST);// T, F);
q.add(csrq("data", "1", "6", T, T), BooleanClause.Occur.MUST);// T, F); q.add(csrq("data", "1", "6", T, T), BooleanClause.Occur.MUST);// T, F);
ScoreDoc[] actual = search.search(q, 1000).scoreDocs; ScoreDoc[] actual = search.search(q.build(), 1000).scoreDocs;
assertEquals("wrong numebr of hits", numHits, actual.length); assertEquals("wrong numebr of hits", numHits, actual.length);
for (int i = 0; i < numHits; i++) { for (int i = 0; i < numHits; i++) {

View File

@ -62,10 +62,10 @@ public class TestNeedsScores extends LuceneTestCase {
public void testProhibitedClause() throws Exception { public void testProhibitedClause() throws Exception {
Query required = new TermQuery(new Term("field", "this")); Query required = new TermQuery(new Term("field", "this"));
Query prohibited = new TermQuery(new Term("field", "3")); Query prohibited = new TermQuery(new Term("field", "3"));
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new AssertNeedsScores(required, true), BooleanClause.Occur.MUST); bq.add(new AssertNeedsScores(required, true), BooleanClause.Occur.MUST);
bq.add(new AssertNeedsScores(prohibited, false), BooleanClause.Occur.MUST_NOT); bq.add(new AssertNeedsScores(prohibited, false), BooleanClause.Occur.MUST_NOT);
assertEquals(4, searcher.search(bq, 5).totalHits); // we exclude 3 assertEquals(4, searcher.search(bq.build(), 5).totalHits); // we exclude 3
} }
/** nested inside constant score query */ /** nested inside constant score query */

View File

@ -20,7 +20,6 @@ package org.apache.lucene.search;
import org.apache.lucene.document.Field; import org.apache.lucene.document.Field;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
@ -44,11 +43,11 @@ public class TestNot extends LuceneTestCase {
IndexSearcher searcher = newSearcher(reader); IndexSearcher searcher = newSearcher(reader);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("field", "b")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term("field", "b")), BooleanClause.Occur.MUST_NOT);
ScoreDoc[] hits = searcher.search(query, 1000).scoreDocs; ScoreDoc[] hits = searcher.search(query.build(), 1000).scoreDocs;
assertEquals(0, hits.length); assertEquals(0, hits.length);
writer.close(); writer.close();
reader.close(); reader.close();

View File

@ -245,10 +245,10 @@ public class TestPhraseQuery extends LuceneTestCase {
TermQuery termQuery = new TermQuery(new Term("contents","foobar")); TermQuery termQuery = new TermQuery(new Term("contents","foobar"));
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(termQuery, BooleanClause.Occur.MUST); booleanQuery.add(termQuery, BooleanClause.Occur.MUST);
booleanQuery.add(phraseQuery, BooleanClause.Occur.MUST); booleanQuery.add(phraseQuery, BooleanClause.Occur.MUST);
hits = searcher.search(booleanQuery, 1000).scoreDocs; hits = searcher.search(booleanQuery.build(), 1000).scoreDocs;
assertEquals(1, hits.length); assertEquals(1, hits.length);
QueryUtils.check(random(), termQuery,searcher); QueryUtils.check(random(), termQuery,searcher);
@ -283,18 +283,18 @@ public class TestPhraseQuery extends LuceneTestCase {
assertEquals(2, hits.length); assertEquals(2, hits.length);
booleanQuery = new BooleanQuery(); booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(termQuery, BooleanClause.Occur.MUST); booleanQuery.add(termQuery, BooleanClause.Occur.MUST);
booleanQuery.add(phraseQuery, BooleanClause.Occur.MUST); booleanQuery.add(phraseQuery, BooleanClause.Occur.MUST);
hits = searcher.search(booleanQuery, 1000).scoreDocs; hits = searcher.search(booleanQuery.build(), 1000).scoreDocs;
assertEquals(2, hits.length); assertEquals(2, hits.length);
booleanQuery = new BooleanQuery(); booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(phraseQuery, BooleanClause.Occur.MUST); booleanQuery.add(phraseQuery, BooleanClause.Occur.MUST);
booleanQuery.add(termQuery, BooleanClause.Occur.MUST); booleanQuery.add(termQuery, BooleanClause.Occur.MUST);
hits = searcher.search(booleanQuery, 1000).scoreDocs; hits = searcher.search(booleanQuery.build(), 1000).scoreDocs;
assertEquals(2, hits.length); assertEquals(2, hits.length);
QueryUtils.check(random(), booleanQuery,searcher); QueryUtils.check(random(), booleanQuery.build(),searcher);
reader.close(); reader.close();
@ -540,9 +540,9 @@ public class TestPhraseQuery extends LuceneTestCase {
// LUCENE-1280 // LUCENE-1280
public void testEmptyPhraseQuery() throws Throwable { public void testEmptyPhraseQuery() throws Throwable {
final BooleanQuery q2 = new BooleanQuery(); final BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new PhraseQuery("field", new String[0]), BooleanClause.Occur.MUST); q2.add(new PhraseQuery("field", new String[0]), BooleanClause.Occur.MUST);
q2.toString(); q2.build().toString();
} }
/* test that a single term is rewritten to a term query */ /* test that a single term is rewritten to a term query */

View File

@ -93,22 +93,22 @@ public class TestPrefixInBooleanQuery extends LuceneTestCase {
searcher.search(query, 1000).totalHits); searcher.search(query, 1000).totalHits);
} }
public void testTermBooleanQuery() throws Exception { public void testTermBooleanQuery() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "tangfulin")), query.add(new TermQuery(new Term(FIELD, "tangfulin")),
BooleanClause.Occur.SHOULD); BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(FIELD, "notexistnames")), query.add(new TermQuery(new Term(FIELD, "notexistnames")),
BooleanClause.Occur.SHOULD); BooleanClause.Occur.SHOULD);
assertEquals("Number of matched documents", 2, assertEquals("Number of matched documents", 2,
searcher.search(query, 1000).totalHits); searcher.search(query.build(), 1000).totalHits);
} }
public void testPrefixBooleanQuery() throws Exception { public void testPrefixBooleanQuery() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new PrefixQuery(new Term(FIELD, "tang")), query.add(new PrefixQuery(new Term(FIELD, "tang")),
BooleanClause.Occur.SHOULD); BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(FIELD, "notexistnames")), query.add(new TermQuery(new Term(FIELD, "notexistnames")),
BooleanClause.Occur.SHOULD); BooleanClause.Occur.SHOULD);
assertEquals("Number of matched documents", 2, assertEquals("Number of matched documents", 2,
searcher.search(query, 1000).totalHits); searcher.search(query.build(), 1000).totalHits);
} }
} }

View File

@ -67,13 +67,13 @@ public class TestQueryRescorer extends LuceneTestCase {
w.close(); w.close();
// Do ordinary BooleanQuery: // Do ordinary BooleanQuery:
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD);
IndexSearcher searcher = getSearcher(r); IndexSearcher searcher = getSearcher(r);
searcher.setSimilarity(new DefaultSimilarity()); searcher.setSimilarity(new DefaultSimilarity());
TopDocs hits = searcher.search(bq, 10); TopDocs hits = searcher.search(bq.build(), 10);
assertEquals(2, hits.totalHits); assertEquals(2, hits.totalHits);
assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id")); assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id"));
assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id")); assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id"));
@ -122,13 +122,13 @@ public class TestQueryRescorer extends LuceneTestCase {
w.close(); w.close();
// Do ordinary BooleanQuery: // Do ordinary BooleanQuery:
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD);
IndexSearcher searcher = getSearcher(r); IndexSearcher searcher = getSearcher(r);
searcher.setSimilarity(new DefaultSimilarity()); searcher.setSimilarity(new DefaultSimilarity());
TopDocs hits = searcher.search(bq, 10); TopDocs hits = searcher.search(bq.build(), 10);
assertEquals(2, hits.totalHits); assertEquals(2, hits.totalHits);
assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id")); assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id"));
assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id")); assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id"));
@ -161,12 +161,12 @@ public class TestQueryRescorer extends LuceneTestCase {
w.close(); w.close();
// Do ordinary BooleanQuery: // Do ordinary BooleanQuery:
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD);
IndexSearcher searcher = getSearcher(r); IndexSearcher searcher = getSearcher(r);
TopDocs hits = searcher.search(bq, 10); TopDocs hits = searcher.search(bq.build(), 10);
assertEquals(2, hits.totalHits); assertEquals(2, hits.totalHits);
assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id")); assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id"));
assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id")); assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id"));
@ -212,12 +212,12 @@ public class TestQueryRescorer extends LuceneTestCase {
w.close(); w.close();
// Do ordinary BooleanQuery: // Do ordinary BooleanQuery:
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD);
IndexSearcher searcher = getSearcher(r); IndexSearcher searcher = getSearcher(r);
TopDocs hits = searcher.search(bq, 10); TopDocs hits = searcher.search(bq.build(), 10);
assertEquals(2, hits.totalHits); assertEquals(2, hits.totalHits);
assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id")); assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id"));
assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id")); assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id"));
@ -245,7 +245,7 @@ public class TestQueryRescorer extends LuceneTestCase {
int docID = hits2.scoreDocs[0].doc; int docID = hits2.scoreDocs[0].doc;
Explanation explain = rescorer.explain(searcher, Explanation explain = rescorer.explain(searcher,
searcher.explain(bq, docID), searcher.explain(bq.build(), docID),
docID); docID);
String s = explain.toString(); String s = explain.toString();
assertTrue(s.contains("TestQueryRescorer$")); assertTrue(s.contains("TestQueryRescorer$"));
@ -256,7 +256,7 @@ public class TestQueryRescorer extends LuceneTestCase {
docID = hits2.scoreDocs[1].doc; docID = hits2.scoreDocs[1].doc;
explain = rescorer.explain(searcher, explain = rescorer.explain(searcher,
searcher.explain(bq, docID), searcher.explain(bq.build(), docID),
docID); docID);
s = explain.toString(); s = explain.toString();
assertTrue(s.contains("TestQueryRescorer$")); assertTrue(s.contains("TestQueryRescorer$"));
@ -287,12 +287,12 @@ public class TestQueryRescorer extends LuceneTestCase {
w.close(); w.close();
// Do ordinary BooleanQuery: // Do ordinary BooleanQuery:
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "wizard")), Occur.SHOULD);
bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD); bq.add(new TermQuery(new Term("field", "oz")), Occur.SHOULD);
IndexSearcher searcher = getSearcher(r); IndexSearcher searcher = getSearcher(r);
TopDocs hits = searcher.search(bq, 10); TopDocs hits = searcher.search(bq.build(), 10);
assertEquals(2, hits.totalHits); assertEquals(2, hits.totalHits);
assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id")); assertEquals("0", searcher.doc(hits.scoreDocs[0].doc).get("id"));
assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id")); assertEquals("1", searcher.doc(hits.scoreDocs[1].doc).get("id"));

View File

@ -90,7 +90,7 @@ public class TestQueryWrapperFilter extends LuceneTestCase {
assertEquals(1, hits.totalHits); assertEquals(1, hits.totalHits);
// should not throw exception with complex primitive query // should not throw exception with complex primitive query
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(termQuery, Occur.MUST); booleanQuery.add(termQuery, Occur.MUST);
booleanQuery.add(new TermQuery(new Term("field", "missing")), booleanQuery.add(new TermQuery(new Term("field", "missing")),
Occur.MUST_NOT); Occur.MUST_NOT);

View File

@ -172,7 +172,7 @@ public class TestScorerPerf extends LuceneTestCase {
} }
} }
FixedBitSet addClause(BooleanQuery bq, FixedBitSet result) { FixedBitSet addClause(BooleanQuery.Builder bq, FixedBitSet result) {
final FixedBitSet rnd = sets[random().nextInt(sets.length)]; final FixedBitSet rnd = sets[random().nextInt(sets.length)];
Query q = new ConstantScoreQuery(new BitSetFilter(rnd)); Query q = new ConstantScoreQuery(new BitSetFilter(rnd));
bq.add(q, BooleanClause.Occur.MUST); bq.add(q, BooleanClause.Occur.MUST);
@ -189,7 +189,7 @@ public class TestScorerPerf extends LuceneTestCase {
for (int i=0; i<iter; i++) { for (int i=0; i<iter; i++) {
int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
FixedBitSet result=null; FixedBitSet result=null;
for (int j=0; j<nClauses; j++) { for (int j=0; j<nClauses; j++) {
result = addClause(bq,result); result = addClause(bq,result);
@ -197,7 +197,7 @@ public class TestScorerPerf extends LuceneTestCase {
CountingHitCollector hc = validate ? new MatchingHitCollector(result) CountingHitCollector hc = validate ? new MatchingHitCollector(result)
: new CountingHitCollector(); : new CountingHitCollector();
s.search(bq, hc); s.search(bq.build(), hc);
ret += hc.getSum(); ret += hc.getSum();
if (validate) assertEquals(result.cardinality(), hc.getCount()); if (validate) assertEquals(result.cardinality(), hc.getCount());
@ -213,23 +213,23 @@ public class TestScorerPerf extends LuceneTestCase {
for (int i=0; i<iter; i++) { for (int i=0; i<iter; i++) {
int oClauses = random().nextInt(maxOuterClauses-1)+2; int oClauses = random().nextInt(maxOuterClauses-1)+2;
BooleanQuery oq = new BooleanQuery(); BooleanQuery.Builder oq = new BooleanQuery.Builder();
FixedBitSet result=null; FixedBitSet result=null;
for (int o=0; o<oClauses; o++) { for (int o=0; o<oClauses; o++) {
int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
for (int j=0; j<nClauses; j++) { for (int j=0; j<nClauses; j++) {
result = addClause(bq,result); result = addClause(bq,result);
} }
oq.add(bq, BooleanClause.Occur.MUST); oq.add(bq.build(), BooleanClause.Occur.MUST);
} // outer } // outer
CountingHitCollector hc = validate ? new MatchingHitCollector(result) CountingHitCollector hc = validate ? new MatchingHitCollector(result)
: new CountingHitCollector(); : new CountingHitCollector();
s.search(oq, hc); s.search(oq.build(), hc);
nMatches += hc.getCount(); nMatches += hc.getCount();
ret += hc.getSum(); ret += hc.getSum();
if (validate) assertEquals(result.cardinality(), hc.getCount()); if (validate) assertEquals(result.cardinality(), hc.getCount());
@ -250,7 +250,7 @@ public class TestScorerPerf extends LuceneTestCase {
long nMatches=0; long nMatches=0;
for (int i=0; i<iter; i++) { for (int i=0; i<iter; i++) {
int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
BitSet termflag = new BitSet(termsInIndex); BitSet termflag = new BitSet(termsInIndex);
for (int j=0; j<nClauses; j++) { for (int j=0; j<nClauses; j++) {
int tnum; int tnum;
@ -264,7 +264,7 @@ public class TestScorerPerf extends LuceneTestCase {
} }
CountingHitCollector hc = new CountingHitCollector(); CountingHitCollector hc = new CountingHitCollector();
s.search(bq, hc); s.search(bq.build(), hc);
nMatches += hc.getCount(); nMatches += hc.getCount();
ret += hc.getSum(); ret += hc.getSum();
} }
@ -284,11 +284,11 @@ public class TestScorerPerf extends LuceneTestCase {
long nMatches=0; long nMatches=0;
for (int i=0; i<iter; i++) { for (int i=0; i<iter; i++) {
int oClauses = random().nextInt(maxOuterClauses-1)+2; int oClauses = random().nextInt(maxOuterClauses-1)+2;
BooleanQuery oq = new BooleanQuery(); BooleanQuery.Builder oq = new BooleanQuery.Builder();
for (int o=0; o<oClauses; o++) { for (int o=0; o<oClauses; o++) {
int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses int nClauses = random().nextInt(maxClauses-1)+2; // min 2 clauses
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
BitSet termflag = new BitSet(termsInIndex); BitSet termflag = new BitSet(termsInIndex);
for (int j=0; j<nClauses; j++) { for (int j=0; j<nClauses; j++) {
int tnum; int tnum;
@ -301,12 +301,12 @@ public class TestScorerPerf extends LuceneTestCase {
bq.add(tq, BooleanClause.Occur.MUST); bq.add(tq, BooleanClause.Occur.MUST);
} // inner } // inner
oq.add(bq, BooleanClause.Occur.MUST); oq.add(bq.build(), BooleanClause.Occur.MUST);
} // outer } // outer
CountingHitCollector hc = new CountingHitCollector(); CountingHitCollector hc = new CountingHitCollector();
s.search(oq, hc); s.search(oq.build(), hc);
nMatches += hc.getCount(); nMatches += hc.getCount();
ret += hc.getSum(); ret += hc.getSum();
} }

View File

@ -182,10 +182,10 @@ public class TestSearchAfter extends LuceneTestCase {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
assertQuery(new MatchAllDocsQuery(), null); assertQuery(new MatchAllDocsQuery(), null);
assertQuery(new TermQuery(new Term("english", "one")), null); assertQuery(new TermQuery(new Term("english", "one")), null);
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("english", "one")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("english", "one")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term("oddeven", "even")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("oddeven", "even")), BooleanClause.Occur.SHOULD);
assertQuery(bq, null); assertQuery(bq.build(), null);
} }
} }

View File

@ -92,11 +92,11 @@ public class TestSimilarity extends LuceneTestCase {
} }
}); });
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(a), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(a), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(b), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(b), BooleanClause.Occur.SHOULD);
//System.out.println(bq.toString("field")); //System.out.println(bq.toString("field"));
searcher.search(bq, new SimpleCollector() { searcher.search(bq.build(), new SimpleCollector() {
private int base = 0; private int base = 0;
private Scorer scorer; private Scorer scorer;
@Override @Override

View File

@ -157,46 +157,46 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
public void testDMQ5() throws Exception { public void testDMQ5() throws Exception {
DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD);
booleanQuery.add(new TermQuery(new Term(FIELD, "QQ")), BooleanClause.Occur.MUST_NOT); booleanQuery.add(new TermQuery(new Term(FIELD, "QQ")), BooleanClause.Occur.MUST_NOT);
q.add(booleanQuery); q.add(booleanQuery.build());
q.add(new TermQuery(new Term(FIELD, "xx"))); q.add(new TermQuery(new Term(FIELD, "xx")));
qtest(q, new int[] { 2,3 }); qtest(q, new int[] { 2,3 });
} }
public void testDMQ6() throws Exception { public void testDMQ6() throws Exception {
DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST_NOT); booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST_NOT);
booleanQuery.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.SHOULD);
q.add(booleanQuery); q.add(booleanQuery.build());
q.add(new TermQuery(new Term(FIELD, "xx"))); q.add(new TermQuery(new Term(FIELD, "xx")));
qtest(q, new int[] { 0,1,2,3 }); qtest(q, new int[] { 0,1,2,3 });
} }
public void testDMQ7() throws Exception { public void testDMQ7() throws Exception {
DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST_NOT); booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST_NOT);
booleanQuery.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.SHOULD);
q.add(booleanQuery); q.add(booleanQuery.build());
q.add(new TermQuery(new Term(FIELD, "w2"))); q.add(new TermQuery(new Term(FIELD, "w2")));
qtest(q, new int[] { 0,1,2,3 }); qtest(q, new int[] { 0,1,2,3 });
} }
public void testDMQ8() throws Exception { public void testDMQ8() throws Exception {
DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD);
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5"));
boostedQuery.setBoost(100); boostedQuery.setBoost(100);
booleanQuery.add(boostedQuery, BooleanClause.Occur.SHOULD); booleanQuery.add(boostedQuery, BooleanClause.Occur.SHOULD);
q.add(booleanQuery); q.add(booleanQuery.build());
TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx")); TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx"));
xxBoostedQuery.setBoost(100000); xxBoostedQuery.setBoost(100000);
@ -207,13 +207,13 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
public void testDMQ9() throws Exception { public void testDMQ9() throws Exception {
DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD);
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5"));
boostedQuery.setBoost(100); boostedQuery.setBoost(100);
booleanQuery.add(boostedQuery, BooleanClause.Occur.SHOULD); booleanQuery.add(boostedQuery, BooleanClause.Occur.SHOULD);
q.add(booleanQuery); q.add(booleanQuery.build());
TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx")); TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx"));
xxBoostedQuery.setBoost(0); xxBoostedQuery.setBoost(0);
@ -266,193 +266,197 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
/* some simple tests of boolean queries containing term queries */ /* some simple tests of boolean queries containing term queries */
public void testBQ1() throws Exception { public void testBQ1() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ2() throws Exception { public void testBQ2() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 2,3 }); qtest(query.build(), new int[] { 2,3 });
} }
public void testBQ3() throws Exception { public void testBQ3() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ4() throws Exception { public void testBQ4() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); innerQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testBQ5() throws Exception { public void testBQ5() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.MUST); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.MUST);
innerQuery.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testBQ6() throws Exception { public void testBQ6() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.MUST_NOT); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(new TermQuery(new Term(FIELD, "w5")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "w5")), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.MUST_NOT); outerQuery.add(innerQuery.build(), BooleanClause.Occur.MUST_NOT);
qtest(outerQuery, new int[] { 1,2,3 }); qtest(outerQuery.build(), new int[] { 1,2,3 });
} }
public void testBQ7() throws Exception { public void testBQ7() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.SHOULD);
childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.SHOULD); innerQuery.add(childRight.build(), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.MUST); outerQuery.add(innerQuery.build(), BooleanClause.Occur.MUST);
qtest(outerQuery, new int[] { 0 }); qtest(outerQuery.build(), new int[] { 0 });
} }
public void testBQ8() throws Exception { public void testBQ8() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.SHOULD);
childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.SHOULD); innerQuery.add(childRight.build(), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testBQ9() throws Exception { public void testBQ9() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.MUST_NOT); innerQuery.add(childRight.build(), BooleanClause.Occur.MUST_NOT);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testBQ10() throws Exception { public void testBQ10() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.MUST_NOT); innerQuery.add(childRight.build(), BooleanClause.Occur.MUST_NOT);
outerQuery.add(innerQuery, BooleanClause.Occur.MUST); outerQuery.add(innerQuery.build(), BooleanClause.Occur.MUST);
qtest(outerQuery, new int[] { 1 }); qtest(outerQuery.build(), new int[] { 1 });
} }
public void testBQ11() throws Exception { public void testBQ11() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1")); TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1"));
boostedQuery.setBoost(1000); boostedQuery.setBoost(1000);
query.add(boostedQuery, BooleanClause.Occur.SHOULD); query.add(boostedQuery, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ14() throws Exception { public void testBQ14() throws Exception {
BooleanQuery q = new BooleanQuery(true); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.setDisableCoord(true);
q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.SHOULD);
q.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
qtest(q, new int[] { 0,1,2,3 }); qtest(q.build(), new int[] { 0,1,2,3 });
} }
public void testBQ15() throws Exception { public void testBQ15() throws Exception {
BooleanQuery q = new BooleanQuery(true); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.setDisableCoord(true);
q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.MUST_NOT); q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.MUST_NOT);
q.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
qtest(q, new int[] { 0,1,2,3 }); qtest(q.build(), new int[] { 0,1,2,3 });
} }
public void testBQ16() throws Exception { public void testBQ16() throws Exception {
BooleanQuery q = new BooleanQuery(true); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.setDisableCoord(true);
q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.SHOULD);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
booleanQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); booleanQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
q.add(booleanQuery, BooleanClause.Occur.SHOULD); q.add(booleanQuery.build(), BooleanClause.Occur.SHOULD);
qtest(q, new int[] { 0,1 }); qtest(q.build(), new int[] { 0,1 });
} }
public void testBQ17() throws Exception { public void testBQ17() throws Exception {
BooleanQuery q = new BooleanQuery(true); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.setDisableCoord(true);
q.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
booleanQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); booleanQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
q.add(booleanQuery, BooleanClause.Occur.SHOULD); q.add(booleanQuery.build(), BooleanClause.Occur.SHOULD);
qtest(q, new int[] { 0,1,2,3 }); qtest(q.build(), new int[] { 0,1,2,3 });
} }
public void testBQ19() throws Exception { public void testBQ19() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST_NOT);
query.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "w3")), BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1 }); qtest(query.build(), new int[] { 0,1 });
} }
public void testBQ20() throws Exception { public void testBQ20() throws Exception {
BooleanQuery q = new BooleanQuery(); BooleanQuery.Builder q = new BooleanQuery.Builder();
q.setMinimumNumberShouldMatch(2); q.setMinimumNumberShouldMatch(2);
q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "QQQQQ")), BooleanClause.Occur.SHOULD);
q.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD);
@ -460,183 +464,183 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
q.add(new TermQuery(new Term(FIELD, "w5")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "w5")), BooleanClause.Occur.SHOULD);
q.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.SHOULD); q.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.SHOULD);
qtest(q, new int[] { 0,3 }); qtest(q.build(), new int[] { 0,3 });
} }
public void testBQ23() throws Exception { public void testBQ23() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER);
query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.FILTER); query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.FILTER);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ24() throws Exception { public void testBQ24() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER);
query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ25() throws Exception { public void testBQ25() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER);
query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testBQ26() throws Exception { public void testBQ26() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.FILTER);
query.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); query.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
qtest(query, new int[] { 0,1 }); qtest(query.build(), new int[] { 0,1 });
} }
/* BQ of TQ: using alt so some fields have zero boost and some don't */ /* BQ of TQ: using alt so some fields have zero boost and some don't */
public void testMultiFieldBQ1() throws Exception { public void testMultiFieldBQ1() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQ2() throws Exception { public void testMultiFieldBQ2() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 2,3 }); qtest(query.build(), new int[] { 2,3 });
} }
public void testMultiFieldBQ3() throws Exception { public void testMultiFieldBQ3() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(FIELD, "yy")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQ4() throws Exception { public void testMultiFieldBQ4() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); innerQuery.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQ5() throws Exception { public void testMultiFieldBQ5() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.MUST); innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.MUST);
innerQuery.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQ6() throws Exception { public void testMultiFieldBQ6() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.MUST_NOT); innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(new TermQuery(new Term(ALTFIELD, "w5")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(ALTFIELD, "w5")), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.MUST_NOT); outerQuery.add(innerQuery.build(), BooleanClause.Occur.MUST_NOT);
qtest(outerQuery, new int[] { 1,2,3 }); qtest(outerQuery.build(), new int[] { 1,2,3 });
} }
public void testMultiFieldBQ7() throws Exception { public void testMultiFieldBQ7() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(ALTFIELD, "xx")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(ALTFIELD, "xx")), BooleanClause.Occur.SHOULD);
childLeft.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(ALTFIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(ALTFIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.SHOULD); innerQuery.add(childRight.build(), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.MUST); outerQuery.add(innerQuery.build(), BooleanClause.Occur.MUST);
qtest(outerQuery, new int[] { 0 }); qtest(outerQuery.build(), new int[] { 0 });
} }
public void testMultiFieldBQ8() throws Exception { public void testMultiFieldBQ8() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(ALTFIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(ALTFIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(FIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(ALTFIELD, "xx")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(ALTFIELD, "xx")), BooleanClause.Occur.SHOULD);
childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.MUST_NOT);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.SHOULD); innerQuery.add(childRight.build(), BooleanClause.Occur.SHOULD);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQ9() throws Exception { public void testMultiFieldBQ9() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(FIELD, "w2")), BooleanClause.Occur.SHOULD);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.MUST_NOT); innerQuery.add(childRight.build(), BooleanClause.Occur.MUST_NOT);
outerQuery.add(innerQuery, BooleanClause.Occur.SHOULD); outerQuery.add(innerQuery.build(), BooleanClause.Occur.SHOULD);
qtest(outerQuery, new int[] { 0,1,2,3 }); qtest(outerQuery.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQ10() throws Exception { public void testMultiFieldBQ10() throws Exception {
BooleanQuery outerQuery = new BooleanQuery(); BooleanQuery.Builder outerQuery = new BooleanQuery.Builder();
outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST); outerQuery.add(new TermQuery(new Term(FIELD, "w1")), BooleanClause.Occur.MUST);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.SHOULD); innerQuery.add(new TermQuery(new Term(ALTFIELD, "qq")), BooleanClause.Occur.SHOULD);
BooleanQuery childLeft = new BooleanQuery(); BooleanQuery.Builder childLeft = new BooleanQuery.Builder();
childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT); childLeft.add(new TermQuery(new Term(FIELD, "xx")), BooleanClause.Occur.MUST_NOT);
childLeft.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.SHOULD); childLeft.add(new TermQuery(new Term(ALTFIELD, "w2")), BooleanClause.Occur.SHOULD);
innerQuery.add(childLeft, BooleanClause.Occur.SHOULD); innerQuery.add(childLeft.build(), BooleanClause.Occur.SHOULD);
BooleanQuery childRight = new BooleanQuery(); BooleanQuery.Builder childRight = new BooleanQuery.Builder();
childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(ALTFIELD, "w3")), BooleanClause.Occur.MUST);
childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST); childRight.add(new TermQuery(new Term(FIELD, "w4")), BooleanClause.Occur.MUST);
innerQuery.add(childRight, BooleanClause.Occur.MUST_NOT); innerQuery.add(childRight.build(), BooleanClause.Occur.MUST_NOT);
outerQuery.add(innerQuery, BooleanClause.Occur.MUST); outerQuery.add(innerQuery.build(), BooleanClause.Occur.MUST);
qtest(outerQuery, new int[] { 1 }); qtest(outerQuery.build(), new int[] { 1 });
} }
/* BQ of PQ: using alt so some fields have zero boost and some don't */ /* BQ of PQ: using alt so some fields have zero boost and some don't */
public void testMultiFieldBQofPQ1() throws Exception { public void testMultiFieldBQofPQ1() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(FIELD, "w1", "w2"); PhraseQuery leftChild = new PhraseQuery(FIELD, "w1", "w2");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -644,10 +648,10 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(ALTFIELD, "w1", "w2"); PhraseQuery rightChild = new PhraseQuery(ALTFIELD, "w1", "w2");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0 }); qtest(query.build(), new int[] { 0 });
} }
public void testMultiFieldBQofPQ2() throws Exception { public void testMultiFieldBQofPQ2() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(FIELD, "w1", "w3"); PhraseQuery leftChild = new PhraseQuery(FIELD, "w1", "w3");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -655,10 +659,10 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(ALTFIELD, "w1", "w3"); PhraseQuery rightChild = new PhraseQuery(ALTFIELD, "w1", "w3");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 1,3 }); qtest(query.build(), new int[] { 1,3 });
} }
public void testMultiFieldBQofPQ3() throws Exception { public void testMultiFieldBQofPQ3() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(1, FIELD, "w1", "w2"); PhraseQuery leftChild = new PhraseQuery(1, FIELD, "w1", "w2");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -666,10 +670,10 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w1", "w2"); PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w1", "w2");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1,2 }); qtest(query.build(), new int[] { 0,1,2 });
} }
public void testMultiFieldBQofPQ4() throws Exception { public void testMultiFieldBQofPQ4() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(1, FIELD, "w2", "w3"); PhraseQuery leftChild = new PhraseQuery(1, FIELD, "w2", "w3");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -677,10 +681,10 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w2", "w3"); PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w2", "w3");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
public void testMultiFieldBQofPQ5() throws Exception { public void testMultiFieldBQofPQ5() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(1, FIELD, "w3", "w2"); PhraseQuery leftChild = new PhraseQuery(1, FIELD, "w3", "w2");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -688,10 +692,10 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w3", "w2"); PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w3", "w2");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 1,3 }); qtest(query.build(), new int[] { 1,3 });
} }
public void testMultiFieldBQofPQ6() throws Exception { public void testMultiFieldBQofPQ6() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(2, FIELD, "w3", "w2"); PhraseQuery leftChild = new PhraseQuery(2, FIELD, "w3", "w2");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -699,10 +703,10 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(2, ALTFIELD, "w3", "w2"); PhraseQuery rightChild = new PhraseQuery(2, ALTFIELD, "w3", "w2");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1,3 }); qtest(query.build(), new int[] { 0,1,3 });
} }
public void testMultiFieldBQofPQ7() throws Exception { public void testMultiFieldBQofPQ7() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery leftChild = new PhraseQuery(3, FIELD, "w3", "w2"); PhraseQuery leftChild = new PhraseQuery(3, FIELD, "w3", "w2");
query.add(leftChild, BooleanClause.Occur.SHOULD); query.add(leftChild, BooleanClause.Occur.SHOULD);
@ -710,7 +714,7 @@ public class TestSimpleExplanations extends BaseExplanationTestCase {
PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w3", "w2"); PhraseQuery rightChild = new PhraseQuery(1, ALTFIELD, "w3", "w2");
query.add(rightChild, BooleanClause.Occur.SHOULD); query.add(rightChild, BooleanClause.Occur.SHOULD);
qtest(query, new int[] { 0,1,2,3 }); qtest(query.build(), new int[] { 0,1,2,3 });
} }
} }

View File

@ -34,10 +34,10 @@ public class TestSimpleSearchEquivalence extends SearchEquivalenceTestBase {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
TermQuery q1 = new TermQuery(t1); TermQuery q1 = new TermQuery(t1);
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.SHOULD); q2.add(new TermQuery(t1), Occur.SHOULD);
q2.add(new TermQuery(t2), Occur.SHOULD); q2.add(new TermQuery(t2), Occur.SHOULD);
assertSubsetOf(q1, q2); assertSubsetOf(q1, q2.build());
} }
/** A ⊆ (+A B) */ /** A ⊆ (+A B) */
@ -45,47 +45,47 @@ public class TestSimpleSearchEquivalence extends SearchEquivalenceTestBase {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
TermQuery q1 = new TermQuery(t1); TermQuery q1 = new TermQuery(t1);
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.MUST); q2.add(new TermQuery(t1), Occur.MUST);
q2.add(new TermQuery(t2), Occur.SHOULD); q2.add(new TermQuery(t2), Occur.SHOULD);
assertSubsetOf(q1, q2); assertSubsetOf(q1, q2.build());
} }
/** (A -B) ⊆ A */ /** (A -B) ⊆ A */
public void testBooleanReqExclVersusTerm() throws Exception { public void testBooleanReqExclVersusTerm() throws Exception {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(t1), Occur.MUST); q1.add(new TermQuery(t1), Occur.MUST);
q1.add(new TermQuery(t2), Occur.MUST_NOT); q1.add(new TermQuery(t2), Occur.MUST_NOT);
TermQuery q2 = new TermQuery(t1); TermQuery q2 = new TermQuery(t1);
assertSubsetOf(q1, q2); assertSubsetOf(q1.build(), q2);
} }
/** (+A +B) ⊆ (A B) */ /** (+A +B) ⊆ (A B) */
public void testBooleanAndVersusBooleanOr() throws Exception { public void testBooleanAndVersusBooleanOr() throws Exception {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(t1), Occur.SHOULD); q1.add(new TermQuery(t1), Occur.SHOULD);
q1.add(new TermQuery(t2), Occur.SHOULD); q1.add(new TermQuery(t2), Occur.SHOULD);
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.SHOULD); q2.add(new TermQuery(t1), Occur.SHOULD);
q2.add(new TermQuery(t2), Occur.SHOULD); q2.add(new TermQuery(t2), Occur.SHOULD);
assertSubsetOf(q1, q2); assertSubsetOf(q1.build(), q2.build());
} }
/** (A B) = (A | B) */ /** (A B) = (A | B) */
public void testDisjunctionSumVersusDisjunctionMax() throws Exception { public void testDisjunctionSumVersusDisjunctionMax() throws Exception {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(t1), Occur.SHOULD); q1.add(new TermQuery(t1), Occur.SHOULD);
q1.add(new TermQuery(t2), Occur.SHOULD); q1.add(new TermQuery(t2), Occur.SHOULD);
DisjunctionMaxQuery q2 = new DisjunctionMaxQuery(0.5f); DisjunctionMaxQuery q2 = new DisjunctionMaxQuery(0.5f);
q2.add(new TermQuery(t1)); q2.add(new TermQuery(t1));
q2.add(new TermQuery(t2)); q2.add(new TermQuery(t2));
assertSameSet(q1, q2); assertSameSet(q1.build(), q2);
} }
/** "A B" ⊆ (+A +B) */ /** "A B" ⊆ (+A +B) */
@ -93,10 +93,10 @@ public class TestSimpleSearchEquivalence extends SearchEquivalenceTestBase {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
PhraseQuery q1 = new PhraseQuery(t1.field(), t1.bytes(), t2.bytes()); PhraseQuery q1 = new PhraseQuery(t1.field(), t1.bytes(), t2.bytes());
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.MUST); q2.add(new TermQuery(t1), Occur.MUST);
q2.add(new TermQuery(t2), Occur.MUST); q2.add(new TermQuery(t2), Occur.MUST);
assertSubsetOf(q1, q2); assertSubsetOf(q1, q2.build());
} }
/** same as above, with posincs */ /** same as above, with posincs */
@ -107,10 +107,10 @@ public class TestSimpleSearchEquivalence extends SearchEquivalenceTestBase {
builder.add(t1, 0); builder.add(t1, 0);
builder.add(t2, 2); builder.add(t2, 2);
PhraseQuery q1 = builder.build(); PhraseQuery q1 = builder.build();
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.MUST); q2.add(new TermQuery(t1), Occur.MUST);
q2.add(new TermQuery(t2), Occur.MUST); q2.add(new TermQuery(t2), Occur.MUST);
assertSubsetOf(q1, q2); assertSubsetOf(q1, q2.build());
} }
/** "A B" ⊆ "A B"~1 */ /** "A B" ⊆ "A B"~1 */
@ -172,10 +172,10 @@ public class TestSimpleSearchEquivalence extends SearchEquivalenceTestBase {
t2 = randomTerm(); t2 = randomTerm();
} while (t1.equals(t2)); } while (t1.equals(t2));
PhraseQuery q1 = new PhraseQuery(Integer.MAX_VALUE, t1.field(), t1.bytes(), t2.bytes()); PhraseQuery q1 = new PhraseQuery(Integer.MAX_VALUE, t1.field(), t1.bytes(), t2.bytes());
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.MUST); q2.add(new TermQuery(t1), Occur.MUST);
q2.add(new TermQuery(t2), Occur.MUST); q2.add(new TermQuery(t2), Occur.MUST);
assertSameSet(q1, q2); assertSameSet(q1, q2.build());
} }
/** Phrase positions are relative. */ /** Phrase positions are relative. */

View File

@ -133,7 +133,6 @@ public class TestSortRandom extends LuceneTestCase {
final TopFieldDocs hits; final TopFieldDocs hits;
final SortField sf; final SortField sf;
final boolean sortMissingLast; final boolean sortMissingLast;
final boolean missingIsNull;
sf = new SortField("stringdv", type, reverse); sf = new SortField("stringdv", type, reverse);
sortMissingLast = random().nextBoolean(); sortMissingLast = random().nextBoolean();
@ -152,14 +151,14 @@ public class TestSortRandom extends LuceneTestCase {
int queryType = random.nextInt(2); int queryType = random.nextInt(2);
if (queryType == 0) { if (queryType == 0) {
// force out of order // force out of order
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
// Add a Query with SHOULD, since bw.scorer() returns BooleanScorer2 // Add a Query with SHOULD, since bw.scorer() returns BooleanScorer2
// which delegates to BS if there are no mandatory clauses. // which delegates to BS if there are no mandatory clauses.
bq.add(new MatchAllDocsQuery(), Occur.SHOULD); bq.add(new MatchAllDocsQuery(), Occur.SHOULD);
// Set minNrShouldMatch to 1 so that BQ will not optimize rewrite to return // Set minNrShouldMatch to 1 so that BQ will not optimize rewrite to return
// the clause instead of BQ. // the clause instead of BQ.
bq.setMinimumNumberShouldMatch(1); bq.setMinimumNumberShouldMatch(1);
hits = s.search(new FilteredQuery(bq, f), hitCount, sort, random.nextBoolean(), random.nextBoolean()); hits = s.search(new FilteredQuery(bq.build(), f), hitCount, sort, random.nextBoolean(), random.nextBoolean());
} else { } else {
hits = s.search(new ConstantScoreQuery(f), hits = s.search(new ConstantScoreQuery(f),
hitCount, sort, random.nextBoolean(), random.nextBoolean()); hitCount, sort, random.nextBoolean(), random.nextBoolean());

View File

@ -145,12 +145,12 @@ public class TestSubScorerFreqs extends LuceneTestCase {
TermQuery cQuery = new TermQuery(new Term("f", "c")); TermQuery cQuery = new TermQuery(new Term("f", "c"));
TermQuery yQuery = new TermQuery(new Term("f", "y")); TermQuery yQuery = new TermQuery(new Term("f", "y"));
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
BooleanQuery inner = new BooleanQuery(); BooleanQuery.Builder inner = new BooleanQuery.Builder();
inner.add(cQuery, Occur.SHOULD); inner.add(cQuery, Occur.SHOULD);
inner.add(yQuery, Occur.MUST_NOT); inner.add(yQuery, Occur.MUST_NOT);
query.add(inner, Occur.MUST); query.add(inner.build(), Occur.MUST);
query.add(aQuery, Occur.MUST); query.add(aQuery, Occur.MUST);
query.add(dQuery, Occur.MUST); query.add(dQuery, Occur.MUST);
@ -164,7 +164,7 @@ public class TestSubScorerFreqs extends LuceneTestCase {
for (final Set<String> occur : occurList) { for (final Set<String> occur : occurList) {
CountingCollector c = new CountingCollector(TopScoreDocCollector.create( CountingCollector c = new CountingCollector(TopScoreDocCollector.create(
10), occur); 10), occur);
s.search(query, c); s.search(query.build(), c);
final int maxDocs = s.getIndexReader().maxDoc(); final int maxDocs = s.getIndexReader().maxDoc();
assertEquals(maxDocs, c.docCounts.size()); assertEquals(maxDocs, c.docCounts.size());
boolean includeOptional = occur.contains("SHOULD"); boolean includeOptional = occur.contains("SHOULD");

View File

@ -92,7 +92,7 @@ public class TestTimeLimitingCollector extends LuceneTestCase {
iw.close(); iw.close();
searcher = newSearcher(reader); searcher = newSearcher(reader);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "one")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "one")), BooleanClause.Occur.SHOULD);
// start from 1, so that the 0th doc never matches // start from 1, so that the 0th doc never matches
for (int i = 1; i < docText.length; i++) { for (int i = 1; i < docText.length; i++) {
@ -102,7 +102,7 @@ public class TestTimeLimitingCollector extends LuceneTestCase {
} }
} }
query = booleanQuery; query = booleanQuery.build();
// warm the searcher // warm the searcher
searcher.search(query, 1000); searcher.search(query, 1000);
@ -274,10 +274,10 @@ public class TestTimeLimitingCollector extends LuceneTestCase {
// search // search
TimeExceededException timoutException = null; TimeExceededException timoutException = null;
try { try {
BooleanQuery booleanQuery = new BooleanQuery(); // won't match - we only test if we check timeout when collectors are pulled BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder(); // won't match - we only test if we check timeout when collectors are pulled
booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "one")), BooleanClause.Occur.MUST); booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "one")), BooleanClause.Occur.MUST);
booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "blueberry")), BooleanClause.Occur.MUST); booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "blueberry")), BooleanClause.Occur.MUST);
searcher.search(booleanQuery, collector); searcher.search(booleanQuery.build(), collector);
} catch (TimeExceededException x) { } catch (TimeExceededException x) {
timoutException = x; timoutException = x;
} }

View File

@ -144,10 +144,10 @@ public class TestWildcard extends LuceneTestCase {
Query query4 = new WildcardQuery(new Term("body", "m*tal*")); Query query4 = new WildcardQuery(new Term("body", "m*tal*"));
Query query5 = new WildcardQuery(new Term("body", "m*tals")); Query query5 = new WildcardQuery(new Term("body", "m*tals"));
BooleanQuery query6 = new BooleanQuery(); BooleanQuery.Builder query6 = new BooleanQuery.Builder();
query6.add(query5, BooleanClause.Occur.SHOULD); query6.add(query5, BooleanClause.Occur.SHOULD);
BooleanQuery query7 = new BooleanQuery(); BooleanQuery.Builder query7 = new BooleanQuery.Builder();
query7.add(query3, BooleanClause.Occur.SHOULD); query7.add(query3, BooleanClause.Occur.SHOULD);
query7.add(query5, BooleanClause.Occur.SHOULD); query7.add(query5, BooleanClause.Occur.SHOULD);
@ -159,8 +159,8 @@ public class TestWildcard extends LuceneTestCase {
assertMatches(searcher, query3, 1); assertMatches(searcher, query3, 1);
assertMatches(searcher, query4, 2); assertMatches(searcher, query4, 2);
assertMatches(searcher, query5, 1); assertMatches(searcher, query5, 1);
assertMatches(searcher, query6, 1); assertMatches(searcher, query6.build(), 1);
assertMatches(searcher, query7, 2); assertMatches(searcher, query7.build(), 2);
assertMatches(searcher, query8, 0); assertMatches(searcher, query8, 0);
assertMatches(searcher, new WildcardQuery(new Term("body", "*tall")), 0); assertMatches(searcher, new WildcardQuery(new Term("body", "*tall")), 0);
assertMatches(searcher, new WildcardQuery(new Term("body", "*tal")), 1); assertMatches(searcher, new WildcardQuery(new Term("body", "*tal")), 1);

View File

@ -288,15 +288,15 @@ public class TestPayloadTermQuery extends LuceneTestCase {
new MaxPayloadFunction()); new MaxPayloadFunction());
BooleanClause c1 = new BooleanClause(q1, BooleanClause.Occur.MUST); BooleanClause c1 = new BooleanClause(q1, BooleanClause.Occur.MUST);
BooleanClause c2 = new BooleanClause(q2, BooleanClause.Occur.MUST_NOT); BooleanClause c2 = new BooleanClause(q2, BooleanClause.Occur.MUST_NOT);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(c1); query.add(c1);
query.add(c2); query.add(c2);
TopDocs hits = searcher.search(query, 100); TopDocs hits = searcher.search(query.build(), 100);
assertTrue("hits is null and it shouldn't be", hits != null); assertTrue("hits is null and it shouldn't be", hits != null);
assertTrue("hits Size: " + hits.totalHits + " is not: " + 1, hits.totalHits == 1); assertTrue("hits Size: " + hits.totalHits + " is not: " + 1, hits.totalHits == 1);
int[] results = new int[1]; int[] results = new int[1];
results[0] = 0;//hits.scoreDocs[0].doc; results[0] = 0;//hits.scoreDocs[0].doc;
CheckHits.checkHitCollector(random(), query, PayloadHelper.NO_PAYLOAD_FIELD, searcher, results); CheckHits.checkHitCollector(random(), query.build(), PayloadHelper.NO_PAYLOAD_FIELD, searcher, results);
} }
static class BoostingSimilarity extends DefaultSimilarity { static class BoostingSimilarity extends DefaultSimilarity {

View File

@ -102,10 +102,11 @@ public class TestSimilarity2 extends LuceneTestCase {
for (Similarity sim : sims) { for (Similarity sim : sims) {
is.setSimilarity(sim); is.setSimilarity(sim);
BooleanQuery query = new BooleanQuery(true); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.setDisableCoord(true);
query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("bar", "baz")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("bar", "baz")), BooleanClause.Occur.SHOULD);
assertEquals(1, is.search(query, 10).totalHits); assertEquals(1, is.search(query.build(), 10).totalHits);
} }
ir.close(); ir.close();
dir.close(); dir.close();
@ -124,10 +125,11 @@ public class TestSimilarity2 extends LuceneTestCase {
for (Similarity sim : sims) { for (Similarity sim : sims) {
is.setSimilarity(sim); is.setSimilarity(sim);
BooleanQuery query = new BooleanQuery(true); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.setDisableCoord(true);
query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("foo", "baz")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("foo", "baz")), BooleanClause.Occur.SHOULD);
assertEquals(1, is.search(query, 10).totalHits); assertEquals(1, is.search(query.build(), 10).totalHits);
} }
ir.close(); ir.close();
dir.close(); dir.close();
@ -149,9 +151,10 @@ public class TestSimilarity2 extends LuceneTestCase {
for (Similarity sim : sims) { for (Similarity sim : sims) {
is.setSimilarity(sim); is.setSimilarity(sim);
BooleanQuery query = new BooleanQuery(true); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.setDisableCoord(true);
query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD);
assertEquals(1, is.search(query, 10).totalHits); assertEquals(1, is.search(query.build(), 10).totalHits);
} }
ir.close(); ir.close();
dir.close(); dir.close();
@ -174,9 +177,10 @@ public class TestSimilarity2 extends LuceneTestCase {
for (Similarity sim : sims) { for (Similarity sim : sims) {
is.setSimilarity(sim); is.setSimilarity(sim);
BooleanQuery query = new BooleanQuery(true); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.setDisableCoord(true);
query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD);
assertEquals(1, is.search(query, 10).totalHits); assertEquals(1, is.search(query.build(), 10).totalHits);
} }
ir.close(); ir.close();
dir.close(); dir.close();
@ -200,9 +204,10 @@ public class TestSimilarity2 extends LuceneTestCase {
for (Similarity sim : sims) { for (Similarity sim : sims) {
is.setSimilarity(sim); is.setSimilarity(sim);
BooleanQuery query = new BooleanQuery(true); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.setDisableCoord(true);
query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("foo", "bar")), BooleanClause.Occur.SHOULD);
assertEquals(1, is.search(query, 10).totalHits); assertEquals(1, is.search(query.build(), 10).totalHits);
} }
ir.close(); ir.close();
dir.close(); dir.close();

View File

@ -125,10 +125,10 @@ public class TestBasics extends LuceneTestCase {
} }
public void testBoolean() throws Exception { public void testBoolean() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("field", "seventy")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term("field", "seventy")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term("field", "seven")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term("field", "seven")), BooleanClause.Occur.MUST);
checkHits(query, new int[] checkHits(query.build(), new int[]
{77, 177, 277, 377, 477, 577, 677, 770, 771, 772, 773, 774, 775, 776, 777, {77, 177, 277, 377, 477, 577, 677, 770, 771, 772, 773, 774, 775, 776, 777,
778, 779, 877, 977, 1077, 1177, 1277, 1377, 1477, 1577, 1677, 778, 779, 877, 977, 1077, 1177, 1277, 1377, 1477, 1577, 1677,
1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1877, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1877,
@ -136,10 +136,10 @@ public class TestBasics extends LuceneTestCase {
} }
public void testBoolean2() throws Exception { public void testBoolean2() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("field", "sevento")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term("field", "sevento")), BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term("field", "sevenly")), BooleanClause.Occur.MUST); query.add(new TermQuery(new Term("field", "sevenly")), BooleanClause.Occur.MUST);
checkHits(query, new int[] {}); checkHits(query.build(), new int[] {});
} }
public void testSpanNearExact() throws Exception { public void testSpanNearExact() throws Exception {

View File

@ -60,11 +60,11 @@ public class TestSpanSearchEquivalence extends SearchEquivalenceTestBase {
public void testSpanOrVersusBooleanTerm() throws Exception { public void testSpanOrVersusBooleanTerm() throws Exception {
Term t1 = randomTerm(); Term t1 = randomTerm();
Term t2 = randomTerm(); Term t2 = randomTerm();
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(new TermQuery(t1), Occur.SHOULD); q1.add(new TermQuery(t1), Occur.SHOULD);
q1.add(new TermQuery(t2), Occur.SHOULD); q1.add(new TermQuery(t2), Occur.SHOULD);
SpanQuery q2 = spanQuery(new SpanOrQuery(spanQuery(new SpanTermQuery(t1)), spanQuery(new SpanTermQuery(t2)))); SpanQuery q2 = spanQuery(new SpanOrQuery(spanQuery(new SpanTermQuery(t1)), spanQuery(new SpanTermQuery(t2))));
assertSameSet(q1, q2); assertSameSet(q1.build(), q2);
} }
/** SpanOrQuery(SpanNearQuery[A B], SpanNearQuery[C D]) = (SpanNearQuery[A B], SpanNearQuery[C D]) */ /** SpanOrQuery(SpanNearQuery[A B], SpanNearQuery[C D]) = (SpanNearQuery[A B], SpanNearQuery[C D]) */
@ -81,11 +81,11 @@ public class TestSpanSearchEquivalence extends SearchEquivalenceTestBase {
spanQuery(new SpanTermQuery(t3)), spanQuery(new SpanTermQuery(t3)),
spanQuery(new SpanTermQuery(t4)) spanQuery(new SpanTermQuery(t4))
}, 10, random().nextBoolean())); }, 10, random().nextBoolean()));
BooleanQuery q1 = new BooleanQuery(); BooleanQuery.Builder q1 = new BooleanQuery.Builder();
q1.add(near1, Occur.SHOULD); q1.add(near1, Occur.SHOULD);
q1.add(near2, Occur.SHOULD); q1.add(near2, Occur.SHOULD);
SpanQuery q2 = spanQuery(new SpanOrQuery(near1, near2)); SpanQuery q2 = spanQuery(new SpanOrQuery(near1, near2));
assertSameSet(q1, q2); assertSameSet(q1.build(), q2);
} }
/** SpanNotQuery(A, B) ⊆ SpanTermQuery(A) */ /** SpanNotQuery(A, B) ⊆ SpanTermQuery(A) */
@ -166,10 +166,10 @@ public class TestSpanSearchEquivalence extends SearchEquivalenceTestBase {
spanQuery(new SpanTermQuery(t2)) spanQuery(new SpanTermQuery(t2))
}; };
SpanQuery q1 = spanQuery(new SpanNearQuery(subquery, Integer.MAX_VALUE, false)); SpanQuery q1 = spanQuery(new SpanNearQuery(subquery, Integer.MAX_VALUE, false));
BooleanQuery q2 = new BooleanQuery(); BooleanQuery.Builder q2 = new BooleanQuery.Builder();
q2.add(new TermQuery(t1), Occur.MUST); q2.add(new TermQuery(t1), Occur.MUST);
q2.add(new TermQuery(t2), Occur.MUST); q2.add(new TermQuery(t2), Occur.MUST);
assertSameSet(q1, q2); assertSameSet(q1, q2.build());
} }
/** SpanNearQuery([A B], 0, false) ⊆ SpanNearQuery([A B], 1, false) */ /** SpanNearQuery([A B], 0, false) ⊆ SpanNearQuery([A B], 1, false) */

View File

@ -21,7 +21,6 @@ import java.io.IOException;
import org.apache.lucene.document.Field; import org.apache.lucene.document.Field;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.analysis.MockTokenFilter; import org.apache.lucene.analysis.MockTokenFilter;
import org.apache.lucene.analysis.MockTokenizer; import org.apache.lucene.analysis.MockTokenizer;
@ -110,13 +109,13 @@ public class TestSpansAdvanced extends LuceneTestCase {
final float expectedScore) throws IOException { final float expectedScore) throws IOException {
final Query spanQuery = new SpanTermQuery(new Term(FIELD_TEXT, "work")); final Query spanQuery = new SpanTermQuery(new Term(FIELD_TEXT, "work"));
final BooleanQuery query = new BooleanQuery(); final BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(spanQuery, BooleanClause.Occur.MUST); query.add(spanQuery, BooleanClause.Occur.MUST);
query.add(spanQuery, BooleanClause.Occur.MUST); query.add(spanQuery, BooleanClause.Occur.MUST);
final String[] expectedIds = new String[] {"1", "2", "3", "4"}; final String[] expectedIds = new String[] {"1", "2", "3", "4"};
final float[] expectedScores = new float[] {expectedScore, expectedScore, final float[] expectedScores = new float[] {expectedScore, expectedScore,
expectedScore, expectedScore}; expectedScore, expectedScore};
assertHits(s, query, "two span queries", expectedIds, expectedScores); assertHits(s, query.build(), "two span queries", expectedIds, expectedScores);
} }
/** /**

View File

@ -99,14 +99,14 @@ public class TestSpansAdvanced2 extends TestSpansAdvanced {
final Query spanQuery1 = new SpanTermQuery(new Term(FIELD_TEXT, "should")); final Query spanQuery1 = new SpanTermQuery(new Term(FIELD_TEXT, "should"));
final Query spanQuery2 = new SpanTermQuery(new Term(FIELD_TEXT, "we")); final Query spanQuery2 = new SpanTermQuery(new Term(FIELD_TEXT, "we"));
final BooleanQuery query = new BooleanQuery(); final BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(spanQuery1, BooleanClause.Occur.MUST); query.add(spanQuery1, BooleanClause.Occur.MUST);
query.add(spanQuery2, BooleanClause.Occur.MUST); query.add(spanQuery2, BooleanClause.Occur.MUST);
final String[] expectedIds = new String[] {"D", "A"}; final String[] expectedIds = new String[] {"D", "A"};
// these values were pre LUCENE-413 // these values were pre LUCENE-413
// final float[] expectedScores = new float[] { 0.93163157f, 0.20698164f }; // final float[] expectedScores = new float[] { 0.93163157f, 0.20698164f };
final float[] expectedScores = new float[] {1.0191123f, 0.93163157f}; final float[] expectedScores = new float[] {1.0191123f, 0.93163157f};
assertHits(searcher2, query, "multiple different span queries", assertHits(searcher2, query.build(), "multiple different span queries",
expectedIds, expectedScores); expectedIds, expectedScores);
} }

View File

@ -32,6 +32,7 @@ import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.MultiPhraseQuery; import org.apache.lucene.search.MultiPhraseQuery;
import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.automaton.CharacterRunAutomaton; import org.apache.lucene.util.automaton.CharacterRunAutomaton;
import org.apache.lucene.util.automaton.RegExp; import org.apache.lucene.util.automaton.RegExp;
@ -45,19 +46,19 @@ public class TestQueryBuilder extends LuceneTestCase {
} }
public void testBoolean() { public void testBoolean() {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.SHOULD);
expected.add(new TermQuery(new Term("field", "bar")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "bar")), BooleanClause.Occur.SHOULD);
QueryBuilder builder = new QueryBuilder(new MockAnalyzer(random())); QueryBuilder builder = new QueryBuilder(new MockAnalyzer(random()));
assertEquals(expected, builder.createBooleanQuery("field", "foo bar")); assertEquals(expected.build(), builder.createBooleanQuery("field", "foo bar"));
} }
public void testBooleanMust() { public void testBooleanMust() {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST); expected.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST);
expected.add(new TermQuery(new Term("field", "bar")), BooleanClause.Occur.MUST); expected.add(new TermQuery(new Term("field", "bar")), BooleanClause.Occur.MUST);
QueryBuilder builder = new QueryBuilder(new MockAnalyzer(random())); QueryBuilder builder = new QueryBuilder(new MockAnalyzer(random()));
assertEquals(expected, builder.createBooleanQuery("field", "foo bar", BooleanClause.Occur.MUST)); assertEquals(expected.build(), builder.createBooleanQuery("field", "foo bar", BooleanClause.Occur.MUST));
} }
public void testMinShouldMatchNone() { public void testMinShouldMatchNone() {
@ -73,26 +74,30 @@ public class TestQueryBuilder extends LuceneTestCase {
} }
public void testMinShouldMatch() { public void testMinShouldMatch() {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expectedB = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "one")), BooleanClause.Occur.SHOULD); expectedB.add(new TermQuery(new Term("field", "one")), BooleanClause.Occur.SHOULD);
expected.add(new TermQuery(new Term("field", "two")), BooleanClause.Occur.SHOULD); expectedB.add(new TermQuery(new Term("field", "two")), BooleanClause.Occur.SHOULD);
expected.add(new TermQuery(new Term("field", "three")), BooleanClause.Occur.SHOULD); expectedB.add(new TermQuery(new Term("field", "three")), BooleanClause.Occur.SHOULD);
expected.add(new TermQuery(new Term("field", "four")), BooleanClause.Occur.SHOULD); expectedB.add(new TermQuery(new Term("field", "four")), BooleanClause.Occur.SHOULD);
expected.setMinimumNumberShouldMatch(0); expectedB.setMinimumNumberShouldMatch(0);
Query expected = expectedB.build();
QueryBuilder builder = new QueryBuilder(new MockAnalyzer(random())); QueryBuilder builder = new QueryBuilder(new MockAnalyzer(random()));
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.1f)); //assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.1f));
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.24f)); //assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.24f));
expected.setMinimumNumberShouldMatch(1); expectedB.setMinimumNumberShouldMatch(1);
expected = expectedB.build();
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.25f)); assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.25f));
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.49f)); assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.49f));
expected.setMinimumNumberShouldMatch(2); expectedB.setMinimumNumberShouldMatch(2);
expected = expectedB.build();
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.5f)); assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.5f));
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.74f)); assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.74f));
expected.setMinimumNumberShouldMatch(3); expectedB.setMinimumNumberShouldMatch(3);
expected = expectedB.build();
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.75f)); assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.75f));
assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.99f)); assertEquals(expected, builder.createMinShouldMatchQuery("field", "one two three four", 0.99f));
} }
@ -157,9 +162,11 @@ public class TestQueryBuilder extends LuceneTestCase {
/** simple synonyms test */ /** simple synonyms test */
public void testSynonyms() throws Exception { public void testSynonyms() throws Exception {
BooleanQuery expected = new BooleanQuery(true); BooleanQuery.Builder expectedB = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "dogs")), BooleanClause.Occur.SHOULD); expectedB.setDisableCoord(true);
expected.add(new TermQuery(new Term("field", "dog")), BooleanClause.Occur.SHOULD); expectedB.add(new TermQuery(new Term("field", "dogs")), BooleanClause.Occur.SHOULD);
expectedB.add(new TermQuery(new Term("field", "dog")), BooleanClause.Occur.SHOULD);
Query expected = expectedB.build();
QueryBuilder builder = new QueryBuilder(new MockSynonymAnalyzer()); QueryBuilder builder = new QueryBuilder(new MockSynonymAnalyzer());
assertEquals(expected, builder.createBooleanQuery("field", "dogs")); assertEquals(expected, builder.createBooleanQuery("field", "dogs"));
assertEquals(expected, builder.createPhraseQuery("field", "dogs")); assertEquals(expected, builder.createPhraseQuery("field", "dogs"));
@ -205,12 +212,12 @@ public class TestQueryBuilder extends LuceneTestCase {
// individual CJK chars as terms // individual CJK chars as terms
SimpleCJKAnalyzer analyzer = new SimpleCJKAnalyzer(); SimpleCJKAnalyzer analyzer = new SimpleCJKAnalyzer();
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
QueryBuilder builder = new QueryBuilder(analyzer); QueryBuilder builder = new QueryBuilder(analyzer);
assertEquals(expected, builder.createBooleanQuery("field", "中国")); assertEquals(expected.build(), builder.createBooleanQuery("field", "中国"));
} }
public void testCJKPhrase() throws Exception { public void testCJKPhrase() throws Exception {
@ -274,69 +281,76 @@ public class TestQueryBuilder extends LuceneTestCase {
/** simple CJK synonym test */ /** simple CJK synonym test */
public void testCJKSynonym() throws Exception { public void testCJKSynonym() throws Exception {
BooleanQuery expected = new BooleanQuery(true); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.setDisableCoord(true);
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer()); QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer());
assertEquals(expected, builder.createBooleanQuery("field", "")); assertEquals(expected.build(), builder.createBooleanQuery("field", ""));
assertEquals(expected, builder.createPhraseQuery("field", "")); assertEquals(expected.build(), builder.createPhraseQuery("field", ""));
assertEquals(expected, builder.createBooleanQuery("field", "", BooleanClause.Occur.MUST)); assertEquals(expected.build(), builder.createBooleanQuery("field", "", BooleanClause.Occur.MUST));
} }
/** synonyms with default OR operator */ /** synonyms with default OR operator */
public void testCJKSynonymsOR() throws Exception { public void testCJKSynonymsOR() throws Exception {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
BooleanQuery inner = new BooleanQuery(true); BooleanQuery.Builder inner = new BooleanQuery.Builder();
inner.setDisableCoord(true);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(inner, BooleanClause.Occur.SHOULD); expected.add(inner.build(), BooleanClause.Occur.SHOULD);
QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer()); QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer());
assertEquals(expected, builder.createBooleanQuery("field", "中国")); assertEquals(expected.build(), builder.createBooleanQuery("field", "中国"));
} }
/** more complex synonyms with default OR operator */ /** more complex synonyms with default OR operator */
public void testCJKSynonymsOR2() throws Exception { public void testCJKSynonymsOR2() throws Exception {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
BooleanQuery inner = new BooleanQuery(true); BooleanQuery.Builder inner = new BooleanQuery.Builder();
inner.setDisableCoord(true);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(inner, BooleanClause.Occur.SHOULD); expected.add(inner.build(), BooleanClause.Occur.SHOULD);
BooleanQuery inner2 = new BooleanQuery(true); BooleanQuery.Builder inner2 = new BooleanQuery.Builder();
inner2.setDisableCoord(true);
inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(inner2, BooleanClause.Occur.SHOULD); expected.add(inner2.build(), BooleanClause.Occur.SHOULD);
QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer()); QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer());
assertEquals(expected, builder.createBooleanQuery("field", "中国国")); assertEquals(expected.build(), builder.createBooleanQuery("field", "中国国"));
} }
/** synonyms with default AND operator */ /** synonyms with default AND operator */
public void testCJKSynonymsAND() throws Exception { public void testCJKSynonymsAND() throws Exception {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.MUST); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.MUST);
BooleanQuery inner = new BooleanQuery(true); BooleanQuery.Builder inner = new BooleanQuery.Builder();
inner.setDisableCoord(true);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(inner, BooleanClause.Occur.MUST); expected.add(inner.build(), BooleanClause.Occur.MUST);
QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer()); QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer());
assertEquals(expected, builder.createBooleanQuery("field", "中国", BooleanClause.Occur.MUST)); assertEquals(expected.build(), builder.createBooleanQuery("field", "中国", BooleanClause.Occur.MUST));
} }
/** more complex synonyms with default AND operator */ /** more complex synonyms with default AND operator */
public void testCJKSynonymsAND2() throws Exception { public void testCJKSynonymsAND2() throws Exception {
BooleanQuery expected = new BooleanQuery(); BooleanQuery.Builder expected = new BooleanQuery.Builder();
expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.MUST); expected.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.MUST);
BooleanQuery inner = new BooleanQuery(true); BooleanQuery.Builder inner = new BooleanQuery.Builder();
inner.setDisableCoord(true);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(inner, BooleanClause.Occur.MUST); expected.add(inner.build(), BooleanClause.Occur.MUST);
BooleanQuery inner2 = new BooleanQuery(true); BooleanQuery.Builder inner2 = new BooleanQuery.Builder();
inner2.setDisableCoord(true);
inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD); inner2.add(new TermQuery(new Term("field", "")), BooleanClause.Occur.SHOULD);
expected.add(inner2, BooleanClause.Occur.MUST); expected.add(inner2.build(), BooleanClause.Occur.MUST);
QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer()); QueryBuilder builder = new QueryBuilder(new MockCJKSynonymAnalyzer());
assertEquals(expected, builder.createBooleanQuery("field", "中国国", BooleanClause.Occur.MUST)); assertEquals(expected.build(), builder.createBooleanQuery("field", "中国国", BooleanClause.Occur.MUST));
} }
/** forms multiphrase query */ /** forms multiphrase query */

View File

@ -180,7 +180,7 @@ public class DistanceFacetsExample implements Closeable {
maxLng = Math.toRadians(180); maxLng = Math.toRadians(180);
} }
BooleanQuery f = new BooleanQuery(); BooleanQuery.Builder f = new BooleanQuery.Builder();
// Add latitude range filter: // Add latitude range filter:
f.add(NumericRangeQuery.newDoubleRange("latitude", Math.toDegrees(minLat), Math.toDegrees(maxLat), true, true), f.add(NumericRangeQuery.newDoubleRange("latitude", Math.toDegrees(minLat), Math.toDegrees(maxLat), true, true),
@ -190,18 +190,18 @@ public class DistanceFacetsExample implements Closeable {
if (minLng > maxLng) { if (minLng > maxLng) {
// The bounding box crosses the international date // The bounding box crosses the international date
// line: // line:
BooleanQuery lonF = new BooleanQuery(); BooleanQuery.Builder lonF = new BooleanQuery.Builder();
lonF.add(NumericRangeQuery.newDoubleRange("longitude", Math.toDegrees(minLng), null, true, true), lonF.add(NumericRangeQuery.newDoubleRange("longitude", Math.toDegrees(minLng), null, true, true),
BooleanClause.Occur.SHOULD); BooleanClause.Occur.SHOULD);
lonF.add(NumericRangeQuery.newDoubleRange("longitude", null, Math.toDegrees(maxLng), true, true), lonF.add(NumericRangeQuery.newDoubleRange("longitude", null, Math.toDegrees(maxLng), true, true),
BooleanClause.Occur.SHOULD); BooleanClause.Occur.SHOULD);
f.add(lonF, BooleanClause.Occur.MUST); f.add(lonF.build(), BooleanClause.Occur.MUST);
} else { } else {
f.add(NumericRangeQuery.newDoubleRange("longitude", Math.toDegrees(minLng), Math.toDegrees(maxLng), true, true), f.add(NumericRangeQuery.newDoubleRange("longitude", Math.toDegrees(minLng), Math.toDegrees(maxLng), true, true),
BooleanClause.Occur.FILTER); BooleanClause.Occur.FILTER);
} }
return new QueryWrapperFilter(f); return new QueryWrapperFilter(f.build());
} }
/** User runs a query and counts facets. */ /** User runs a query and counts facets. */

View File

@ -88,14 +88,14 @@ public class TestExpressionSorts extends LuceneTestCase {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
assertQuery(new MatchAllDocsQuery()); assertQuery(new MatchAllDocsQuery());
assertQuery(new TermQuery(new Term("english", "one"))); assertQuery(new TermQuery(new Term("english", "one")));
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(new Term("english", "one")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("english", "one")), BooleanClause.Occur.SHOULD);
bq.add(new TermQuery(new Term("oddeven", "even")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("oddeven", "even")), BooleanClause.Occur.SHOULD);
assertQuery(bq); assertQuery(bq.build());
// force in order // force in order
bq.add(new TermQuery(new Term("english", "two")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new Term("english", "two")), BooleanClause.Occur.SHOULD);
bq.setMinimumNumberShouldMatch(2); bq.setMinimumNumberShouldMatch(2);
assertQuery(bq); assertQuery(bq.build());
} }
} }

View File

@ -22,11 +22,11 @@ import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.ConstantScoreQuery; import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.Filter; import org.apache.lucene.search.Filter;
@ -55,43 +55,23 @@ public final class DrillDownQuery extends Query {
} }
private final FacetsConfig config; private final FacetsConfig config;
private final BooleanQuery query; private final Query baseQuery;
private final List<BooleanQuery.Builder> dimQueries = new ArrayList<>();
private final Map<String,Integer> drillDownDims = new LinkedHashMap<>(); private final Map<String,Integer> drillDownDims = new LinkedHashMap<>();
/** Used by clone() */ /** Used by clone() and DrillSideways */
DrillDownQuery(FacetsConfig config, BooleanQuery query, Map<String,Integer> drillDownDims) { DrillDownQuery(FacetsConfig config, Query baseQuery, List<BooleanQuery.Builder> dimQueries, Map<String,Integer> drillDownDims) {
this.query = query.clone(); this.baseQuery = baseQuery;
this.dimQueries.addAll(dimQueries);
this.drillDownDims.putAll(drillDownDims); this.drillDownDims.putAll(drillDownDims);
this.config = config; this.config = config;
} }
/** Used by DrillSideways */ /** Used by DrillSideways */
DrillDownQuery(FacetsConfig config, Filter filter, DrillDownQuery other) { DrillDownQuery(FacetsConfig config, Filter filter, DrillDownQuery other) {
query = new BooleanQuery(true); // disable coord this.baseQuery = new FilteredQuery(other.baseQuery == null ? new MatchAllDocsQuery() : other.baseQuery, filter);
this.dimQueries.addAll(other.dimQueries);
BooleanClause[] clauses = other.query.getClauses(); this.drillDownDims.putAll(other.drillDownDims);
if (clauses.length == other.drillDownDims.size()) {
throw new IllegalArgumentException("cannot apply filter unless baseQuery isn't null; pass ConstantScoreQuery instead");
}
assert clauses.length == 1+other.drillDownDims.size(): clauses.length + " vs " + (1+other.drillDownDims.size());
drillDownDims.putAll(other.drillDownDims);
query.add(new FilteredQuery(clauses[0].getQuery(), filter), Occur.MUST);
for(int i=1;i<clauses.length;i++) {
query.add(clauses[i].getQuery(), Occur.MUST);
}
this.config = config;
}
/** Used by DrillSideways */
DrillDownQuery(FacetsConfig config, Query baseQuery, List<Query> clauses, Map<String,Integer> drillDownDims) {
query = new BooleanQuery(true);
if (baseQuery != null) {
query.add(baseQuery, Occur.MUST);
}
for(Query clause : clauses) {
query.add(clause, Occur.MUST);
}
this.drillDownDims.putAll(drillDownDims);
this.config = config; this.config = config;
} }
@ -107,88 +87,32 @@ public final class DrillDownQuery extends Query {
* {@link #rewrite(IndexReader)} will be a pure browsing query, filtering on * {@link #rewrite(IndexReader)} will be a pure browsing query, filtering on
* the added categories only. */ * the added categories only. */
public DrillDownQuery(FacetsConfig config, Query baseQuery) { public DrillDownQuery(FacetsConfig config, Query baseQuery) {
query = new BooleanQuery(true); // disable coord this.baseQuery = baseQuery;
if (baseQuery != null) {
query.add(baseQuery, Occur.MUST);
}
this.config = config; this.config = config;
} }
/** Merges (ORs) a new path into an existing AND'd
* clause. */
private void merge(String dim, String[] path) {
int index = drillDownDims.get(dim);
if (query.getClauses().length == drillDownDims.size()+1) {
index++;
}
ConstantScoreQuery q = (ConstantScoreQuery) query.clauses().get(index).getQuery();
if ((q.getQuery() instanceof BooleanQuery) == false) {
// App called .add(dim, customQuery) and then tried to
// merge a facet label in:
throw new RuntimeException("cannot merge with custom Query");
}
String indexedField = config.getDimConfig(dim).indexFieldName;
BooleanQuery bq = (BooleanQuery) q.getQuery();
bq.add(new TermQuery(term(indexedField, dim, path)), Occur.SHOULD);
}
/** Adds one dimension of drill downs; if you pass the same /** Adds one dimension of drill downs; if you pass the same
* dimension more than once it is OR'd with the previous * dimension more than once it is OR'd with the previous
* cofnstraints on that dimension, and all dimensions are * cofnstraints on that dimension, and all dimensions are
* AND'd against each other and the base query. */ * AND'd against each other and the base query. */
public void add(String dim, String... path) { public void add(String dim, String... path) {
if (drillDownDims.containsKey(dim)) {
merge(dim, path);
return;
}
String indexedField = config.getDimConfig(dim).indexFieldName; String indexedField = config.getDimConfig(dim).indexFieldName;
add(dim, new TermQuery(term(indexedField, dim, path)));
BooleanQuery bq = new BooleanQuery(true); // disable coord
bq.add(new TermQuery(term(indexedField, dim, path)), Occur.SHOULD);
add(dim, bq);
} }
/** Expert: add a custom drill-down subQuery. Use this /** Expert: add a custom drill-down subQuery. Use this
* when you have a separate way to drill-down on the * when you have a separate way to drill-down on the
* dimension than the indexed facet ordinals. */ * dimension than the indexed facet ordinals. */
public void add(String dim, Query subQuery) { public void add(String dim, Query subQuery) {
assert drillDownDims.size() == dimQueries.size();
if (drillDownDims.containsKey(dim)) { if (drillDownDims.containsKey(dim) == false) {
throw new IllegalArgumentException("dimension \"" + dim + "\" already has a drill-down");
}
// TODO: we should use FilteredQuery?
// So scores of the drill-down query don't have an
// effect:
final ConstantScoreQuery drillDownQuery = new ConstantScoreQuery(subQuery);
drillDownQuery.setBoost(0.0f);
query.add(drillDownQuery, Occur.MUST);
drillDownDims.put(dim, drillDownDims.size()); drillDownDims.put(dim, drillDownDims.size());
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.setDisableCoord(true);
dimQueries.add(builder);
} }
final int index = drillDownDims.get(dim);
/** Expert: add a custom drill-down Filter, e.g. when dimQueries.get(index).add(subQuery, Occur.SHOULD);
* drilling down after range faceting. */
public void add(String dim, Filter subFilter) {
if (drillDownDims.containsKey(dim)) {
throw new IllegalArgumentException("dimension \"" + dim + "\" already has a drill-down");
}
// TODO: we should use FilteredQuery?
// So scores of the drill-down query don't have an
// effect:
final ConstantScoreQuery drillDownQuery = new ConstantScoreQuery(subFilter);
drillDownQuery.setBoost(0.0f);
query.add(drillDownQuery, Occur.MUST);
drillDownDims.put(dim, drillDownDims.size());
} }
static Filter getFilter(Query query) { static Filter getFilter(Query query) {
@ -207,97 +131,59 @@ public final class DrillDownQuery extends Query {
@Override @Override
public DrillDownQuery clone() { public DrillDownQuery clone() {
return new DrillDownQuery(config, query, drillDownDims); return new DrillDownQuery(config, baseQuery, dimQueries, drillDownDims);
} }
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; return 31 * super.hashCode() + Objects.hash(baseQuery, dimQueries);
int result = super.hashCode();
return prime * result + query.hashCode();
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (!(obj instanceof DrillDownQuery)) { if (super.equals(obj) == false) {
return false; return false;
} }
DrillDownQuery other = (DrillDownQuery) obj; DrillDownQuery other = (DrillDownQuery) obj;
return query.equals(other.query) && super.equals(other); return Objects.equals(baseQuery, other.baseQuery)
&& dimQueries.equals(other.dimQueries);
} }
@Override @Override
public Query rewrite(IndexReader r) throws IOException { public Query rewrite(IndexReader r) throws IOException {
if (query.clauses().size() == 0) { BooleanQuery rewritten = getBooleanQuery();
if (rewritten.clauses().isEmpty()) {
return new MatchAllDocsQuery(); return new MatchAllDocsQuery();
} }
return rewritten;
List<Filter> filters = new ArrayList<>();
List<Query> queries = new ArrayList<>();
List<BooleanClause> clauses = query.clauses();
Query baseQuery;
int startIndex;
if (drillDownDims.size() == query.clauses().size()) {
baseQuery = new MatchAllDocsQuery();
startIndex = 0;
} else {
baseQuery = clauses.get(0).getQuery();
startIndex = 1;
}
for(int i=startIndex;i<clauses.size();i++) {
BooleanClause clause = clauses.get(i);
Query queryClause = clause.getQuery();
Filter filter = getFilter(queryClause);
if (filter != null) {
filters.add(filter);
} else {
queries.add(queryClause);
}
}
if (filters.isEmpty()) {
return query;
} else {
// Wrap all filters using FilteredQuery
// TODO: this is hackish; we need to do it because
// BooleanQuery can't be trusted to handle the
// "expensive filter" case. Really, each Filter should
// know its cost and we should take that more
// carefully into account when picking the right
// strategy/optimization:
Query wrapped;
if (queries.isEmpty()) {
wrapped = baseQuery;
} else {
// disable coord
BooleanQuery wrappedBQ = new BooleanQuery(true);
if ((baseQuery instanceof MatchAllDocsQuery) == false) {
wrappedBQ.add(baseQuery, BooleanClause.Occur.MUST);
}
for(Query q : queries) {
wrappedBQ.add(q, BooleanClause.Occur.MUST);
}
wrapped = wrappedBQ;
}
for(Filter filter : filters) {
wrapped = new FilteredQuery(wrapped, filter, FilteredQuery.QUERY_FIRST_FILTER_STRATEGY);
}
return wrapped;
}
} }
@Override @Override
public String toString(String field) { public String toString(String field) {
return query.toString(field); return getBooleanQuery().toString(field);
} }
BooleanQuery getBooleanQuery() { private BooleanQuery getBooleanQuery() {
return query; BooleanQuery.Builder bq = new BooleanQuery.Builder();
if (baseQuery != null) {
bq.add(baseQuery, Occur.MUST);
}
for (BooleanQuery.Builder builder : dimQueries) {
bq.add(builder.build(), Occur.FILTER);
}
return bq.build();
}
Query getBaseQuery() {
return baseQuery;
}
Query[] getDrillDownQueries() {
Query[] dimQueries = new Query[this.dimQueries.size()];
for (int i = 0; i < dimQueries.length; ++i) {
dimQueries[i] = this.dimQueries.get(i).build();
}
return dimQueries;
} }
Map<String,Integer> getDims() { Map<String,Integer> getDims() {

View File

@ -27,9 +27,6 @@ import org.apache.lucene.facet.sortedset.SortedSetDocValuesReaderState;
import org.apache.lucene.facet.taxonomy.FastTaxonomyFacetCounts; import org.apache.lucene.facet.taxonomy.FastTaxonomyFacetCounts;
import org.apache.lucene.facet.taxonomy.TaxonomyReader; import org.apache.lucene.facet.taxonomy.TaxonomyReader;
import org.apache.lucene.search.FilterCollector; import org.apache.lucene.search.FilterCollector;
import org.apache.lucene.search.LeafCollector;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Collector; import org.apache.lucene.search.Collector;
import org.apache.lucene.search.FieldDoc; import org.apache.lucene.search.FieldDoc;
import org.apache.lucene.search.Filter; import org.apache.lucene.search.Filter;
@ -134,7 +131,6 @@ public class DrillSideways {
* Search, collecting hits with a {@link Collector}, and * Search, collecting hits with a {@link Collector}, and
* computing drill down and sideways counts. * computing drill down and sideways counts.
*/ */
@SuppressWarnings({"rawtypes","unchecked"})
public DrillSidewaysResult search(DrillDownQuery query, Collector hitCollector) throws IOException { public DrillSidewaysResult search(DrillDownQuery query, Collector hitCollector) throws IOException {
Map<String,Integer> drillDownDims = query.getDims(); Map<String,Integer> drillDownDims = query.getDims();
@ -148,31 +144,19 @@ public class DrillSideways {
return new DrillSidewaysResult(buildFacetsResult(drillDownCollector, null, null), null); return new DrillSidewaysResult(buildFacetsResult(drillDownCollector, null, null), null);
} }
BooleanQuery ddq = query.getBooleanQuery(); Query baseQuery = query.getBaseQuery();
BooleanClause[] clauses = ddq.getClauses(); if (baseQuery == null) {
Query baseQuery;
int startClause;
if (clauses.length == drillDownDims.size()) {
// TODO: we could optimize this pure-browse case by // TODO: we could optimize this pure-browse case by
// making a custom scorer instead: // making a custom scorer instead:
baseQuery = new MatchAllDocsQuery(); baseQuery = new MatchAllDocsQuery();
startClause = 0;
} else {
assert clauses.length == 1+drillDownDims.size();
baseQuery = clauses[0].getQuery();
startClause = 1;
} }
Query[] drillDownQueries = query.getDrillDownQueries();
FacetsCollector[] drillSidewaysCollectors = new FacetsCollector[drillDownDims.size()]; FacetsCollector[] drillSidewaysCollectors = new FacetsCollector[drillDownDims.size()];
for (int i = 0; i < drillSidewaysCollectors.length; i++) { for (int i = 0; i < drillSidewaysCollectors.length; i++) {
drillSidewaysCollectors[i] = new FacetsCollector(); drillSidewaysCollectors[i] = new FacetsCollector();
} }
Query[] drillDownQueries = new Query[clauses.length-startClause];
for(int i=startClause;i<clauses.length;i++) {
drillDownQueries[i-startClause] = clauses[i].getQuery();
}
DrillSidewaysQuery dsq = new DrillSidewaysQuery(baseQuery, drillDownCollector, drillSidewaysCollectors, drillDownQueries, scoreSubDocsAtOnce()); DrillSidewaysQuery dsq = new DrillSidewaysQuery(baseQuery, drillDownCollector, drillSidewaysCollectors, drillDownQueries, scoreSubDocsAtOnce());
if (hitCollector.needsScores() == false) { if (hitCollector.needsScores() == false) {
// this is a borrible hack in order to make sure IndexSearcher will not // this is a borrible hack in order to make sure IndexSearcher will not

View File

@ -18,6 +18,7 @@ package org.apache.lucene.facet;
*/ */
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReader;
@ -47,7 +48,7 @@ class DrillSidewaysQuery extends Query {
final boolean scoreSubDocsAtOnce; final boolean scoreSubDocsAtOnce;
DrillSidewaysQuery(Query baseQuery, Collector drillDownCollector, Collector[] drillSidewaysCollectors, Query[] drillDownQueries, boolean scoreSubDocsAtOnce) { DrillSidewaysQuery(Query baseQuery, Collector drillDownCollector, Collector[] drillSidewaysCollectors, Query[] drillDownQueries, boolean scoreSubDocsAtOnce) {
this.baseQuery = baseQuery; this.baseQuery = Objects.requireNonNull(baseQuery);
this.drillDownCollector = drillDownCollector; this.drillDownCollector = drillDownCollector;
this.drillSidewaysCollectors = drillSidewaysCollectors; this.drillSidewaysCollectors = drillSidewaysCollectors;
this.drillDownQueries = drillDownQueries; this.drillDownQueries = drillDownQueries;

View File

@ -240,6 +240,6 @@ public class TestDrillDownQuery extends FacetTestCase {
Query base = new MatchAllDocsQuery(); Query base = new MatchAllDocsQuery();
DrillDownQuery q = new DrillDownQuery(config, base); DrillDownQuery q = new DrillDownQuery(config, base);
Query rewrite = q.rewrite(reader).rewrite(reader); Query rewrite = q.rewrite(reader).rewrite(reader);
assertSame(base, rewrite); assertEquals(base, rewrite);
} }
} }

View File

@ -1107,13 +1107,14 @@ public class TestDrillSideways extends FacetTestCase {
DrillSideways ds = new DrillSideways(searcher, config, taxoReader); DrillSideways ds = new DrillSideways(searcher, config, taxoReader);
BooleanQuery bq = new BooleanQuery(true); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.setDisableCoord(true);
bq.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term("field", "bar")), BooleanClause.Occur.MUST_NOT); bq.add(new TermQuery(new Term("field", "bar")), BooleanClause.Occur.MUST_NOT);
DrillDownQuery ddq = new DrillDownQuery(config, bq); DrillDownQuery ddq = new DrillDownQuery(config, bq.build());
ddq.add("field", "foo"); ddq.add("field", "foo");
ddq.add("author", bq); ddq.add("author", bq.build());
ddq.add("dim", bq); ddq.add("dim", bq.build());
DrillSidewaysResult r = ds.search(null, ddq, 10); DrillSidewaysResult r = ds.search(null, ddq, 10);
assertEquals(0, r.hits.totalHits); assertEquals(0, r.hits.totalHits);

View File

@ -157,11 +157,10 @@ public final class QueryTermExtractor
*/ */
private static final void getTermsFromBooleanQuery(BooleanQuery query, HashSet<WeightedTerm> terms, boolean prohibited, String fieldName) private static final void getTermsFromBooleanQuery(BooleanQuery query, HashSet<WeightedTerm> terms, boolean prohibited, String fieldName)
{ {
BooleanClause[] queryClauses = query.getClauses(); for (BooleanClause clause : query)
for (int i = 0; i < queryClauses.length; i++)
{ {
if (prohibited || queryClauses[i].getOccur()!=BooleanClause.Occur.MUST_NOT) if (prohibited || clause.getOccur()!=BooleanClause.Occur.MUST_NOT)
getTerms(queryClauses[i].getQuery(), terms, prohibited, fieldName); getTerms(clause.getQuery(), terms, prohibited, fieldName);
} }
} }
private static void getTermsFromFilteredQuery(FilteredQuery query, HashSet<WeightedTerm> terms, boolean prohibited, String fieldName) private static void getTermsFromFilteredQuery(FilteredQuery query, HashSet<WeightedTerm> terms, boolean prohibited, String fieldName)

View File

@ -106,11 +106,9 @@ public class WeightedSpanTermExtractor {
*/ */
protected void extract(Query query, Map<String,WeightedSpanTerm> terms) throws IOException { protected void extract(Query query, Map<String,WeightedSpanTerm> terms) throws IOException {
if (query instanceof BooleanQuery) { if (query instanceof BooleanQuery) {
BooleanClause[] queryClauses = ((BooleanQuery) query).getClauses(); for (BooleanClause clause : (BooleanQuery) query) {
if (!clause.isProhibited()) {
for (int i = 0; i < queryClauses.length; i++) { extract(clause.getQuery(), terms);
if (!queryClauses[i].isProhibited()) {
extract(queryClauses[i].getQuery(), terms);
} }
} }
} else if (query instanceof PhraseQuery) { } else if (query instanceof PhraseQuery) {

View File

@ -64,8 +64,7 @@ class MultiTermHighlighting {
static CharacterRunAutomaton[] extractAutomata(Query query, String field) { static CharacterRunAutomaton[] extractAutomata(Query query, String field) {
List<CharacterRunAutomaton> list = new ArrayList<>(); List<CharacterRunAutomaton> list = new ArrayList<>();
if (query instanceof BooleanQuery) { if (query instanceof BooleanQuery) {
BooleanClause clauses[] = ((BooleanQuery) query).getClauses(); for (BooleanClause clause : (BooleanQuery) query) {
for (BooleanClause clause : clauses) {
if (!clause.isProhibited()) { if (!clause.isProhibited()) {
list.addAll(Arrays.asList(extractAutomata(clause.getQuery(), field))); list.addAll(Arrays.asList(extractAutomata(clause.getQuery(), field)));
} }

View File

@ -310,7 +310,7 @@ public class FieldQuery {
} }
else if (query instanceof MultiTermQuery && reader != null) { else if (query instanceof MultiTermQuery && reader != null) {
BooleanQuery mtqTerms = (BooleanQuery) query.rewrite(reader); BooleanQuery mtqTerms = (BooleanQuery) query.rewrite(reader);
for (BooleanClause clause : mtqTerms.getClauses()) { for (BooleanClause clause : mtqTerms) {
termSet.add (((TermQuery) clause.getQuery()).getTerm().text()); termSet.add (((TermQuery) clause.getQuery()).getTerm().text());
} }
} }

View File

@ -364,18 +364,18 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
PhraseQuery f2ph2 = new PhraseQuery(f2, "b", "c", "g"); PhraseQuery f2ph2 = new PhraseQuery(f2, "b", "c", "g");
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
BooleanQuery leftChild = new BooleanQuery(); BooleanQuery.Builder leftChild = new BooleanQuery.Builder();
leftChild.add(f1ph1, Occur.SHOULD); leftChild.add(f1ph1, Occur.SHOULD);
leftChild.add(f2ph1, Occur.SHOULD); leftChild.add(f2ph1, Occur.SHOULD);
booleanQuery.add(leftChild, Occur.MUST); booleanQuery.add(leftChild.build(), Occur.MUST);
BooleanQuery rightChild = new BooleanQuery(); BooleanQuery.Builder rightChild = new BooleanQuery.Builder();
rightChild.add(f1ph2, Occur.SHOULD); rightChild.add(f1ph2, Occur.SHOULD);
rightChild.add(f2ph2, Occur.SHOULD); rightChild.add(f2ph2, Occur.SHOULD);
booleanQuery.add(rightChild, Occur.MUST); booleanQuery.add(rightChild.build(), Occur.MUST);
QueryScorer scorer = new QueryScorer(booleanQuery, f1); QueryScorer scorer = new QueryScorer(booleanQuery.build(), f1);
scorer.setExpandMultiTermQuery(false); scorer.setExpandMultiTermQuery(false);
Highlighter h = new Highlighter(this, scorer); Highlighter h = new Highlighter(this, scorer);
@ -617,11 +617,11 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
new QueryWrapperFilter( new QueryWrapperFilter(
new TermQuery(new Term(FIELD_NAME, "parent")))); new TermQuery(new Term(FIELD_NAME, "parent"))));
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new ToChildBlockJoinQuery(new TermQuery( booleanQuery.add(new ToChildBlockJoinQuery(new TermQuery(
new Term(FIELD_NAME, "parent")), parentFilter), Occur.MUST); new Term(FIELD_NAME, "parent")), parentFilter), Occur.MUST);
booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "child")), Occur.MUST); booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "child")), Occur.MUST);
query = booleanQuery; query = booleanQuery.build();
searcher = newSearcher(reader); searcher = newSearcher(reader);
hits = searcher.search(query, 100); hits = searcher.search(query, 100);
@ -745,13 +745,13 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
// position sensitive query added after position insensitive query // position sensitive query added after position insensitive query
public void testPosTermStdTerm() throws Exception { public void testPosTermStdTerm() throws Exception {
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "y")), Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "y")), Occur.SHOULD);
PhraseQuery phraseQuery = new PhraseQuery(FIELD_NAME, "x", "y", "z"); PhraseQuery phraseQuery = new PhraseQuery(FIELD_NAME, "x", "y", "z");
booleanQuery.add(phraseQuery, Occur.SHOULD); booleanQuery.add(phraseQuery, Occur.SHOULD);
doSearching(booleanQuery); doSearching(booleanQuery.build());
int maxNumFragmentsRequired = 2; int maxNumFragmentsRequired = 2;
@ -852,10 +852,10 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
Query query2 = new SpanNearQuery(new SpanQuery[] { Query query2 = new SpanNearQuery(new SpanQuery[] {
new SpanTermQuery(new Term(FIELD_NAME, "wordy")), new SpanTermQuery(new Term(FIELD_NAME, "wordy")),
new SpanTermQuery(new Term(FIELD_NAME, "wordc")) }, 1, false); new SpanTermQuery(new Term(FIELD_NAME, "wordc")) }, 1, false);
BooleanQuery bquery = new BooleanQuery(); BooleanQuery.Builder bquery = new BooleanQuery.Builder();
bquery.add(query1, Occur.SHOULD); bquery.add(query1, Occur.SHOULD);
bquery.add(query2, Occur.SHOULD); bquery.add(query2, Occur.SHOULD);
doSearching(bquery); doSearching(bquery.build());
TestHighlightRunner helper = new TestHighlightRunner() { TestHighlightRunner helper = new TestHighlightRunner() {
@Override @Override
@ -912,11 +912,11 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
public void run() throws Exception { public void run() throws Exception {
numHighlights = 0; numHighlights = 0;
if (random().nextBoolean()) { if (random().nextBoolean()) {
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new ConstantScoreQuery(new QueryWrapperFilter(new TermQuery( bq.add(new ConstantScoreQuery(new QueryWrapperFilter(new TermQuery(
new Term(FIELD_NAME, "kennedy")))), Occur.MUST); new Term(FIELD_NAME, "kennedy")))), Occur.MUST);
bq.add(new ConstantScoreQuery(new TermQuery(new Term(FIELD_NAME, "kennedy"))), Occur.MUST); bq.add(new ConstantScoreQuery(new TermQuery(new Term(FIELD_NAME, "kennedy"))), Occur.MUST);
doSearching(bq); doSearching(bq.build());
} else { } else {
doSearching(new ConstantScoreQuery(new TermQuery(new Term(FIELD_NAME, doSearching(new ConstantScoreQuery(new TermQuery(new Term(FIELD_NAME,
"kennedy")))); "kennedy"))));
@ -1166,11 +1166,11 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
SpanQuery clauses[] = { new SpanTermQuery(new Term("contents", "john")), SpanQuery clauses[] = { new SpanTermQuery(new Term("contents", "john")),
new SpanTermQuery(new Term("contents", "kennedy")), }; new SpanTermQuery(new Term("contents", "kennedy")), };
SpanNearQuery snq = new SpanNearQuery(clauses, 1, true); SpanNearQuery snq = new SpanNearQuery(clauses, 1, true);
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(snq, Occur.MUST); bq.add(snq, Occur.MUST);
bq.add(TermRangeQuery.newStringRange("contents", "john", "john", true, true), Occur.FILTER); bq.add(TermRangeQuery.newStringRange("contents", "john", "john", true, true), Occur.FILTER);
doSearching(bq); doSearching(bq.build());
doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this); doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this);
// Currently highlights "John" and "Kennedy" separately // Currently highlights "John" and "Kennedy" separately
assertTrue("Failed to find correct number of highlights " + numHighlights + " found", assertTrue("Failed to find correct number of highlights " + numHighlights + " found",
@ -1188,11 +1188,11 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
public void run() throws Exception { public void run() throws Exception {
numHighlights = 0; numHighlights = 0;
PhraseQuery pq = new PhraseQuery("contents", "john", "kennedy"); PhraseQuery pq = new PhraseQuery("contents", "john", "kennedy");
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(pq, Occur.MUST); bq.add(pq, Occur.MUST);
bq.add(TermRangeQuery.newStringRange("contents", "john", "john", true, true), Occur.FILTER); bq.add(TermRangeQuery.newStringRange("contents", "john", "john", true, true), Occur.FILTER);
doSearching(bq); doSearching(bq.build());
doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this); doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this);
// Currently highlights "John" and "Kennedy" separately // Currently highlights "John" and "Kennedy" separately
assertTrue("Failed to find correct number of highlights " + numHighlights + " found", assertTrue("Failed to find correct number of highlights " + numHighlights + " found",
@ -1209,13 +1209,13 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
@Override @Override
public void run() throws Exception { public void run() throws Exception {
numHighlights = 0; numHighlights = 0;
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "john")), Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(FIELD_NAME, "john")), Occur.SHOULD);
PrefixQuery prefixQuery = new PrefixQuery(new Term(FIELD_NAME, "kenn")); PrefixQuery prefixQuery = new PrefixQuery(new Term(FIELD_NAME, "kenn"));
prefixQuery.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_REWRITE); prefixQuery.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_REWRITE);
booleanQuery.add(prefixQuery, Occur.SHOULD); booleanQuery.add(prefixQuery, Occur.SHOULD);
doSearching(booleanQuery); doSearching(booleanQuery.build());
doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this); doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this);
assertTrue("Failed to find correct number of highlights " + numHighlights + " found", assertTrue("Failed to find correct number of highlights " + numHighlights + " found",
numHighlights == 5); numHighlights == 5);
@ -1232,12 +1232,12 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
public void run() throws Exception { public void run() throws Exception {
numHighlights = 0; numHighlights = 0;
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD_NAME, "jfk")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD_NAME, "jfk")), Occur.SHOULD);
query.add(new TermQuery(new Term(FIELD_NAME, "kennedy")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD_NAME, "kennedy")), Occur.SHOULD);
doSearching(query); doSearching(query.build());
doStandardHighlights(analyzer, searcher, hits, query, HighlighterTest.this); doStandardHighlights(analyzer, searcher, hits, query.build(), HighlighterTest.this);
assertTrue("Failed to find correct number of highlights " + numHighlights + " found", assertTrue("Failed to find correct number of highlights " + numHighlights + " found",
numHighlights == 5); numHighlights == 5);
} }
@ -1361,12 +1361,12 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
String s = "football-soccer in the euro 2004 footie competition"; String s = "football-soccer in the euro 2004 footie competition";
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("bookid", "football")), Occur.SHOULD); query.add(new TermQuery(new Term("bookid", "football")), Occur.SHOULD);
query.add(new TermQuery(new Term("bookid", "soccer")), Occur.SHOULD); query.add(new TermQuery(new Term("bookid", "soccer")), Occur.SHOULD);
query.add(new TermQuery(new Term("bookid", "footie")), Occur.SHOULD); query.add(new TermQuery(new Term("bookid", "footie")), Occur.SHOULD);
Highlighter highlighter = getHighlighter(query, null, HighlighterTest.this); Highlighter highlighter = getHighlighter(query.build(), null, HighlighterTest.this);
// Get 3 best fragments and separate with a "..." // Get 3 best fragments and separate with a "..."
TokenStream tokenStream = analyzer.tokenStream(null, s); TokenStream tokenStream = analyzer.tokenStream(null, s);
@ -1552,14 +1552,14 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
// test to show how rewritten query can still be used // test to show how rewritten query can still be used
searcher = newSearcher(reader); searcher = newSearcher(reader);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new WildcardQuery(new Term(FIELD_NAME, "jf?")), Occur.SHOULD); query.add(new WildcardQuery(new Term(FIELD_NAME, "jf?")), Occur.SHOULD);
query.add(new WildcardQuery(new Term(FIELD_NAME, "kenned*")), Occur.SHOULD); query.add(new WildcardQuery(new Term(FIELD_NAME, "kenned*")), Occur.SHOULD);
if (VERBOSE) System.out.println("Searching with primitive query"); if (VERBOSE) System.out.println("Searching with primitive query");
// forget to set this and... // forget to set this and...
// query=query.rewrite(reader); // query=query.rewrite(reader);
TopDocs hits = searcher.search(query, 1000); TopDocs hits = searcher.search(query.build(), 1000);
// create an instance of the highlighter with the tags used to surround // create an instance of the highlighter with the tags used to surround
// highlighted text // highlighted text
@ -1574,7 +1574,7 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
final StoredDocument doc = searcher.doc(docId); final StoredDocument doc = searcher.doc(docId);
String text = doc.get(FIELD_NAME); String text = doc.get(FIELD_NAME);
TokenStream tokenStream = getAnyTokenStream(FIELD_NAME, docId); TokenStream tokenStream = getAnyTokenStream(FIELD_NAME, docId);
Highlighter highlighter = getHighlighter(query, FIELD_NAME, HighlighterTest.this, false); Highlighter highlighter = getHighlighter(query.build(), FIELD_NAME, HighlighterTest.this, false);
highlighter.setTextFragmenter(new SimpleFragmenter(40)); highlighter.setTextFragmenter(new SimpleFragmenter(40));
@ -1672,7 +1672,7 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
public void run() throws Exception { public void run() throws Exception {
String docMainText = "fred is one of the people"; String docMainText = "fred is one of the people";
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(FIELD_NAME, "fred")), Occur.SHOULD); query.add(new TermQuery(new Term(FIELD_NAME, "fred")), Occur.SHOULD);
query.add(new TermQuery(new Term("category", "people")), Occur.SHOULD); query.add(new TermQuery(new Term("category", "people")), Occur.SHOULD);
@ -1680,9 +1680,9 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
Scorer fieldSpecificScorer = null; Scorer fieldSpecificScorer = null;
if (mode == TestHighlightRunner.QUERY) { if (mode == TestHighlightRunner.QUERY) {
fieldSpecificScorer = new QueryScorer(query, FIELD_NAME); fieldSpecificScorer = new QueryScorer(query.build(), FIELD_NAME);
} else if (mode == TestHighlightRunner.QUERY_TERM) { } else if (mode == TestHighlightRunner.QUERY_TERM) {
fieldSpecificScorer = new QueryTermScorer(query, "contents"); fieldSpecificScorer = new QueryTermScorer(query.build(), "contents");
} }
Highlighter fieldSpecificHighlighter = new Highlighter(new SimpleHTMLFormatter(), Highlighter fieldSpecificHighlighter = new Highlighter(new SimpleHTMLFormatter(),
fieldSpecificScorer); fieldSpecificScorer);
@ -1693,9 +1693,9 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
// highlighting does not respect fieldnames used in query // highlighting does not respect fieldnames used in query
Scorer fieldInSpecificScorer = null; Scorer fieldInSpecificScorer = null;
if (mode == TestHighlightRunner.QUERY) { if (mode == TestHighlightRunner.QUERY) {
fieldInSpecificScorer = new QueryScorer(query, null); fieldInSpecificScorer = new QueryScorer(query.build(), null);
} else if (mode == TestHighlightRunner.QUERY_TERM) { } else if (mode == TestHighlightRunner.QUERY_TERM) {
fieldInSpecificScorer = new QueryTermScorer(query); fieldInSpecificScorer = new QueryTermScorer(query.build());
} }
Highlighter fieldInSpecificHighlighter = new Highlighter(new SimpleHTMLFormatter(), Highlighter fieldInSpecificHighlighter = new Highlighter(new SimpleHTMLFormatter(),
@ -1849,11 +1849,11 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
result = highlighter.getBestFragments(getTS2(), s, 3, "..."); result = highlighter.getBestFragments(getTS2(), s, 3, "...");
assertEquals("<B>Hi-Speed</B>10 foo", result); assertEquals("<B>Hi-Speed</B>10 foo", result);
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term("text", "hi")), Occur.SHOULD); booleanQuery.add(new TermQuery(new Term("text", "hi")), Occur.SHOULD);
booleanQuery.add(new TermQuery(new Term("text", "speed")), Occur.SHOULD); booleanQuery.add(new TermQuery(new Term("text", "speed")), Occur.SHOULD);
query = booleanQuery; query = booleanQuery.build();
highlighter = getHighlighter(query, "text", HighlighterTest.this); highlighter = getHighlighter(query, "text", HighlighterTest.this);
result = highlighter.getBestFragments(getTS2(), s, 3, "..."); result = highlighter.getBestFragments(getTS2(), s, 3, "...");
assertEquals("<B>Hi-Speed</B>10 foo", result); assertEquals("<B>Hi-Speed</B>10 foo", result);
@ -1885,7 +1885,7 @@ public class HighlighterTest extends BaseTokenStreamTestCase implements Formatte
result = highlighter.getBestFragments(getTS2a(), s, 3, "..."); result = highlighter.getBestFragments(getTS2a(), s, 3, "...");
assertEquals("<B>Hi-Speed</B>10 foo", result); assertEquals("<B>Hi-Speed</B>10 foo", result);
query = booleanQuery; query = booleanQuery.build();
highlighter = getHighlighter(query, "text", HighlighterTest.this); highlighter = getHighlighter(query, "text", HighlighterTest.this);
result = highlighter.getBestFragments(getTS2a(), s, 3, "..."); result = highlighter.getBestFragments(getTS2a(), s, 3, "...");
assertEquals("<B>Hi-Speed</B>10 foo", result); assertEquals("<B>Hi-Speed</B>10 foo", result);

View File

@ -46,10 +46,10 @@ public class MissesTest extends LuceneTestCase {
public void testBooleanQuery() throws IOException, InvalidTokenOffsetsException { public void testBooleanQuery() throws IOException, InvalidTokenOffsetsException {
try (Analyzer analyzer = new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)) { try (Analyzer analyzer = new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)) {
final BooleanQuery query = new BooleanQuery(); final BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("test", "foo")), Occur.MUST); query.add(new TermQuery(new Term("test", "foo")), Occur.MUST);
query.add(new TermQuery(new Term("test", "bar")), Occur.MUST); query.add(new TermQuery(new Term("test", "bar")), Occur.MUST);
final Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter(), new QueryScorer(query)); final Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter(), new QueryScorer(query.build()));
assertEquals("this is a <B>foo</B> <B>bar</B> example", assertEquals("this is a <B>foo</B> <B>bar</B> example",
highlighter.getBestFragment(analyzer, "test", "this is a foo bar example")); highlighter.getBestFragment(analyzer, "test", "this is a foo bar example"));
assertNull(highlighter.getBestFragment(analyzer, "test", "this does not match")); assertNull(highlighter.getBestFragment(analyzer, "test", "this does not match"));

View File

@ -100,12 +100,12 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
assertEquals("<b>Test</b> a one sentence document.", snippets[1]); assertEquals("<b>Test</b> a one sentence document.", snippets[1]);
// wrong field // wrong field
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(new WildcardQuery(new Term("bogus", "te*")), BooleanClause.Occur.SHOULD); bq.add(new WildcardQuery(new Term("bogus", "te*")), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
@ -152,12 +152,12 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
assertEquals("<b>Test</b> a one sentence document.", snippets[1]); assertEquals("<b>Test</b> a one sentence document.", snippets[1]);
// wrong field // wrong field
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(new PrefixQuery(new Term("bogus", "te")), BooleanClause.Occur.SHOULD); bq.add(new PrefixQuery(new Term("bogus", "te")), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
@ -204,12 +204,12 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
assertEquals("<b>Test</b> a one sentence document.", snippets[1]); assertEquals("<b>Test</b> a one sentence document.", snippets[1]);
// wrong field // wrong field
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(new RegexpQuery(new Term("bogus", "te.*")), BooleanClause.Occur.SHOULD); bq.add(new RegexpQuery(new Term("bogus", "te.*")), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
@ -265,12 +265,12 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
assertEquals("<b>Test</b> a one sentence document.", snippets[1]); assertEquals("<b>Test</b> a one sentence document.", snippets[1]);
// wrong field // wrong field
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(new FuzzyQuery(new Term("bogus", "tets"), 1), BooleanClause.Occur.SHOULD); bq.add(new FuzzyQuery(new Term("bogus", "tets"), 1), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
@ -353,34 +353,34 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
assertEquals("<b>Test</b> a one sentence document.", snippets[1]); assertEquals("<b>Test</b> a one sentence document.", snippets[1]);
// exact start exclusive // exact start exclusive
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(TermRangeQuery.newStringRange("body", "test", "tf", false, true), BooleanClause.Occur.SHOULD); bq.add(TermRangeQuery.newStringRange("body", "test", "tf", false, true), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
// exact end exclusive // exact end exclusive
bq = new BooleanQuery(); bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(TermRangeQuery.newStringRange("body", "ta", "test", true, false), BooleanClause.Occur.SHOULD); bq.add(TermRangeQuery.newStringRange("body", "ta", "test", true, false), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
// wrong field // wrong field
bq = new BooleanQuery(); bq = new BooleanQuery.Builder();
bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); bq.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
bq.add(TermRangeQuery.newStringRange("bogus", "ta", "tf", true, true), BooleanClause.Occur.SHOULD); bq.add(TermRangeQuery.newStringRange("bogus", "ta", "tf", true, true), BooleanClause.Occur.SHOULD);
topDocs = searcher.search(bq, 10, Sort.INDEXORDER); topDocs = searcher.search(bq.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", bq, searcher, topDocs); snippets = highlighter.highlight("body", bq.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
@ -418,22 +418,22 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
return analyzer; return analyzer;
} }
}; };
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new WildcardQuery(new Term("body", "te*")), BooleanClause.Occur.SHOULD); query.add(new WildcardQuery(new Term("body", "te*")), BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); TopDocs topDocs = searcher.search(query.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
String snippets[] = highlighter.highlight("body", query, searcher, topDocs); String snippets[] = highlighter.highlight("body", query.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a <b>test</b>.", snippets[0]); assertEquals("This is a <b>test</b>.", snippets[0]);
assertEquals("<b>Test</b> a one sentence document.", snippets[1]); assertEquals("<b>Test</b> a one sentence document.", snippets[1]);
// must not // must not
query = new BooleanQuery(); query = new BooleanQuery.Builder();
query.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD); query.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
query.add(new WildcardQuery(new Term("bogus", "te*")), BooleanClause.Occur.MUST_NOT); query.add(new WildcardQuery(new Term("bogus", "te*")), BooleanClause.Occur.MUST_NOT);
topDocs = searcher.search(query, 10, Sort.INDEXORDER); topDocs = searcher.search(query.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
snippets = highlighter.highlight("body", query, searcher, topDocs); snippets = highlighter.highlight("body", query.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("This is a test.", snippets[0]); assertEquals("This is a test.", snippets[0]);
assertEquals("Test a one sentence document.", snippets[1]); assertEquals("Test a one sentence document.", snippets[1]);
@ -807,13 +807,13 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
return analyzer; return analyzer;
} }
}; };
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new WildcardQuery(new Term("body", "te*")), BooleanClause.Occur.SHOULD); query.add(new WildcardQuery(new Term("body", "te*")), BooleanClause.Occur.SHOULD);
query.add(new WildcardQuery(new Term("body", "one")), BooleanClause.Occur.SHOULD); query.add(new WildcardQuery(new Term("body", "one")), BooleanClause.Occur.SHOULD);
query.add(new WildcardQuery(new Term("body", "se*")), BooleanClause.Occur.SHOULD); query.add(new WildcardQuery(new Term("body", "se*")), BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); TopDocs topDocs = searcher.search(query.build(), 10, Sort.INDEXORDER);
assertEquals(1, topDocs.totalHits); assertEquals(1, topDocs.totalHits);
String snippets[] = highlighter.highlight("body", query, searcher, topDocs); String snippets[] = highlighter.highlight("body", query.build(), searcher, topDocs);
assertEquals(1, snippets.length); assertEquals(1, snippets.length);
// Default formatter just bolds each hit: // Default formatter just bolds each hit:
@ -871,7 +871,7 @@ public class TestMultiTermHighlighting extends LuceneTestCase {
}; };
assertEquals(1, topDocs.totalHits); assertEquals(1, topDocs.totalHits);
snippets = highlighter.highlight("body", query, searcher, topDocs); snippets = highlighter.highlight("body", query.build(), searcher, topDocs);
assertEquals(1, snippets.length); assertEquals(1, snippets.length);
// Default formatter bolds each hit: // Default formatter bolds each hit:

View File

@ -292,12 +292,12 @@ public class TestPostingsHighlighter extends LuceneTestCase {
IndexSearcher searcher = newSearcher(ir); IndexSearcher searcher = newSearcher(ir);
PostingsHighlighter highlighter = new PostingsHighlighter(); PostingsHighlighter highlighter = new PostingsHighlighter();
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("body", "highlighting")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "highlighting")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("title", "best")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("title", "best")), BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); TopDocs topDocs = searcher.search(query.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
Map<String,String[]> snippets = highlighter.highlightFields(new String [] { "body", "title" }, query, searcher, topDocs); Map<String,String[]> snippets = highlighter.highlightFields(new String [] { "body", "title" }, query.build(), searcher, topDocs);
assertEquals(2, snippets.size()); assertEquals(2, snippets.size());
assertEquals("Just a test <b>highlighting</b> from postings. ", snippets.get("body")[0]); assertEquals("Just a test <b>highlighting</b> from postings. ", snippets.get("body")[0]);
assertEquals("<b>Highlighting</b> the first term. ", snippets.get("body")[1]); assertEquals("<b>Highlighting</b> the first term. ", snippets.get("body")[1]);
@ -329,13 +329,13 @@ public class TestPostingsHighlighter extends LuceneTestCase {
IndexSearcher searcher = newSearcher(ir); IndexSearcher searcher = newSearcher(ir);
PostingsHighlighter highlighter = new PostingsHighlighter(); PostingsHighlighter highlighter = new PostingsHighlighter();
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("body", "highlighting")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "highlighting")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("body", "just")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "just")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("body", "first")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "first")), BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); TopDocs topDocs = searcher.search(query.build(), 10, Sort.INDEXORDER);
assertEquals(2, topDocs.totalHits); assertEquals(2, topDocs.totalHits);
String snippets[] = highlighter.highlight("body", query, searcher, topDocs); String snippets[] = highlighter.highlight("body", query.build(), searcher, topDocs);
assertEquals(2, snippets.length); assertEquals(2, snippets.length);
assertEquals("<b>Just</b> a test <b>highlighting</b> from postings. ", snippets[0]); assertEquals("<b>Just</b> a test <b>highlighting</b> from postings. ", snippets[0]);
assertEquals("<b>Highlighting</b> the <b>first</b> term. ", snippets[1]); assertEquals("<b>Highlighting</b> the <b>first</b> term. ", snippets[1]);
@ -503,14 +503,14 @@ public class TestPostingsHighlighter extends LuceneTestCase {
IndexReader ir = iw.getReader(); IndexReader ir = iw.getReader();
iw.close(); iw.close();
IndexSearcher searcher = newSearcher(ir); IndexSearcher searcher = newSearcher(ir);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("body", "porter")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "porter")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("body", "square")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "square")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("body", "massachusetts")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "massachusetts")), BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.search(query, 10); TopDocs topDocs = searcher.search(query.build(), 10);
assertEquals(1, topDocs.totalHits); assertEquals(1, topDocs.totalHits);
PostingsHighlighter highlighter = new PostingsHighlighter(Integer.MAX_VALUE-1); PostingsHighlighter highlighter = new PostingsHighlighter(Integer.MAX_VALUE-1);
String snippets[] = highlighter.highlight("body", query, searcher, topDocs, 2); String snippets[] = highlighter.highlight("body", query.build(), searcher, topDocs, 2);
assertEquals(1, snippets.length); assertEquals(1, snippets.length);
assertTrue(snippets[0].contains("<b>Square</b>")); assertTrue(snippets[0].contains("<b>Square</b>"));
assertTrue(snippets[0].contains("<b>Porter</b>")); assertTrue(snippets[0].contains("<b>Porter</b>"));
@ -562,15 +562,15 @@ public class TestPostingsHighlighter extends LuceneTestCase {
IndexReader ir = iw.getReader(); IndexReader ir = iw.getReader();
iw.close(); iw.close();
IndexSearcher searcher = newSearcher(ir); IndexSearcher searcher = newSearcher(ir);
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("body", "terms")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "terms")), BooleanClause.Occur.SHOULD);
BooleanQuery query2 = new BooleanQuery(); BooleanQuery.Builder query2 = new BooleanQuery.Builder();
query.add(query2, BooleanClause.Occur.SHOULD); query.add(query2.build(), BooleanClause.Occur.SHOULD);
query2.add(new TermQuery(new Term("body", "both")), BooleanClause.Occur.MUST_NOT); query2.add(new TermQuery(new Term("body", "both")), BooleanClause.Occur.MUST_NOT);
TopDocs topDocs = searcher.search(query, 10); TopDocs topDocs = searcher.search(query.build(), 10);
assertEquals(1, topDocs.totalHits); assertEquals(1, topDocs.totalHits);
PostingsHighlighter highlighter = new PostingsHighlighter(Integer.MAX_VALUE-1); PostingsHighlighter highlighter = new PostingsHighlighter(Integer.MAX_VALUE-1);
String snippets[] = highlighter.highlight("body", query, searcher, topDocs, 2); String snippets[] = highlighter.highlight("body", query.build(), searcher, topDocs, 2);
assertEquals(1, snippets.length); assertEquals(1, snippets.length);
assertFalse(snippets[0].contains("<b>both</b>")); assertFalse(snippets[0].contains("<b>both</b>"));
ir.close(); ir.close();
@ -977,10 +977,10 @@ public class TestPostingsHighlighter extends LuceneTestCase {
IndexSearcher searcher = newSearcher(ir); IndexSearcher searcher = newSearcher(ir);
PostingsHighlighter highlighter = new PostingsHighlighter(); PostingsHighlighter highlighter = new PostingsHighlighter();
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("body", "test")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "test")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("title", "test")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("title", "test")), BooleanClause.Occur.SHOULD);
Map<String,String[]> snippets = highlighter.highlightFields(new String[] { "title", "body" }, query, searcher, new int[] { 0 }, new int[] { 1, 2 }); Map<String,String[]> snippets = highlighter.highlightFields(new String[] { "title", "body" }, query.build(), searcher, new int[] { 0 }, new int[] { 1, 2 });
String titleHighlight = snippets.get("title")[0]; String titleHighlight = snippets.get("title")[0];
String bodyHighlight = snippets.get("body")[0]; String bodyHighlight = snippets.get("body")[0];
assertEquals("This is a <b>test</b>. ", titleHighlight); assertEquals("This is a <b>test</b>. ", titleHighlight);

View File

@ -98,11 +98,11 @@ public class TestPostingsHighlighterRanking extends LuceneTestCase {
// check a simple term query // check a simple term query
checkQuery(is, new TermQuery(term), doc, maxTopN); checkQuery(is, new TermQuery(term), doc, maxTopN);
// check a boolean query // check a boolean query
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(new TermQuery(term), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(term), BooleanClause.Occur.SHOULD);
Term nextTerm = new Term("body", "" + (char)(ch+1)); Term nextTerm = new Term("body", "" + (char)(ch+1));
bq.add(new TermQuery(nextTerm), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(nextTerm), BooleanClause.Occur.SHOULD);
checkQuery(is, bq, doc, maxTopN); checkQuery(is, bq.build(), doc, maxTopN);
} }
} }
@ -126,12 +126,12 @@ public class TestPostingsHighlighterRanking extends LuceneTestCase {
} }
}; };
BooleanQuery bq = new BooleanQuery(false); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(query, BooleanClause.Occur.MUST); bq.add(query, BooleanClause.Occur.MUST);
bq.add(new TermQuery(new Term("id", Integer.toString(doc))), BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term("id", Integer.toString(doc))), BooleanClause.Occur.MUST);
TopDocs td = is.search(bq, 1); TopDocs td = is.search(bq.build(), 1);
p1.highlight("body", bq, is, td, n); p1.highlight("body", bq.build(), is, td, n);
p2.highlight("body", bq, is, td, n+1); p2.highlight("body", bq.build(), is, td, n+1);
assertTrue(f2.seen.containsAll(f1.seen)); assertTrue(f2.seen.containsAll(f1.seen));
} }
} }
@ -310,12 +310,12 @@ public class TestPostingsHighlighterRanking extends LuceneTestCase {
return new PassageScorer(0, 0.75f, 87); return new PassageScorer(0, 0.75f, 87);
} }
}; };
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term("body", "foo")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "foo")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term("body", "bar")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term("body", "bar")), BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); TopDocs topDocs = searcher.search(query.build(), 10, Sort.INDEXORDER);
assertEquals(1, topDocs.totalHits); assertEquals(1, topDocs.totalHits);
String snippets[] = highlighter.highlight("body", query, searcher, topDocs, 1); String snippets[] = highlighter.highlight("body", query.build(), searcher, topDocs, 1);
assertEquals(1, snippets.length); assertEquals(1, snippets.length);
assertTrue(snippets[0].startsWith("On the other hand")); assertTrue(snippets[0].startsWith("On the other hand"));

View File

@ -136,10 +136,10 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
int docId = 0; int docId = 0;
String field = "text"; String field = "text";
{ {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "internet")), Occur.MUST); query.add(new TermQuery(new Term(field, "internet")), Occur.MUST);
query.add(new TermQuery(new Term(field, "explorer")), Occur.MUST); query.add(new TermQuery(new Term(field, "explorer")), Occur.MUST);
FieldQuery fieldQuery = highlighter.getFieldQuery(query, reader); FieldQuery fieldQuery = highlighter.getFieldQuery(query.build(), reader);
String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader, String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader,
docId, field, 128, 1); docId, field, 128, 1);
// highlighted results are centered // highlighted results are centered
@ -182,11 +182,11 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
int docId = 0; int docId = 0;
String field = "no_long_term"; String field = "no_long_term";
{ {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, "test")), Occur.MUST); query.add(new TermQuery(new Term(field, "test")), Occur.MUST);
query.add(new TermQuery(new Term(field, "foo")), Occur.MUST); query.add(new TermQuery(new Term(field, "foo")), Occur.MUST);
query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST); query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST);
FieldQuery fieldQuery = highlighter.getFieldQuery(query, reader); FieldQuery fieldQuery = highlighter.getFieldQuery(query.build(), reader);
String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader, String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader,
docId, field, 18, 1); docId, field, 18, 1);
// highlighted results are centered // highlighted results are centered
@ -194,12 +194,12 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
assertEquals("<b>foo</b> is <b>highlighed</b> and", bestFragments[0]); assertEquals("<b>foo</b> is <b>highlighed</b> and", bestFragments[0]);
} }
{ {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery pq = new PhraseQuery(5, field, "test", "foo", "highlighed"); PhraseQuery pq = new PhraseQuery(5, field, "test", "foo", "highlighed");
query.add(new TermQuery(new Term(field, "foo")), Occur.MUST); query.add(new TermQuery(new Term(field, "foo")), Occur.MUST);
query.add(pq, Occur.MUST); query.add(pq, Occur.MUST);
query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST); query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST);
FieldQuery fieldQuery = highlighter.getFieldQuery(query, reader); FieldQuery fieldQuery = highlighter.getFieldQuery(query.build(), reader);
String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader, String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader,
docId, field, 18, 1); docId, field, 18, 1);
// highlighted results are centered // highlighted results are centered
@ -233,15 +233,15 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
assertEquals(0, bestFragments.length); assertEquals(0, bestFragments.length);
} }
{ {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
PhraseQuery pq = new PhraseQuery(5, field, "test", "foo", "highlighed"); PhraseQuery pq = new PhraseQuery(5, field, "test", "foo", "highlighed");
BooleanQuery inner = new BooleanQuery(); BooleanQuery.Builder inner = new BooleanQuery.Builder();
inner.add(pq, Occur.MUST); inner.add(pq, Occur.MUST);
inner.add(new TermQuery(new Term(field, "foo")), Occur.MUST); inner.add(new TermQuery(new Term(field, "foo")), Occur.MUST);
query.add(inner, Occur.MUST); query.add(inner.build(), Occur.MUST);
query.add(pq, Occur.MUST); query.add(pq, Occur.MUST);
query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST); query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST);
FieldQuery fieldQuery = highlighter.getFieldQuery(query, reader); FieldQuery fieldQuery = highlighter.getFieldQuery(query.build(), reader);
String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader, String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader,
docId, field, 18, 1); docId, field, 18, 1);
assertEquals(0, bestFragments.length); assertEquals(0, bestFragments.length);
@ -255,12 +255,12 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
field = "long_term"; field = "long_term";
{ {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(field, query.add(new TermQuery(new Term(field,
"thisisaverylongwordandmakessurethisfails")), Occur.MUST); "thisisaverylongwordandmakessurethisfails")), Occur.MUST);
query.add(new TermQuery(new Term(field, "foo")), Occur.MUST); query.add(new TermQuery(new Term(field, "foo")), Occur.MUST);
query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST); query.add(new TermQuery(new Term(field, "highlighed")), Occur.MUST);
FieldQuery fieldQuery = highlighter.getFieldQuery(query, reader); FieldQuery fieldQuery = highlighter.getFieldQuery(query.build(), reader);
String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader, String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader,
docId, field, 18, 1); docId, field, 18, 1);
// highlighted results are centered // highlighted results are centered
@ -297,19 +297,20 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
IndexReader reader = DirectoryReader.open(writer, true); IndexReader reader = DirectoryReader.open(writer, true);
// This mimics what some query parsers do to <highlight words together> // This mimics what some query parsers do to <highlight words together>
BooleanQuery terms = new BooleanQuery(); BooleanQuery.Builder terms = new BooleanQuery.Builder();
terms.add( clause( "text", "highlight" ), Occur.MUST ); terms.add( clause( "text", "highlight" ), Occur.MUST );
terms.add( clause( "text", "words" ), Occur.MUST ); terms.add( clause( "text", "words" ), Occur.MUST );
terms.add( clause( "text", "together" ), Occur.MUST ); terms.add( clause( "text", "together" ), Occur.MUST );
// This mimics what some query parsers do to <"highlight words together"> // This mimics what some query parsers do to <"highlight words together">
BooleanQuery phrase = new BooleanQuery(); BooleanQuery.Builder phraseB = new BooleanQuery.Builder();
phrase.add( clause( "text", "highlight", "words", "together" ), Occur.MUST ); phraseB.add( clause( "text", "highlight", "words", "together" ), Occur.MUST );
Query phrase = phraseB.build();
phrase.setBoost( 100 ); phrase.setBoost( 100 );
// Now combine those results in a boolean query which should pull the phrases to the front of the list of fragments // Now combine those results in a boolean query which should pull the phrases to the front of the list of fragments
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( phrase, Occur.MUST ); query.add( phrase, Occur.MUST );
query.add( phrase, Occur.SHOULD ); query.add( phrase, Occur.SHOULD );
FieldQuery fieldQuery = new FieldQuery( query, reader, true, false ); FieldQuery fieldQuery = new FieldQuery( query.build(), reader, true, false );
String fragment = highlighter.getBestFragment( fieldQuery, reader, 0, "text", 100 ); String fragment = highlighter.getBestFragment( fieldQuery, reader, 0, "text", 100 );
assertEquals( "junk junk junk junk junk junk junk junk <b>highlight words together</b> junk junk junk junk junk junk junk junk", fragment ); assertEquals( "junk junk junk junk junk junk junk junk <b>highlight words together</b> junk junk junk junk junk junk junk junk", fragment );
@ -496,11 +497,11 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
String[] postTags = new String[] { "</b>" }; String[] postTags = new String[] { "</b>" };
Encoder encoder = new DefaultEncoder(); Encoder encoder = new DefaultEncoder();
int docId = 0; int docId = 0;
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( clause( "field", "hero" ), Occur.SHOULD); query.add( clause( "field", "hero" ), Occur.SHOULD);
query.add( clause( "field", "of" ), Occur.SHOULD); query.add( clause( "field", "of" ), Occur.SHOULD);
query.add( clause( "field", "legend" ), Occur.SHOULD); query.add( clause( "field", "legend" ), Occur.SHOULD);
FieldQuery fieldQuery = highlighter.getFieldQuery( query, reader ); FieldQuery fieldQuery = highlighter.getFieldQuery( query.build(), reader );
for ( FragListBuilder fragListBuilder : new FragListBuilder[] { for ( FragListBuilder fragListBuilder : new FragListBuilder[] {
new SimpleFragListBuilder(), new WeightedFragListBuilder() } ) { new SimpleFragListBuilder(), new WeightedFragListBuilder() } ) {
@ -561,10 +562,10 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
assertEquals("<b>Test: http://www.facebook.com</b>", bestFragments[0]); assertEquals("<b>Test: http://www.facebook.com</b>", bestFragments[0]);
// query3: OR query1 and query2 together // query3: OR query1 and query2 together
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add(pq, BooleanClause.Occur.SHOULD); bq.add(pq, BooleanClause.Occur.SHOULD);
bq.add(pq2, BooleanClause.Occur.SHOULD); bq.add(pq2, BooleanClause.Occur.SHOULD);
fieldQuery = highlighter.getFieldQuery(bq, reader); fieldQuery = highlighter.getFieldQuery(bq.build(), reader);
bestFragments = highlighter.getBestFragments(fieldQuery, reader, docId, "field", 54, 1); bestFragments = highlighter.getBestFragments(fieldQuery, reader, docId, "field", 54, 1);
assertEquals("<b>Test: http://www.facebook.com</b>", bestFragments[0]); assertEquals("<b>Test: http://www.facebook.com</b>", bestFragments[0]);
@ -627,11 +628,11 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
String[] postTags = new String[] { "</b>" }; String[] postTags = new String[] { "</b>" };
Encoder encoder = new DefaultEncoder(); Encoder encoder = new DefaultEncoder();
int docId = 0; int docId = 0;
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
for ( Query clause : queryClauses ) { for ( Query clause : queryClauses ) {
query.add( clause, Occur.MUST ); query.add( clause, Occur.MUST );
} }
FieldQuery fieldQuery = new FieldQuery( query, reader, true, fieldMatch ); FieldQuery fieldQuery = new FieldQuery( query.build(), reader, true, fieldMatch );
String[] bestFragments; String[] bestFragments;
if ( useMatchedFields ) { if ( useMatchedFields ) {
Set< String > matchedFields = new HashSet<>(); Set< String > matchedFields = new HashSet<>();

View File

@ -24,7 +24,6 @@ import org.apache.lucene.search.vectorhighlight.FieldPhraseList.WeightedPhraseIn
import org.apache.lucene.search.vectorhighlight.FieldPhraseList.WeightedPhraseInfo.Toffs; import org.apache.lucene.search.vectorhighlight.FieldPhraseList.WeightedPhraseInfo.Toffs;
import org.apache.lucene.search.vectorhighlight.FieldTermStack.TermInfo; import org.apache.lucene.search.vectorhighlight.FieldTermStack.TermInfo;
import org.apache.lucene.util.TestUtil; import org.apache.lucene.util.TestUtil;
import org.apache.lucene.util.TestUtil;
public class FieldPhraseListTest extends AbstractTestCase { public class FieldPhraseListTest extends AbstractTestCase {
@ -131,10 +130,10 @@ public class FieldPhraseListTest extends AbstractTestCase {
public void test2PhrasesOverlap() throws Exception { public void test2PhrasesOverlap() throws Exception {
make1d1fIndex( "d a b c d" ); make1d1fIndex( "d a b c d" );
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pqF( "a", "b" ), Occur.SHOULD ); query.add( pqF( "a", "b" ), Occur.SHOULD );
query.add( pqF( "b", "c" ), Occur.SHOULD ); query.add( pqF( "b", "c" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
FieldPhraseList fpl = new FieldPhraseList( stack, fq ); FieldPhraseList fpl = new FieldPhraseList( stack, fq );
assertEquals( 1, fpl.phraseList.size() ); assertEquals( 1, fpl.phraseList.size() );
@ -154,10 +153,10 @@ public class FieldPhraseListTest extends AbstractTestCase {
public void testSearchLongestPhrase() throws Exception { public void testSearchLongestPhrase() throws Exception {
make1d1fIndex( "d a b d c a b c" ); make1d1fIndex( "d a b d c a b c" );
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pqF( "a", "b" ), Occur.SHOULD ); query.add( pqF( "a", "b" ), Occur.SHOULD );
query.add( pqF( "a", "b", "c" ), Occur.SHOULD ); query.add( pqF( "a", "b", "c" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
FieldPhraseList fpl = new FieldPhraseList( stack, fq ); FieldPhraseList fpl = new FieldPhraseList( stack, fq );
assertEquals( 2, fpl.phraseList.size() ); assertEquals( 2, fpl.phraseList.size() );

View File

@ -54,16 +54,18 @@ public class FieldQueryTest extends AbstractTestCase {
public void testFlattenBoolean() throws Exception { public void testFlattenBoolean() throws Exception {
initBoost(); initBoost();
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQueryB = new BooleanQuery.Builder();
booleanQuery.setBoost( boost ); booleanQueryB.add(tq("A"), Occur.MUST);
booleanQuery.add(tq("A"), Occur.MUST); booleanQueryB.add(tq("B"), Occur.MUST);
booleanQuery.add(tq("B"), Occur.MUST); booleanQueryB.add(tq("C"), Occur.SHOULD);
booleanQuery.add(tq("C"), Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(tq("D"), Occur.MUST); innerQuery.add(tq("D"), Occur.MUST);
innerQuery.add(tq("E"), Occur.MUST); innerQuery.add(tq("E"), Occur.MUST);
booleanQuery.add(innerQuery, Occur.MUST_NOT); booleanQueryB.add(innerQuery.build(), Occur.MUST_NOT);
BooleanQuery booleanQuery = booleanQueryB.build();
booleanQuery.setBoost(boost);
FieldQuery fq = new FieldQuery(booleanQuery, true, true ); FieldQuery fq = new FieldQuery(booleanQuery, true, true );
Set<Query> flatQueries = new HashSet<>(); Set<Query> flatQueries = new HashSet<>();
@ -83,10 +85,11 @@ public class FieldQueryTest extends AbstractTestCase {
public void testFlattenTermAndPhrase() throws Exception { public void testFlattenTermAndPhrase() throws Exception {
initBoost(); initBoost();
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQueryB = new BooleanQuery.Builder();
booleanQuery.setBoost( boost ); booleanQueryB.add(tq("A"), Occur.MUST);
booleanQuery.add(tq("A"), Occur.MUST); booleanQueryB.add(pqF("B", "C"), Occur.MUST);
booleanQuery.add(pqF("B", "C"), Occur.MUST); BooleanQuery booleanQuery = booleanQueryB.build();
booleanQuery.setBoost(boost);
FieldQuery fq = new FieldQuery(booleanQuery, true, true ); FieldQuery fq = new FieldQuery(booleanQuery, true, true );
Set<Query> flatQueries = new HashSet<>(); Set<Query> flatQueries = new HashSet<>();
@ -95,14 +98,14 @@ public class FieldQueryTest extends AbstractTestCase {
} }
public void testFlattenTermAndPhrase2gram() throws Exception { public void testFlattenTermAndPhrase2gram() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(F, "AA")), Occur.MUST); query.add(new TermQuery(new Term(F, "AA")), Occur.MUST);
query.add(toPhraseQuery(analyze("BCD", F, analyzerB), F), Occur.MUST); query.add(toPhraseQuery(analyze("BCD", F, analyzerB), F), Occur.MUST);
query.add(toPhraseQuery(analyze("EFGH", F, analyzerB), F), Occur.SHOULD); query.add(toPhraseQuery(analyze("EFGH", F, analyzerB), F), Occur.SHOULD);
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Set<Query> flatQueries = new HashSet<>(); Set<Query> flatQueries = new HashSet<>();
fq.flatten( query, reader, flatQueries ); fq.flatten( query.build(), reader, flatQueries );
assertCollectionQueries( flatQueries, tq( "AA" ), pqF( "BC", "CD" ), pqF( "EF", "FG", "GH" ) ); assertCollectionQueries( flatQueries, tq( "AA" ), pqF( "BC", "CD" ), pqF( "EF", "FG", "GH" ) );
} }
@ -276,17 +279,17 @@ public class FieldQueryTest extends AbstractTestCase {
} }
public void testGetTermSet() throws Exception { public void testGetTermSet() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(F, "A")), Occur.MUST); query.add(new TermQuery(new Term(F, "A")), Occur.MUST);
query.add(new TermQuery(new Term(F, "B")), Occur.MUST); query.add(new TermQuery(new Term(F, "B")), Occur.MUST);
query.add(new TermQuery(new Term("x", "C")), Occur.SHOULD); query.add(new TermQuery(new Term("x", "C")), Occur.SHOULD);
BooleanQuery innerQuery = new BooleanQuery(); BooleanQuery.Builder innerQuery = new BooleanQuery.Builder();
innerQuery.add(new TermQuery(new Term(F, "D")), Occur.MUST); innerQuery.add(new TermQuery(new Term(F, "D")), Occur.MUST);
innerQuery.add(new TermQuery(new Term(F, "E")), Occur.MUST); innerQuery.add(new TermQuery(new Term(F, "E")), Occur.MUST);
query.add(innerQuery, Occur.MUST_NOT); query.add(innerQuery.build(), Occur.MUST_NOT);
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
assertEquals( 2, fq.termSetMap.size() ); assertEquals( 2, fq.termSetMap.size() );
Set<String> termSet = fq.getTermSet( F ); Set<String> termSet = fq.getTermSet( F );
assertEquals( 2, termSet.size() ); assertEquals( 2, termSet.size() );
@ -477,12 +480,12 @@ public class FieldQueryTest extends AbstractTestCase {
} }
public void testQueryPhraseMap2Phrases() throws Exception { public void testQueryPhraseMap2Phrases() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pqF( "a", "b" ), Occur.SHOULD ); query.add( pqF( "a", "b" ), Occur.SHOULD );
query.add( pqF( 2, "c", "d" ), Occur.SHOULD ); query.add( pqF( 2, "c", "d" ), Occur.SHOULD );
// phraseHighlight = true, fieldMatch = true // phraseHighlight = true, fieldMatch = true
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Map<String, QueryPhraseMap> map = fq.rootMaps; Map<String, QueryPhraseMap> map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );
@ -512,12 +515,12 @@ public class FieldQueryTest extends AbstractTestCase {
} }
public void testQueryPhraseMap2PhrasesFields() throws Exception { public void testQueryPhraseMap2PhrasesFields() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pq( F1, "a", "b" ), Occur.SHOULD ); query.add( pq( F1, "a", "b" ), Occur.SHOULD );
query.add( pq( 2F, F2, "c", "d" ), Occur.SHOULD ); query.add( pq( 2F, F2, "c", "d" ), Occur.SHOULD );
// phraseHighlight = true, fieldMatch = true // phraseHighlight = true, fieldMatch = true
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Map<String, QueryPhraseMap> map = fq.rootMaps; Map<String, QueryPhraseMap> map = fq.rootMaps;
assertEquals( 2, map.size() ); assertEquals( 2, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );
@ -549,7 +552,7 @@ public class FieldQueryTest extends AbstractTestCase {
assertEquals( 2F, qpm3.boost, 0); assertEquals( 2F, qpm3.boost, 0);
// phraseHighlight = true, fieldMatch = false // phraseHighlight = true, fieldMatch = false
fq = new FieldQuery( query, true, false ); fq = new FieldQuery( query.build(), true, false );
map = fq.rootMaps; map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( F1 ) ); assertNull( map.get( F1 ) );
@ -588,13 +591,13 @@ public class FieldQueryTest extends AbstractTestCase {
* +-d-<t> * +-d-<t>
*/ */
public void testQueryPhraseMapOverlapPhrases() throws Exception { public void testQueryPhraseMapOverlapPhrases() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pqF( "a", "b", "c" ), Occur.SHOULD ); query.add( pqF( "a", "b", "c" ), Occur.SHOULD );
query.add( pqF( 2, "b", "c", "d" ), Occur.SHOULD ); query.add( pqF( 2, "b", "c", "d" ), Occur.SHOULD );
query.add( pqF( 3, "b", "d" ), Occur.SHOULD ); query.add( pqF( 3, "b", "d" ), Occur.SHOULD );
// phraseHighlight = true, fieldMatch = true // phraseHighlight = true, fieldMatch = true
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Map<String, QueryPhraseMap> map = fq.rootMaps; Map<String, QueryPhraseMap> map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );
@ -646,12 +649,12 @@ public class FieldQueryTest extends AbstractTestCase {
* +-c-<t> * +-c-<t>
*/ */
public void testQueryPhraseMapOverlapPhrases2() throws Exception { public void testQueryPhraseMapOverlapPhrases2() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pqF( "a", "b" ), Occur.SHOULD ); query.add( pqF( "a", "b" ), Occur.SHOULD );
query.add( pqF( 2, "a", "b", "c" ), Occur.SHOULD ); query.add( pqF( 2, "a", "b", "c" ), Occur.SHOULD );
// phraseHighlight = true, fieldMatch = true // phraseHighlight = true, fieldMatch = true
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Map<String, QueryPhraseMap> map = fq.rootMaps; Map<String, QueryPhraseMap> map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );
@ -686,12 +689,12 @@ public class FieldQueryTest extends AbstractTestCase {
* +-a-<t> * +-a-<t>
*/ */
public void testQueryPhraseMapOverlapPhrases3() throws Exception { public void testQueryPhraseMapOverlapPhrases3() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( pqF( "a", "a", "a", "a" ), Occur.SHOULD ); query.add( pqF( "a", "a", "a", "a" ), Occur.SHOULD );
query.add( pqF( 2, "a", "a", "a" ), Occur.SHOULD ); query.add( pqF( 2, "a", "a", "a" ), Occur.SHOULD );
// phraseHighlight = true, fieldMatch = true // phraseHighlight = true, fieldMatch = true
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Map<String, QueryPhraseMap> map = fq.rootMaps; Map<String, QueryPhraseMap> map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );
@ -732,12 +735,12 @@ public class FieldQueryTest extends AbstractTestCase {
} }
public void testQueryPhraseMapOverlap2gram() throws Exception { public void testQueryPhraseMapOverlap2gram() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(toPhraseQuery(analyze("abc", F, analyzerB), F), Occur.MUST); query.add(toPhraseQuery(analyze("abc", F, analyzerB), F), Occur.MUST);
query.add(toPhraseQuery(analyze("bcd", F, analyzerB), F), Occur.MUST); query.add(toPhraseQuery(analyze("bcd", F, analyzerB), F), Occur.MUST);
// phraseHighlight = true, fieldMatch = true // phraseHighlight = true, fieldMatch = true
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
Map<String, QueryPhraseMap> map = fq.rootMaps; Map<String, QueryPhraseMap> map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );
@ -773,7 +776,7 @@ public class FieldQueryTest extends AbstractTestCase {
assertEquals( 1F, qpm3.boost, 0); assertEquals( 1F, qpm3.boost, 0);
// phraseHighlight = false, fieldMatch = true // phraseHighlight = false, fieldMatch = true
fq = new FieldQuery( query, false, true ); fq = new FieldQuery( query.build(), false, true );
map = fq.rootMaps; map = fq.rootMaps;
assertEquals( 1, map.size() ); assertEquals( 1, map.size() );
assertNull( map.get( null ) ); assertNull( map.get( null ) );

View File

@ -42,10 +42,10 @@ public class FieldTermStackTest extends AbstractTestCase {
public void test2Terms() throws Exception { public void test2Terms() throws Exception {
makeIndex(); makeIndex();
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( tq( "b" ), Occur.SHOULD ); query.add( tq( "b" ), Occur.SHOULD );
query.add( tq( "c" ), Occur.SHOULD ); query.add( tq( "c" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
assertEquals( 8, stack.termList.size() ); assertEquals( 8, stack.termList.size() );
assertEquals( "b(6,7,3)", stack.pop().toString() ); assertEquals( "b(6,7,3)", stack.pop().toString() );
@ -97,10 +97,10 @@ public class FieldTermStackTest extends AbstractTestCase {
public void test2TermsB() throws Exception { public void test2TermsB() throws Exception {
makeIndexB(); makeIndexB();
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add( tq( "bc" ), Occur.SHOULD ); query.add( tq( "bc" ), Occur.SHOULD );
query.add( tq( "ef" ), Occur.SHOULD ); query.add( tq( "ef" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( query, true, true ); FieldQuery fq = new FieldQuery( query.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
assertEquals( 3, stack.termList.size() ); assertEquals( 3, stack.termList.size() );
assertEquals( "bc(4,6,4)", stack.pop().toString() ); assertEquals( "bc(4,6,4)", stack.pop().toString() );

View File

@ -43,10 +43,10 @@ public class IndexTimeSynonymTest extends AbstractTestCase {
public void testFieldTermStackIndex1wSearch2terms() throws Exception { public void testFieldTermStackIndex1wSearch2terms() throws Exception {
makeIndex1w(); makeIndex1w();
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add( tq( "Mac" ), Occur.SHOULD ); bq.add( tq( "Mac" ), Occur.SHOULD );
bq.add( tq( "MacBook" ), Occur.SHOULD ); bq.add( tq( "MacBook" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( bq, true, true ); FieldQuery fq = new FieldQuery( bq.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
assertEquals( 1, stack.termList.size() ); assertEquals( 1, stack.termList.size() );
TermInfo ti = stack.pop(); TermInfo ti = stack.pop();
@ -86,10 +86,10 @@ public class IndexTimeSynonymTest extends AbstractTestCase {
public void testFieldTermStackIndex1w2wSearch1term1phrase() throws Exception { public void testFieldTermStackIndex1w2wSearch1term1phrase() throws Exception {
makeIndex1w2w(); makeIndex1w2w();
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add( tq( "pc" ), Occur.SHOULD ); bq.add( tq( "pc" ), Occur.SHOULD );
bq.add( pqF( "personal", "computer" ), Occur.SHOULD ); bq.add( pqF( "personal", "computer" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( bq, true, true ); FieldQuery fq = new FieldQuery( bq.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
assertEquals( 2, stack.termList.size() ); assertEquals( 2, stack.termList.size() );
TermInfo ti = stack.pop(); TermInfo ti = stack.pop();
@ -130,10 +130,10 @@ public class IndexTimeSynonymTest extends AbstractTestCase {
public void testFieldTermStackIndex2w1wSearch1term1phrase() throws Exception { public void testFieldTermStackIndex2w1wSearch1term1phrase() throws Exception {
makeIndex2w1w(); makeIndex2w1w();
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add( tq( "pc" ), Occur.SHOULD ); bq.add( tq( "pc" ), Occur.SHOULD );
bq.add( pqF( "personal", "computer" ), Occur.SHOULD ); bq.add( pqF( "personal", "computer" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( bq, true, true ); FieldQuery fq = new FieldQuery( bq.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
assertEquals( 2, stack.termList.size() ); assertEquals( 2, stack.termList.size() );
TermInfo ti = stack.pop(); TermInfo ti = stack.pop();
@ -170,10 +170,10 @@ public class IndexTimeSynonymTest extends AbstractTestCase {
public void testFieldPhraseListIndex1w2wSearch1term1phrase() throws Exception { public void testFieldPhraseListIndex1w2wSearch1term1phrase() throws Exception {
makeIndex1w2w(); makeIndex1w2w();
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add( tq( "pc" ), Occur.SHOULD ); bq.add( tq( "pc" ), Occur.SHOULD );
bq.add( pqF( "personal", "computer" ), Occur.SHOULD ); bq.add( pqF( "personal", "computer" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( bq, true, true ); FieldQuery fq = new FieldQuery( bq.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
FieldPhraseList fpl = new FieldPhraseList( stack, fq ); FieldPhraseList fpl = new FieldPhraseList( stack, fq );
assertEquals( 1, fpl.phraseList.size() ); assertEquals( 1, fpl.phraseList.size() );
@ -221,10 +221,10 @@ public class IndexTimeSynonymTest extends AbstractTestCase {
public void testFieldPhraseListIndex2w1wSearch1term1phrase() throws Exception { public void testFieldPhraseListIndex2w1wSearch1term1phrase() throws Exception {
makeIndex2w1w(); makeIndex2w1w();
BooleanQuery bq = new BooleanQuery(); BooleanQuery.Builder bq = new BooleanQuery.Builder();
bq.add( tq( "pc" ), Occur.SHOULD ); bq.add( tq( "pc" ), Occur.SHOULD );
bq.add( pqF( "personal", "computer" ), Occur.SHOULD ); bq.add( pqF( "personal", "computer" ), Occur.SHOULD );
FieldQuery fq = new FieldQuery( bq, true, true ); FieldQuery fq = new FieldQuery( bq.build(), true, true );
FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); FieldTermStack stack = new FieldTermStack( reader, 0, F, fq );
FieldPhraseList fpl = new FieldPhraseList( stack, fq ); FieldPhraseList fpl = new FieldPhraseList( stack, fq );
assertEquals( 1, fpl.phraseList.size() ); assertEquals( 1, fpl.phraseList.size() );

View File

@ -26,11 +26,11 @@ import org.apache.lucene.search.TermQuery;
public class ScoreOrderFragmentsBuilderTest extends AbstractTestCase { public class ScoreOrderFragmentsBuilderTest extends AbstractTestCase {
public void test3Frags() throws Exception { public void test3Frags() throws Exception {
BooleanQuery query = new BooleanQuery(); BooleanQuery.Builder query = new BooleanQuery.Builder();
query.add(new TermQuery(new Term(F, "a")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(F, "a")), BooleanClause.Occur.SHOULD);
query.add(new TermQuery(new Term(F, "c")), BooleanClause.Occur.SHOULD); query.add(new TermQuery(new Term(F, "c")), BooleanClause.Occur.SHOULD);
FieldFragList ffl = ffl(query, "a b b b b b b b b b b b a b a b b b b b c a a b b" ); FieldFragList ffl = ffl(query.build(), "a b b b b b b b b b b b a b a b b b b b c a a b b" );
ScoreOrderFragmentsBuilder sofb = new ScoreOrderFragmentsBuilder(); ScoreOrderFragmentsBuilder sofb = new ScoreOrderFragmentsBuilder();
String[] f = sofb.createFragments( reader, 0, F, ffl, 3 ); String[] f = sofb.createFragments( reader, 0, F, ffl, 3 );
assertEquals( 3, f.length ); assertEquals( 3, f.length );

View File

@ -99,18 +99,18 @@ public class SimpleFragListBuilderTest extends AbstractTestCase {
public void test2TermsQuery() throws Exception { public void test2TermsQuery() throws Exception {
SimpleFragListBuilder sflb = new SimpleFragListBuilder(); SimpleFragListBuilder sflb = new SimpleFragListBuilder();
BooleanQuery booleanQuery = new BooleanQuery(); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(new TermQuery(new Term(F, "a")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(F, "a")), BooleanClause.Occur.SHOULD);
booleanQuery.add(new TermQuery(new Term(F, "b")), BooleanClause.Occur.SHOULD); booleanQuery.add(new TermQuery(new Term(F, "b")), BooleanClause.Occur.SHOULD);
FieldFragList ffl = sflb.createFieldFragList( fpl(booleanQuery, "c d e" ), 20 ); FieldFragList ffl = sflb.createFieldFragList( fpl(booleanQuery.build(), "c d e" ), 20 );
assertEquals( 0, ffl.getFragInfos().size() ); assertEquals( 0, ffl.getFragInfos().size() );
ffl = sflb.createFieldFragList( fpl(booleanQuery, "d b c" ), 20 ); ffl = sflb.createFieldFragList( fpl(booleanQuery.build(), "d b c" ), 20 );
assertEquals( 1, ffl.getFragInfos().size() ); assertEquals( 1, ffl.getFragInfos().size() );
assertEquals( "subInfos=(b((2,3)))/1.0(0,20)", ffl.getFragInfos().get( 0 ).toString() ); assertEquals( "subInfos=(b((2,3)))/1.0(0,20)", ffl.getFragInfos().get( 0 ).toString() );
ffl = sflb.createFieldFragList( fpl(booleanQuery, "a b c" ), 20 ); ffl = sflb.createFieldFragList( fpl(booleanQuery.build(), "a b c" ), 20 );
assertEquals( 1, ffl.getFragInfos().size() ); assertEquals( 1, ffl.getFragInfos().size() );
assertEquals( "subInfos=(a((0,1))b((2,3)))/2.0(0,20)", ffl.getFragInfos().get( 0 ).toString() ); assertEquals( "subInfos=(a((0,1))b((2,3)))/2.0(0,20)", ffl.getFragInfos().get( 0 ).toString() );
} }

Some files were not shown because too many files have changed in this diff Show More