diff --git a/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java b/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
index 351d27b..16664ea 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
@@ -17,6 +17,7 @@ package org.apache.lucene.search;
* limitations under the License.
*/
+import org.apache.lucene.search.positions.ConjunctionPositionIterator;
import org.apache.lucene.search.positions.PositionIntervalIterator;
import java.io.IOException;
@@ -122,7 +123,6 @@ class ReqExclScorer extends Scorer {
@Override
public PositionIntervalIterator positions(boolean needsPayloads, boolean needsOffsets) throws IOException {
- // nocommit implement this
- throw new UnsupportedOperationException();
+ return new ConjunctionPositionIterator(this, new Scorer[] { reqScorer });
}
}
diff --git a/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java b/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
index e9750ab..c744f75 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
@@ -16,6 +16,7 @@ package org.apache.lucene.search;
* limitations under the License.
*/
+import org.apache.lucene.search.positions.DisjunctionPositionIterator;
import org.apache.lucene.search.positions.PositionIntervalIterator;
import java.io.IOException;
@@ -84,8 +85,7 @@ class ReqOptSumScorer extends Scorer {
@Override
public PositionIntervalIterator positions(boolean needsPayloads, boolean needsOffsets) throws IOException {
- // nocommit implement this
- throw new UnsupportedOperationException();
+ return new DisjunctionPositionIterator(this, new Scorer[] { reqScorer, optScorer });
}
}
diff --git a/lucene/highlighter/src/test/org/apache/lucene/search/poshighlight/PosHighlighterTest.java b/lucene/highlighter/src/test/org/apache/lucene/search/poshighlight/PosHighlighterTest.java
index 1601ad3..b0cd608 100644
--- a/lucene/highlighter/src/test/org/apache/lucene/search/poshighlight/PosHighlighterTest.java
+++ b/lucene/highlighter/src/test/org/apache/lucene/search/poshighlight/PosHighlighterTest.java
@@ -1,7 +1,5 @@
package org.apache.lucene.search.poshighlight;
-import java.io.IOException;
-
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.analysis.MockTokenizer;
@@ -20,15 +18,8 @@ import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.*;
import org.apache.lucene.search.BooleanClause.Occur;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.MultiTermQuery;
-import org.apache.lucene.search.PhraseQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.SimpleFragmenter;
@@ -42,6 +33,8 @@ import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util._TestUtil;
import org.junit.Ignore;
+import java.io.IOException;
+
/**
* TODO: FIX THIS TEST Phrase and Span Queries positions callback API
*/
@@ -299,6 +292,34 @@ public class PosHighlighterTest extends LuceneTestCase {
assertEquals("This is a test", frags[0]);
close();
}
+
+ public void testMixedBooleanNot() throws Exception {
+ insertDocs(analyzer, "this is a test", "that is an elephant");
+ BooleanQuery bq = new BooleanQuery();
+ bq.add(new BooleanClause(new TermQuery(new Term(F, "test")), Occur.MUST));
+ bq.add(new BooleanClause(new TermQuery(new Term(F, "that")), Occur.MUST_NOT));
+ String frags[] = doSearch(bq);
+ assertEquals("this is a test", frags[0]);
+ close();
+ }
+
+ public void testMixedBooleanShould() throws Exception {
+ insertDocs(analyzer, "this is a test", "that is an elephant", "the other was a rhinoceros");
+ BooleanQuery bq = new BooleanQuery();
+ bq.add(new BooleanClause(new TermQuery(new Term(F, "is")), Occur.MUST));
+ bq.add(new BooleanClause(new TermQuery(new Term(F, "test")), Occur.SHOULD));
+ String frags[] = doSearch(bq, 50, 0);
+ assertEquals("this is a test", frags[0]);
+ frags = doSearch(bq, 50, 1);
+ assertEquals("that is an elephant", frags[0]);
+
+ bq.add(new BooleanClause(new TermQuery(new Term(F, "rhinoceros")), Occur.SHOULD));
+ frags = doSearch(bq, 50, 0);
+ assertEquals("this is a test", frags[0]);
+ frags = doSearch(bq, 50, 1);
+ assertEquals("that is an elephant", frags[0]);
+
+ }
public void testMultipleDocumentsAnd() throws Exception {
insertDocs(analyzer, "This document has no matches", PORRIDGE_VERSE,