blob: 601b883e04e947aa980ebb69c4d751300ec51652 [file] [log] [blame]
Index: lucene/core/src/java/org/apache/lucene/search/SloppyPhraseScorer.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/SloppyPhraseScorer.java (revision 1661344)
+++ lucene/core/src/java/org/apache/lucene/search/SloppyPhraseScorer.java (working copy)
@@ -627,4 +627,49 @@
@Override
public String toString() { return "scorer(" + weight + ")"; }
+
+ @Override
+ public TwoPhaseDocIdSetIterator asTwoPhaseIterator() {
+ return new TwoPhaseDocIdSetIterator() {
+ @Override
+ public DocIdSetIterator approximation() {
+ return new DocIdSetIterator() {
+ @Override
+ public int docID() {
+ return SloppyPhraseScorer.this.docID();
+ }
+
+ @Override
+ public int nextDoc() throws IOException {
+ return advance(max.doc + 1);
+ }
+
+ @Override
+ public int advance(int target) throws IOException {
+ assert target > docID();
+ if (!advanceMin(target)) {
+ return NO_MORE_DOCS;
+ }
+ while (min.doc < max.doc) {
+ if (!advanceMin(max.doc)) {
+ return NO_MORE_DOCS;
+ }
+ }
+ return max.doc;
+ }
+
+ @Override
+ public long cost() {
+ return SloppyPhraseScorer.this.cost();
+ }
+ };
+ }
+
+ @Override
+ public boolean matches() throws IOException {
+ sloppyFreq = phraseFreq(); // check for phrase
+ return sloppyFreq != 0F;
+ }
+ };
+ }
}
Index: lucene/test-framework/src/java/org/apache/lucene/search/SearchEquivalenceTestBase.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/search/SearchEquivalenceTestBase.java (revision 1661344)
+++ lucene/test-framework/src/java/org/apache/lucene/search/SearchEquivalenceTestBase.java (working copy)
@@ -31,6 +31,7 @@
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.TestUtil;
@@ -171,11 +172,28 @@
* Both queries will be filtered by <code>filter</code>
*/
protected void assertSubsetOf(Query q1, Query q2, Filter filter) throws Exception {
- // TRUNK ONLY: test both filter code paths
- if (filter != null && random().nextBoolean()) {
- q1 = new FilteredQuery(q1, filter, TestUtil.randomFilterStrategy(random()));
- q2 = new FilteredQuery(q2, filter, TestUtil.randomFilterStrategy(random()));
- filter = null;
+ if (filter != null) {
+ int res = random().nextInt(3);
+ if (res == 0) {
+ // use FilteredQuery explicitly
+ q1 = new FilteredQuery(q1, filter, TestUtil.randomFilterStrategy(random()));
+ q2 = new FilteredQuery(q2, filter, TestUtil.randomFilterStrategy(random()));
+ filter = null;
+ } else if (res == 1) {
+ // use BooleanQuery FILTER clause
+ BooleanQuery bq1 = new BooleanQuery();
+ bq1.add(q1, Occur.MUST);
+ bq1.add(filter, Occur.FILTER);
+ q1 = bq1;
+
+ BooleanQuery bq2 = new BooleanQuery();
+ bq2.add(q2, Occur.MUST);
+ bq2.add(filter, Occur.FILTER);
+ q2 = bq2;
+ filter = null;
+ } else {
+ // do nothing, we use search(q, filter, int, ...) in this case.
+ }
}
// not efficient, but simple!
@@ -207,10 +225,28 @@
}
protected void assertSameScores(Query q1, Query q2, Filter filter) throws Exception {
- if (filter != null && random().nextBoolean()) {
- q1 = new FilteredQuery(q1, filter, TestUtil.randomFilterStrategy(random()));
- q2 = new FilteredQuery(q2, filter, TestUtil.randomFilterStrategy(random()));
- filter = null;
+ if (filter != null) {
+ int res = random().nextInt(3);
+ if (res == 0) {
+ // use FilteredQuery explicitly
+ q1 = new FilteredQuery(q1, filter, TestUtil.randomFilterStrategy(random()));
+ q2 = new FilteredQuery(q2, filter, TestUtil.randomFilterStrategy(random()));
+ filter = null;
+ } else if (res == 1) {
+ // use BooleanQuery FILTER clause
+ BooleanQuery bq1 = new BooleanQuery();
+ bq1.add(q1, Occur.MUST);
+ bq1.add(filter, Occur.FILTER);
+ q1 = bq1;
+
+ BooleanQuery bq2 = new BooleanQuery();
+ bq2.add(q2, Occur.MUST);
+ bq2.add(filter, Occur.FILTER);
+ q2 = bq2;
+ filter = null;
+ } else {
+ // do nothing, we use search(q, filter, int) in this case.
+ }
}
// not efficient, but simple!