You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/01/05 21:47:11 UTC
svn commit: r1055636 [2/3] - in /lucene/dev/trunk: lucene/
lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/
lucene/contrib/memory/src/java/org/apache/lucene/index/memory/
lucene/contrib/queries/src/java/org/apache/lucene/searc...
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FilteredQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FilteredQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FilteredQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FilteredQuery.java Wed Jan 5 20:47:08 2011
@@ -18,6 +18,7 @@ package org.apache.lucene.search;
*/
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.util.ToStringUtils;
@@ -81,7 +82,7 @@ extends Query {
}
@Override
- public Explanation explain (IndexReader ir, int i) throws IOException {
+ public Explanation explain (ReaderContext ir, int i) throws IOException {
Explanation inner = weight.explain (ir, i);
if (getBoost()!=1) {
Explanation preBoost = inner;
@@ -111,7 +112,7 @@ extends Query {
// return a filtering scorer
@Override
- public Scorer scorer(IndexReader indexReader, boolean scoreDocsInOrder, boolean topScorer)
+ public Scorer scorer(ReaderContext indexReader, boolean scoreDocsInOrder, boolean topScorer)
throws IOException {
final Scorer scorer = weight.scorer(indexReader, true, false);
if (scorer == null) {
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/IndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/IndexSearcher.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/IndexSearcher.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/IndexSearcher.java Wed Jan 5 20:47:08 2011
@@ -18,9 +18,7 @@ package org.apache.lucene.search;
*/
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Iterator;
-import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
@@ -35,6 +33,8 @@ import org.apache.lucene.document.Docume
import org.apache.lucene.document.FieldSelector;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.NIOFSDirectory; // javadoc
@@ -57,14 +57,15 @@ import org.apache.lucene.util.ThreadInte
* use your own (non-Lucene) objects instead.</p>
*/
public class IndexSearcher {
- IndexReader reader;
+ final IndexReader reader; // package private for testing!
private boolean closeReader;
// NOTE: these members might change in incompatible ways
// in the next release
- protected final IndexReader[] subReaders;
+ protected final ReaderContext readerContext;
+ protected final AtomicReaderContext[] leafContexts;
protected final IndexSearcher[] subSearchers;
- protected final int[] docStarts;
+// protected final int[] docStarts;
private final ExecutorService executor;
/** The Similarity implementation used by this searcher. */
@@ -115,83 +116,73 @@ public class IndexSearcher {
this(r, false, executor);
}
- /** Expert: directly specify the reader, subReaders and
- * their docID starts.
- *
- * @lucene.experimental */
- public IndexSearcher(IndexReader reader, IndexReader[] subReaders, int[] docStarts) {
- this.reader = reader;
- this.subReaders = subReaders;
- this.docStarts = docStarts;
- subSearchers = new IndexSearcher[subReaders.length];
- for(int i=0;i<subReaders.length;i++) {
- subSearchers[i] = new IndexSearcher(subReaders[i]);
- }
- closeReader = false;
- executor = null;
+ /**
+ * Creates a searcher searching the provided top-level {@link ReaderContext}.
+ * <p>
+ * Given a non-<code>null</code> {@link ExecutorService} this method runs
+ * searches for each segment separately, using the provided ExecutorService.
+ * IndexSearcher will not shutdown/awaitTermination this ExecutorService on
+ * close; you must do so, eventually, on your own. NOTE: if you are using
+ * {@link NIOFSDirectory}, do not use the shutdownNow method of
+ * ExecutorService as this uses Thread.interrupt under-the-hood which can
+ * silently close file descriptors (see <a
+ * href="https://issues.apache.org/jira/browse/LUCENE-2239">LUCENE-2239</a>).
+ *
+ * @see ReaderContext
+ * @see IndexReader#getTopReaderContext()
+ * @lucene.experimental
+ */
+ public IndexSearcher(ReaderContext context, ExecutorService executor) {
+ this(context, false, executor);
+ }
+
+ /**
+ * Creates a searcher searching the provided top-level {@link ReaderContext}.
+ *
+ * @see ReaderContext
+ * @see IndexReader#getTopReaderContext()
+ * @lucene.experimental
+ */
+ public IndexSearcher(ReaderContext context) {
+ this(context, null);
}
- /** Expert: directly specify the reader, subReaders and
- * their docID starts, and an ExecutorService. In this
- * case, each segment will be separately searched using the
- * ExecutorService. IndexSearcher will not
- * shutdown/awaitTermination this ExecutorService on
- * close; you must do so, eventually, on your own. NOTE:
- * if you are using {@link NIOFSDirectory}, do not use
- * the shutdownNow method of ExecutorService as this uses
- * Thread.interrupt under-the-hood which can silently
- * close file descriptors (see <a
- * href="https://issues.apache.org/jira/browse/LUCENE-2239">LUCENE-2239</a>).
- *
- * @lucene.experimental */
- public IndexSearcher(IndexReader reader, IndexReader[] subReaders, int[] docStarts, ExecutorService executor) {
- this.reader = reader;
- this.subReaders = subReaders;
- this.docStarts = docStarts;
- subSearchers = new IndexSearcher[subReaders.length];
- for(int i=0;i<subReaders.length;i++) {
- subSearchers[i] = new IndexSearcher(subReaders[i]);
- }
- closeReader = false;
- this.executor = executor;
+ // convinience ctor for other IR based ctors
+ private IndexSearcher(IndexReader reader, boolean closeReader, ExecutorService executor) {
+ this(reader.getTopReaderContext(), closeReader, executor);
}
- private IndexSearcher(IndexReader r, boolean closeReader, ExecutorService executor) {
- reader = r;
+ private IndexSearcher(ReaderContext context, boolean closeReader, ExecutorService executor) {
+ // TODO: eable this assert once SolrIndexReader and friends are refactored to use ReaderContext
+ // We can't assert this here since SolrIndexReader will fail in some contexts - once solr is consistent we should be fine here
+ // Lucene instead passes all tests even with this assert!
+ // assert context.isTopLevel: "IndexSearcher's ReaderContext must be topLevel for reader" + context.reader;
+ reader = context.reader;
this.executor = executor;
this.closeReader = closeReader;
-
- List<IndexReader> subReadersList = new ArrayList<IndexReader>();
- gatherSubReaders(subReadersList, reader);
- subReaders = subReadersList.toArray(new IndexReader[subReadersList.size()]);
- docStarts = new int[subReaders.length];
- subSearchers = new IndexSearcher[subReaders.length];
- int maxDoc = 0;
- for (int i = 0; i < subReaders.length; i++) {
- docStarts[i] = maxDoc;
- maxDoc += subReaders[i].maxDoc();
- if (subReaders[i] == r) {
+ this.readerContext = context;
+ if (context.isAtomic) {
+ assert context.leaves() == null : "AtomicReaderContext must not have any leaves";
+ this.leafContexts = new AtomicReaderContext[] { (AtomicReaderContext) context };
+ } else {
+ assert context.leaves() != null : "non-atomic top-level context must have leaves";
+ this.leafContexts = context.leaves();
+ }
+ subSearchers = new IndexSearcher[this.leafContexts.length];
+ for (int i = 0; i < subSearchers.length; i++) { // TODO do we need those IS if executor is null?
+ if (leafContexts[i].reader == context.reader) {
subSearchers[i] = this;
} else {
- subSearchers[i] = new IndexSearcher(subReaders[i]);
+ subSearchers[i] = new IndexSearcher(leafContexts[i].reader.getTopReaderContext()); // we need to get a TL context for sub searchers!
}
}
}
- protected void gatherSubReaders(List<IndexReader> allSubReaders, IndexReader r) {
- ReaderUtil.gatherSubReaders(allSubReaders, r);
- }
-
/** Return the {@link IndexReader} this searches. */
public IndexReader getIndexReader() {
return reader;
}
- /** Returns the atomic subReaders used by this searcher. */
- public IndexReader[] getSubReaders() {
- return subReaders;
- }
-
/** Expert: Returns one greater than the largest possible document number.
*
* @see org.apache.lucene.index.IndexReader#maxDoc()
@@ -206,7 +197,7 @@ public class IndexSearcher {
return reader.docFreq(term);
} else {
final ExecutionHelper<Integer> runner = new ExecutionHelper<Integer>(executor);
- for(int i = 0; i < subReaders.length; i++) {
+ for(int i = 0; i < subSearchers.length; i++) {
final IndexSearcher searchable = subSearchers[i];
runner.submit(new Callable<Integer>() {
public Integer call() throws IOException {
@@ -369,9 +360,9 @@ public class IndexSearcher {
final Lock lock = new ReentrantLock();
final ExecutionHelper<TopDocs> runner = new ExecutionHelper<TopDocs>(executor);
- for (int i = 0; i < subReaders.length; i++) { // search each sub
+ for (int i = 0; i < subSearchers.length; i++) { // search each sub
runner.submit(
- new MultiSearcherCallableNoSort(lock, subSearchers[i], weight, filter, nDocs, hq, docStarts[i]));
+ new MultiSearcherCallableNoSort(lock, subSearchers[i], weight, filter, nDocs, hq, leafContexts[i].docBase));
}
int totalHits = 0;
@@ -438,9 +429,9 @@ public class IndexSearcher {
final FieldDocSortedHitQueue hq = new FieldDocSortedHitQueue(nDocs);
final Lock lock = new ReentrantLock();
final ExecutionHelper<TopFieldDocs> runner = new ExecutionHelper<TopFieldDocs>(executor);
- for (int i = 0; i < subReaders.length; i++) { // search each sub
+ for (int i = 0; i < subSearchers.length; i++) { // search each sub
runner.submit(
- new MultiSearcherCallableWithSort(lock, subSearchers[i], weight, filter, nDocs, hq, sort, docStarts[i]));
+ new MultiSearcherCallableWithSort(lock, subSearchers[i], weight, filter, nDocs, hq, sort, leafContexts[i].docBase));
}
int totalHits = 0;
float maxScore = Float.NEGATIVE_INFINITY;
@@ -484,27 +475,27 @@ public class IndexSearcher {
// always use single thread:
if (filter == null) {
- for (int i = 0; i < subReaders.length; i++) { // search each subreader
- collector.setNextReader(subReaders[i], docStarts[i]);
- Scorer scorer = weight.scorer(subReaders[i], !collector.acceptsDocsOutOfOrder(), true);
+ for (int i = 0; i < leafContexts.length; i++) { // search each subreader
+ collector.setNextReader(leafContexts[i].reader, leafContexts[i].docBase);
+ Scorer scorer = weight.scorer(leafContexts[i], !collector.acceptsDocsOutOfOrder(), true);
if (scorer != null) {
scorer.score(collector);
}
}
} else {
- for (int i = 0; i < subReaders.length; i++) { // search each subreader
- collector.setNextReader(subReaders[i], docStarts[i]);
- searchWithFilter(subReaders[i], weight, filter, collector);
+ for (int i = 0; i < leafContexts.length; i++) { // search each subreader
+ collector.setNextReader(leafContexts[i].reader, leafContexts[i].docBase);
+ searchWithFilter(leafContexts[i], weight, filter, collector);
}
}
}
- private void searchWithFilter(IndexReader reader, Weight weight,
+ private void searchWithFilter(ReaderContext context, Weight weight,
final Filter filter, final Collector collector) throws IOException {
assert filter != null;
- Scorer scorer = weight.scorer(reader, true, false);
+ Scorer scorer = weight.scorer(context, true, false);
if (scorer == null) {
return;
}
@@ -513,7 +504,7 @@ public class IndexSearcher {
assert docID == -1 || docID == DocIdSetIterator.NO_MORE_DOCS;
// CHECKME: use ConjunctionScorer here?
- DocIdSet filterDocIdSet = filter.getDocIdSet(reader);
+ DocIdSet filterDocIdSet = filter.getDocIdSet(context);
if (filterDocIdSet == null) {
// this means the filter does not accept any documents.
return;
@@ -581,10 +572,10 @@ public class IndexSearcher {
* @throws BooleanQuery.TooManyClauses
*/
protected Explanation explain(Weight weight, int doc) throws IOException {
- int n = ReaderUtil.subIndex(doc, docStarts);
- int deBasedDoc = doc - docStarts[n];
+ int n = ReaderUtil.subIndex(doc, leafContexts);
+ int deBasedDoc = doc - leafContexts[n].docBase;
- return weight.explain(subReaders[n], deBasedDoc);
+ return weight.explain(leafContexts[n], deBasedDoc);
}
private boolean fieldSortDoTrackScores;
@@ -615,6 +606,14 @@ public class IndexSearcher {
return query.weight(this);
}
+ /**
+ * Returns this searchers the top-level {@link ReaderContext}.
+ * @see IndexReader#getTopReaderContext()
+ */
+ /* Sugar for .getIndexReader().getTopReaderContext() */
+ public ReaderContext getTopReaderContext() {
+ return readerContext;
+ }
/**
* A thread subclass for searching a single searchable
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MatchAllDocsQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MatchAllDocsQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MatchAllDocsQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MatchAllDocsQuery.java Wed Jan 5 20:47:08 2011
@@ -18,6 +18,7 @@ package org.apache.lucene.search;
*/
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.util.ToStringUtils;
import org.apache.lucene.util.Bits;
@@ -126,13 +127,13 @@ public class MatchAllDocsQuery extends Q
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
- return new MatchAllScorer(reader, similarity, this,
- normsField != null ? reader.norms(normsField) : null);
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ return new MatchAllScorer(context.reader, similarity, this,
+ normsField != null ? context.reader.norms(normsField) : null);
}
@Override
- public Explanation explain(IndexReader reader, int doc) {
+ public Explanation explain(ReaderContext context, int doc) {
// explain query weight
Explanation queryExpl = new ComplexExplanation
(true, getValue(), "MatchAllDocsQuery, product of:");
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java Wed Jan 5 20:47:08 2011
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.util.*;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.DocsEnum;
import org.apache.lucene.index.DocsAndPositionsEnum;
@@ -167,10 +168,10 @@ public class MultiPhraseQuery extends Qu
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
if (termArrays.size() == 0) // optimize zero-term case
return null;
-
+ final IndexReader reader = context.reader;
final Bits delDocs = reader.getDeletedDocs();
PhraseQuery.PostingsAndFreq[] postingsFreqs = new PhraseQuery.PostingsAndFreq[termArrays.size()];
@@ -219,7 +220,7 @@ public class MultiPhraseQuery extends Qu
if (slop == 0) {
ExactPhraseScorer s = new ExactPhraseScorer(this, postingsFreqs, similarity,
- reader.norms(field));
+ reader.norms(field));
if (s.noDocs) {
return null;
} else {
@@ -232,7 +233,7 @@ public class MultiPhraseQuery extends Qu
}
@Override
- public Explanation explain(IndexReader reader, int doc)
+ public Explanation explain(ReaderContext context, int doc)
throws IOException {
ComplexExplanation result = new ComplexExplanation();
result.setDescription("weight("+getQuery()+" in "+doc+"), product of:");
@@ -263,7 +264,7 @@ public class MultiPhraseQuery extends Qu
fieldExpl.setDescription("fieldWeight("+getQuery()+" in "+doc+
"), product of:");
- Scorer scorer = scorer(reader, true, false);
+ Scorer scorer = scorer(context, true, false);
if (scorer == null) {
return new Explanation(0.0f, "no matching docs");
}
@@ -283,7 +284,7 @@ public class MultiPhraseQuery extends Qu
fieldExpl.addDetail(idfExpl);
Explanation fieldNormExpl = new Explanation();
- byte[] fieldNorms = reader.norms(field);
+ byte[] fieldNorms = context.reader.norms(field);
float fieldNorm =
fieldNorms!=null ? similarity.decodeNormValue(fieldNorms[doc]) : 1.0f;
fieldNormExpl.setValue(fieldNorm);
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiTermQueryWrapperFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiTermQueryWrapperFilter.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiTermQueryWrapperFilter.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/MultiTermQueryWrapperFilter.java Wed Jan 5 20:47:08 2011
@@ -19,8 +19,9 @@ package org.apache.lucene.search;
import java.io.IOException;
-import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Fields;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.index.DocsEnum;
@@ -104,7 +105,8 @@ public class MultiTermQueryWrapperFilter
* results.
*/
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
+ final IndexReader reader = context.reader;
final Fields fields = reader.fields();
if (fields == null) {
// reader has no fields
@@ -121,7 +123,7 @@ public class MultiTermQueryWrapperFilter
assert termsEnum != null;
if (termsEnum.next() != null) {
// fill into a OpenBitSet
- final OpenBitSet bitSet = new OpenBitSet(reader.maxDoc());
+ final OpenBitSet bitSet = new OpenBitSet(context.reader.maxDoc());
int termCount = 0;
final Bits delDocs = reader.getDeletedDocs();
DocsEnum docsEnum = null;
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/PhraseQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/PhraseQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/PhraseQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/PhraseQuery.java Wed Jan 5 20:47:08 2011
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.util.Set;
import java.util.ArrayList;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.DocsAndPositionsEnum;
import org.apache.lucene.index.IndexReader;
@@ -174,10 +175,10 @@ public class PhraseQuery extends Query {
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
if (terms.size() == 0) // optimize zero-term case
return null;
-
+ final IndexReader reader = context.reader;
PostingsAndFreq[] postingsFreqs = new PostingsAndFreq[terms.size()];
final Bits delDocs = reader.getDeletedDocs();
for (int i = 0; i < terms.size(); i++) {
@@ -206,7 +207,7 @@ public class PhraseQuery extends Query {
if (slop == 0) { // optimize exact case
ExactPhraseScorer s = new ExactPhraseScorer(this, postingsFreqs, similarity,
- reader.norms(field));
+ reader.norms(field));
if (s.noDocs) {
return null;
} else {
@@ -215,12 +216,12 @@ public class PhraseQuery extends Query {
} else {
return
new SloppyPhraseScorer(this, postingsFreqs, similarity, slop,
- reader.norms(field));
+ reader.norms(field));
}
}
@Override
- public Explanation explain(IndexReader reader, int doc)
+ public Explanation explain(ReaderContext context, int doc)
throws IOException {
Explanation result = new Explanation();
@@ -267,7 +268,7 @@ public class PhraseQuery extends Query {
fieldExpl.setDescription("fieldWeight("+field+":"+query+" in "+doc+
"), product of:");
- Scorer scorer = scorer(reader, true, false);
+ Scorer scorer = scorer(context, true, false);
if (scorer == null) {
return new Explanation(0.0f, "no matching docs");
}
@@ -287,7 +288,7 @@ public class PhraseQuery extends Query {
fieldExpl.addDetail(idfExpl);
Explanation fieldNormExpl = new Explanation();
- byte[] fieldNorms = reader.norms(field);
+ byte[] fieldNorms = context.reader.norms(field);
float fieldNorm =
fieldNorms!=null ? similarity.decodeNormValue(fieldNorms[doc]) : 1.0f;
fieldNormExpl.setValue(fieldNorm);
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/QueryWrapperFilter.java Wed Jan 5 20:47:08 2011
@@ -18,9 +18,7 @@ package org.apache.lucene.search;
*/
import java.io.IOException;
-
-
-import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
/**
* Constrains search results to only match those which also match a provided
@@ -48,12 +46,14 @@ public class QueryWrapperFilter extends
}
@Override
- public DocIdSet getDocIdSet(final IndexReader reader) throws IOException {
- final Weight weight = query.weight(new IndexSearcher(reader));
+ public DocIdSet getDocIdSet(final ReaderContext context) throws IOException {
+ // get a private context that is used to rewrite, createWeight and score eventually
+ final ReaderContext privateContext = context.reader.getTopReaderContext();
+ final Weight weight = query.weight(new IndexSearcher(privateContext));
return new DocIdSet() {
@Override
public DocIdSetIterator iterator() throws IOException {
- return weight.scorer(reader, true, false);
+ return weight.scorer(privateContext, true, false);
}
@Override
public boolean isCacheable() { return false; }
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/SpanQueryFilter.java Wed Jan 5 20:47:08 2011
@@ -17,6 +17,7 @@ package org.apache.lucene.search;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.search.spans.SpanQuery;
import org.apache.lucene.search.spans.Spans;
import org.apache.lucene.util.OpenBitSet;
@@ -52,8 +53,8 @@ public class SpanQueryFilter extends Spa
}
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
- SpanFilterResult result = bitSpans(reader);
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
+ SpanFilterResult result = bitSpans(context.reader);
return result.getDocIdSet();
}
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/TermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/TermQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/TermQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/TermQuery.java Wed Jan 5 20:47:08 2011
@@ -21,8 +21,10 @@ import java.io.IOException;
import java.util.Set;
import org.apache.lucene.index.DocsEnum;
-import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
+import org.apache.lucene.index.Term;
import org.apache.lucene.search.Explanation.IDFExplanation;
import org.apache.lucene.util.ToStringUtils;
@@ -75,7 +77,8 @@ public class TermQuery extends Query {
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ final IndexReader reader = context.reader;
DocsEnum docs = reader.termDocsEnum(reader.getDeletedDocs(),
term.field(),
term.bytes());
@@ -88,8 +91,9 @@ public class TermQuery extends Query {
}
@Override
- public Explanation explain(IndexReader reader, int doc)
+ public Explanation explain(ReaderContext context, int doc)
throws IOException {
+ final IndexReader reader = context.reader;
ComplexExplanation result = new ComplexExplanation();
result.setDescription("weight("+getQuery()+" in "+doc+"), product of:");
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/Weight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/Weight.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/Weight.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/Weight.java Wed Jan 5 20:47:08 2011
@@ -21,16 +21,26 @@ import java.io.IOException;
import java.io.Serializable;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
/**
* Expert: Calculate query weights and build query scorers.
* <p>
- * The purpose of {@link Weight} is to ensure searching does not
- * modify a {@link Query}, so that a {@link Query} instance can be reused. <br>
+ * The purpose of {@link Weight} is to ensure searching does not modify a
+ * {@link Query}, so that a {@link Query} instance can be reused. <br>
* {@link IndexSearcher} dependent state of the query should reside in the
* {@link Weight}. <br>
* {@link IndexReader} dependent state should reside in the {@link Scorer}.
* <p>
+ * Since {@link Weight} creates {@link Scorer} instances for a given
+ * {@link ReaderContext} ({@link #scorer(ReaderContext, boolean, boolean)})
+ * callers must maintain the relationship between the searcher's top-level
+ * {@link ReaderContext} and the context used to create a {@link Scorer}. A
+ * {@link ReaderContext} used to create a {@link Scorer} should be a leaf
+ * context ({@link AtomicReaderContext}) of the searcher's top-level context,
+ * otherwise the scorer's state will be undefined.
+ * <p>
* A <code>Weight</code> is used in the following way:
* <ol>
* <li>A <code>Weight</code> is constructed by a top-level query, given a
@@ -41,9 +51,11 @@ import org.apache.lucene.index.IndexRead
* query.
* <li>The query normalization factor is passed to {@link #normalize(float)}. At
* this point the weighting is complete.
- * <li>A <code>Scorer</code> is constructed by {@link #scorer(IndexReader,boolean,boolean)}.
+ * <li>A <code>Scorer</code> is constructed by
+ * {@link #scorer(ReaderContext,boolean,boolean)}.
* </ol>
*
+ *
* @since 2.9
*/
public abstract class Weight implements Serializable {
@@ -51,12 +63,12 @@ public abstract class Weight implements
/**
* An explanation of the score computation for the named document.
*
- * @param reader sub-reader containing the give doc
- * @param doc
+ * @param context the readers context to create the {@link Explanation} for.
+ * @param doc the document's id relative to the given context's reader
* @return an Explanation for the score
- * @throws IOException
+ * @throws IOException if an {@link IOException} occurs
*/
- public abstract Explanation explain(IndexReader reader, int doc) throws IOException;
+ public abstract Explanation explain(ReaderContext context, int doc) throws IOException;
/** The query that this concerns. */
public abstract Query getQuery();
@@ -78,9 +90,12 @@ public abstract class Weight implements
* in-order.<br>
* <b>NOTE:</b> null can be returned if no documents will be scored by this
* query.
+ * <b>NOTE: Calling this method with a {@link ReaderContext} that is not a
+ * leaf context ({@link AtomicReaderContext}) of the searcher's top-level context
+ * used to create this {@link Weight} instance can cause undefined behavior.
*
- * @param reader
- * the {@link IndexReader} for which to return the {@link Scorer}.
+ * @param context
+ * the {@link ReaderContext} for which to return the {@link Scorer}.
* @param scoreDocsInOrder
* specifies whether in-order scoring of documents is required. Note
* that if set to false (i.e., out-of-order scoring is required),
@@ -96,7 +111,8 @@ public abstract class Weight implements
* @return a {@link Scorer} which scores documents in/out-of order.
* @throws IOException
*/
- public abstract Scorer scorer(IndexReader reader, boolean scoreDocsInOrder,
+ // TODO make this context an AtomicContext if possible
+ public abstract Scorer scorer(ReaderContext context, boolean scoreDocsInOrder,
boolean topScorer) throws IOException;
/** The sum of squared weights of contained query clauses. */
@@ -106,7 +122,7 @@ public abstract class Weight implements
* Returns true iff this implementation scores docs only out of order. This
* method is used in conjunction with {@link Collector}'s
* {@link Collector#acceptsDocsOutOfOrder() acceptsDocsOutOfOrder} and
- * {@link #scorer(org.apache.lucene.index.IndexReader, boolean, boolean)} to
+ * {@link #scorer(ReaderContext, boolean, boolean)} to
* create a matching {@link Scorer} instance for a given {@link Collector}, or
* vice versa.
* <p>
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/CustomScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/CustomScoreQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/CustomScoreQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/CustomScoreQuery.java Wed Jan 5 20:47:08 2011
@@ -22,6 +22,7 @@ import java.util.Set;
import java.util.Arrays;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.ComplexExplanation;
import org.apache.lucene.search.Explanation;
@@ -239,40 +240,40 @@ public class CustomScoreQuery extends Qu
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
// Pass true for "scoresDocsInOrder", because we
// require in-order scoring, even if caller does not,
// since we call advance on the valSrcScorers. Pass
// false for "topScorer" because we will not invoke
// score(Collector) on these scorers:
- Scorer subQueryScorer = subQueryWeight.scorer(reader, true, false);
+ Scorer subQueryScorer = subQueryWeight.scorer(context, true, false);
if (subQueryScorer == null) {
return null;
}
Scorer[] valSrcScorers = new Scorer[valSrcWeights.length];
for(int i = 0; i < valSrcScorers.length; i++) {
- valSrcScorers[i] = valSrcWeights[i].scorer(reader, true, topScorer);
+ valSrcScorers[i] = valSrcWeights[i].scorer(context, true, topScorer);
}
- return new CustomScorer(similarity, reader, this, subQueryScorer, valSrcScorers);
+ return new CustomScorer(similarity, context.reader, this, subQueryScorer, valSrcScorers);
}
@Override
- public Explanation explain(IndexReader reader, int doc) throws IOException {
- Explanation explain = doExplain(reader, doc);
+ public Explanation explain(ReaderContext context, int doc) throws IOException {
+ Explanation explain = doExplain(context, doc);
return explain == null ? new Explanation(0.0f, "no matching docs") : explain;
}
- private Explanation doExplain(IndexReader reader, int doc) throws IOException {
- Explanation subQueryExpl = subQueryWeight.explain(reader, doc);
+ private Explanation doExplain(ReaderContext info, int doc) throws IOException {
+ Explanation subQueryExpl = subQueryWeight.explain(info, doc);
if (!subQueryExpl.isMatch()) {
return subQueryExpl;
}
// match
Explanation[] valSrcExpls = new Explanation[valSrcWeights.length];
for(int i = 0; i < valSrcWeights.length; i++) {
- valSrcExpls[i] = valSrcWeights[i].explain(reader, doc);
+ valSrcExpls[i] = valSrcWeights[i].explain(info, doc);
}
- Explanation customExp = CustomScoreQuery.this.getCustomScoreProvider(reader).customExplain(doc,subQueryExpl,valSrcExpls);
+ Explanation customExp = CustomScoreQuery.this.getCustomScoreProvider(info.reader).customExplain(doc,subQueryExpl,valSrcExpls);
float sc = getValue() * customExp.getValue();
Explanation res = new ComplexExplanation(
true, sc, CustomScoreQuery.this.toString() + ", product of:");
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/ValueSourceQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/ValueSourceQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/ValueSourceQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/function/ValueSourceQuery.java Wed Jan 5 20:47:08 2011
@@ -19,6 +19,7 @@ package org.apache.lucene.search.functio
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.*;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.util.ToStringUtils;
import org.apache.lucene.util.Bits;
@@ -98,14 +99,14 @@ public class ValueSourceQuery extends Qu
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
- return new ValueSourceScorer(similarity, reader, this);
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ return new ValueSourceScorer(similarity, context.reader, this);
}
/*(non-Javadoc) @see org.apache.lucene.search.Weight#explain(org.apache.lucene.index.IndexReader, int) */
@Override
- public Explanation explain(IndexReader reader, int doc) throws IOException {
- DocValues vals = valSrc.getValues(reader);
+ public Explanation explain(ReaderContext context, int doc) throws IOException {
+ DocValues vals = valSrc.getValues(context.reader);
float sc = queryWeight * vals.floatVal(doc);
Explanation result = new ComplexExplanation(
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java Wed Jan 5 20:47:08 2011
@@ -17,7 +17,7 @@ package org.apache.lucene.search.payload
* limitations under the License.
*/
-import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.IndexSearcher;
@@ -143,10 +143,10 @@ public class PayloadNearQuery extends Sp
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder,
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder,
boolean topScorer) throws IOException {
- return new PayloadNearSpanScorer(query.getSpans(reader), this,
- similarity, reader.norms(query.getField()));
+ return new PayloadNearSpanScorer(query.getSpans(context.reader), this,
+ similarity, context.reader.norms(query.getField()));
}
}
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java Wed Jan 5 20:47:08 2011
@@ -17,9 +17,9 @@ package org.apache.lucene.search.payload
* limitations under the License.
*/
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.DocsAndPositionsEnum;
-import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.Weight;
@@ -74,10 +74,10 @@ public class PayloadTermQuery extends Sp
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder,
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder,
boolean topScorer) throws IOException {
- return new PayloadTermSpanScorer((TermSpans) query.getSpans(reader),
- this, similarity, reader.norms(query.getField()));
+ return new PayloadTermSpanScorer((TermSpans) query.getSpans(context.reader),
+ this, similarity, context.reader.norms(query.getField()));
}
protected class PayloadTermSpanScorer extends SpanScorer {
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanWeight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanWeight.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanWeight.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanWeight.java Wed Jan 5 20:47:08 2011
@@ -17,7 +17,7 @@ package org.apache.lucene.search.spans;
* limitations under the License.
*/
-import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
import org.apache.lucene.search.Explanation.IDFExplanation;
@@ -72,13 +72,13 @@ public class SpanWeight extends Weight {
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
- return new SpanScorer(query.getSpans(reader), this, similarity, reader
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
+ return new SpanScorer(query.getSpans(context.reader), this, similarity, context.reader
.norms(query.getField()));
}
@Override
- public Explanation explain(IndexReader reader, int doc)
+ public Explanation explain(ReaderContext context, int doc)
throws IOException {
ComplexExplanation result = new ComplexExplanation();
@@ -111,12 +111,12 @@ public class SpanWeight extends Weight {
fieldExpl.setDescription("fieldWeight("+field+":"+query.toString(field)+
" in "+doc+"), product of:");
- Explanation tfExpl = ((SpanScorer)scorer(reader, true, false)).explain(doc);
+ Explanation tfExpl = ((SpanScorer)scorer(context, true, false)).explain(doc);
fieldExpl.addDetail(tfExpl);
fieldExpl.addDetail(idfExpl);
Explanation fieldNormExpl = new Explanation();
- byte[] fieldNorms = reader.norms(field);
+ byte[] fieldNorms = context.reader.norms(field);
float fieldNorm =
fieldNorms!=null ? similarity.decodeNormValue(fieldNorms[doc]) : 1.0f;
fieldNormExpl.setValue(fieldNorm);
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/ReaderUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/ReaderUtil.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/ReaderUtil.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/ReaderUtil.java Wed Jan 5 20:47:08 2011
@@ -19,9 +19,13 @@ package org.apache.lucene.util;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.CompositeReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
/**
* Common util methods for dealing with {@link IndexReader}s.
@@ -148,6 +152,67 @@ public final class ReaderUtil {
.toArray(new IndexReader[subReadersList.size()]);
return subReaders[subIndex];
}
+
+ public static ReaderContext buildReaderContext(IndexReader reader) {
+ return new ReaderContextBuilder(reader).build();
+ }
+
+ public static class ReaderContextBuilder {
+ private final IndexReader reader;
+ private final AtomicReaderContext[] leaves;
+ private int leafOrd = 0;
+ private int leafDocBase = 0;
+ public ReaderContextBuilder(IndexReader reader) {
+ this.reader = reader;
+ leaves = new AtomicReaderContext[numLeaves(reader)];
+ }
+
+ public ReaderContext build() {
+ return build(null, reader, 0, 0);
+ }
+
+ private ReaderContext build(CompositeReaderContext parent, IndexReader reader, int ord, int docBase) {
+ IndexReader[] sequentialSubReaders = reader.getSequentialSubReaders();
+ if (sequentialSubReaders == null) {
+ AtomicReaderContext atomic = new AtomicReaderContext(parent, reader, ord, docBase, leafOrd, leafDocBase);
+ leaves[leafOrd++] = atomic;
+ leafDocBase += reader.maxDoc();
+ return atomic;
+ } else {
+ ReaderContext[] children = new ReaderContext[sequentialSubReaders.length];
+ final CompositeReaderContext newParent;
+ if (parent == null) {
+ newParent = new CompositeReaderContext(reader, children, leaves);
+ } else {
+ newParent = new CompositeReaderContext(parent, reader, ord, docBase, children);
+ }
+
+ int newDocBase = 0;
+ for (int i = 0; i < sequentialSubReaders.length; i++) {
+ build(newParent, sequentialSubReaders[i], i, newDocBase);
+ newDocBase += sequentialSubReaders[i].maxDoc();
+ }
+ return newParent;
+ }
+ }
+
+ private int numLeaves(IndexReader reader) {
+ final AtomicInteger numLeaves = new AtomicInteger();
+ try {
+ new Gather(reader) {
+ @Override
+ protected void add(int base, IndexReader r) {
+ numLeaves.incrementAndGet();
+ }
+ }.run();
+ } catch (IOException ioe) {
+ // won't happen
+ throw new RuntimeException(ioe);
+ }
+ return numLeaves.get();
+ }
+
+ }
/**
@@ -175,4 +240,30 @@ public final class ReaderUtil {
}
return hi;
}
+
+ /**
+ * Returns index of the searcher/reader for document <code>n</code> in the
+ * array used to construct this searcher/reader.
+ */
+ public static int subIndex(int n, AtomicReaderContext[] leaves) { // find
+ // searcher/reader for doc n:
+ int size = leaves.length;
+ int lo = 0; // search starts array
+ int hi = size - 1; // for first element less than n, return its index
+ while (hi >= lo) {
+ int mid = (lo + hi) >>> 1;
+ int midValue = leaves[mid].docBase;
+ if (n < midValue)
+ hi = mid - 1;
+ else if (n > midValue)
+ lo = mid + 1;
+ else { // found a match
+ while (mid + 1 < size && leaves[mid + 1].docBase == midValue) {
+ mid++; // scan to last match
+ }
+ return mid;
+ }
+ }
+ return hi;
+ }
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/CachingWrapperFilterHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/CachingWrapperFilterHelper.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/CachingWrapperFilterHelper.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/CachingWrapperFilterHelper.java Wed Jan 5 20:47:08 2011
@@ -20,7 +20,8 @@ package org.apache.lucene.search;
import java.io.IOException;
import junit.framework.Assert;
-import org.apache.lucene.index.IndexReader;
+
+import org.apache.lucene.index.IndexReader.ReaderContext;
/**
* A unit test helper class to test when the filter is getting cached and when it is not.
@@ -41,10 +42,10 @@ public class CachingWrapperFilterHelper
}
@Override
- public synchronized DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+ public synchronized DocIdSet getDocIdSet(ReaderContext context) throws IOException {
final int saveMissCount = missCount;
- DocIdSet docIdSet = super.getDocIdSet(reader);
+ DocIdSet docIdSet = super.getDocIdSet(context);
if (shouldHaveCache) {
Assert.assertEquals("Cache should have data ", saveMissCount, missCount);
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/JustCompileSearch.java Wed Jan 5 20:47:08 2011
@@ -20,6 +20,7 @@ package org.apache.lucene.search;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.PriorityQueue;
@@ -152,7 +153,7 @@ final class JustCompileSearch {
// still added here in case someone will add abstract methods in the future.
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
return null;
}
}
@@ -281,7 +282,7 @@ final class JustCompileSearch {
}
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
return null;
}
}
@@ -333,7 +334,7 @@ final class JustCompileSearch {
static final class JustCompileWeight extends Weight {
@Override
- public Explanation explain(IndexReader reader, int doc) throws IOException {
+ public Explanation explain(ReaderContext context, int doc) throws IOException {
throw new UnsupportedOperationException(UNSUPPORTED_MSG);
}
@@ -358,7 +359,7 @@ final class JustCompileSearch {
}
@Override
- public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer)
+ public Scorer scorer(ReaderContext context, boolean scoreDocsInOrder, boolean topScorer)
throws IOException {
throw new UnsupportedOperationException(UNSUPPORTED_MSG);
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/MockFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/MockFilter.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/MockFilter.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/MockFilter.java Wed Jan 5 20:47:08 2011
@@ -17,7 +17,7 @@ package org.apache.lucene.search;
* limitations under the License.
*/
-import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.util.DocIdBitSet;
import java.util.BitSet;
@@ -25,7 +25,7 @@ public class MockFilter extends Filter {
private boolean wasCalled;
@Override
- public DocIdSet getDocIdSet(IndexReader reader) {
+ public DocIdSet getDocIdSet(ReaderContext context) {
wasCalled = true;
return new DocIdBitSet(new BitSet());
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java Wed Jan 5 20:47:08 2011
@@ -12,6 +12,8 @@ import junit.framework.Assert;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.MultiReader;
@@ -210,14 +212,22 @@ public class QueryUtils {
throw e2;
}
}
-
+
+ private static AtomicReaderContext[] getLeaves(IndexSearcher searcher) {
+ ReaderContext topLevelReaderContext = searcher.getTopReaderContext();
+ if (topLevelReaderContext.isAtomic) {
+ return new AtomicReaderContext[] {(AtomicReaderContext) topLevelReaderContext};
+ } else {
+ return topLevelReaderContext.leaves();
+ }
+ }
/** alternate scorer skipTo(),skipTo(),next(),next(),skipTo(),skipTo(), etc
* and ensure a hitcollector receives same docs and scores
*/
public static void checkSkipTo(final Query q, final IndexSearcher s) throws IOException {
//System.out.println("Checking "+q);
-
+ final AtomicReaderContext[] context = getLeaves(s);
if (q.weight(s).scoresDocsOutOfOrder()) return; // in this case order of skipTo() might differ from that of next().
final int skip_op = 0;
@@ -247,8 +257,8 @@ public class QueryUtils {
s.search(q, new Collector() {
private Scorer sc;
- private IndexReader reader;
private Scorer scorer;
+ private int leafPtr;
@Override
public void setScorer(Scorer scorer) throws IOException {
@@ -262,7 +272,7 @@ public class QueryUtils {
try {
if (scorer == null) {
Weight w = q.weight(s);
- scorer = w.scorer(reader, true, false);
+ scorer = w.scorer(context[leafPtr], true, false);
}
int op = order[(opidx[0]++) % order.length];
@@ -305,14 +315,17 @@ public class QueryUtils {
// previous reader, hits NO_MORE_DOCS
if (lastReader[0] != null) {
final IndexReader previousReader = lastReader[0];
- Weight w = q.weight(new IndexSearcher(previousReader));
- Scorer scorer = w.scorer(previousReader, true, false);
+ IndexSearcher indexSearcher = new IndexSearcher(previousReader);
+ Weight w = q.weight(indexSearcher);
+ Scorer scorer = w.scorer(indexSearcher.getTopReaderContext(), true, false);
if (scorer != null) {
boolean more = scorer.advance(lastDoc[0] + 1) != DocIdSetIterator.NO_MORE_DOCS;
Assert.assertFalse("query's last doc was "+ lastDoc[0] +" but skipTo("+(lastDoc[0]+1)+") got to "+scorer.docID(),more);
}
+ leafPtr++;
}
- this.reader = lastReader[0] = reader;
+ lastReader[0] = reader;
+ assert context[leafPtr].reader == reader;
this.scorer = null;
lastDoc[0] = -1;
}
@@ -327,8 +340,9 @@ public class QueryUtils {
// confirm that skipping beyond the last doc, on the
// previous reader, hits NO_MORE_DOCS
final IndexReader previousReader = lastReader[0];
- Weight w = q.weight(new IndexSearcher(previousReader));
- Scorer scorer = w.scorer(previousReader, true, false);
+ IndexSearcher indexSearcher = new IndexSearcher(previousReader);
+ Weight w = q.weight(indexSearcher);
+ Scorer scorer = w.scorer(previousReader.getTopReaderContext() , true, false);
if (scorer != null) {
boolean more = scorer.advance(lastDoc[0] + 1) != DocIdSetIterator.NO_MORE_DOCS;
Assert.assertFalse("query's last doc was "+ lastDoc[0] +" but skipTo("+(lastDoc[0]+1)+") got to "+scorer.docID(),more);
@@ -343,10 +357,10 @@ public class QueryUtils {
final float maxDiff = 1e-3f;
final int lastDoc[] = {-1};
final IndexReader lastReader[] = {null};
-
+ final ReaderContext[] context = getLeaves(s);
s.search(q,new Collector() {
private Scorer scorer;
- private IndexReader reader;
+ private int leafPtr;
@Override
public void setScorer(Scorer scorer) throws IOException {
this.scorer = scorer;
@@ -358,7 +372,7 @@ public class QueryUtils {
long startMS = System.currentTimeMillis();
for (int i=lastDoc[0]+1; i<=doc; i++) {
Weight w = q.weight(s);
- Scorer scorer = w.scorer(reader, true, false);
+ Scorer scorer = w.scorer(context[leafPtr], true, false);
Assert.assertTrue("query collected "+doc+" but skipTo("+i+") says no more docs!",scorer.advance(i) != DocIdSetIterator.NO_MORE_DOCS);
Assert.assertEquals("query collected "+doc+" but skipTo("+i+") got to "+scorer.docID(),doc,scorer.docID());
float skipToScore = scorer.score();
@@ -383,15 +397,17 @@ public class QueryUtils {
// previous reader, hits NO_MORE_DOCS
if (lastReader[0] != null) {
final IndexReader previousReader = lastReader[0];
- Weight w = q.weight(new IndexSearcher(previousReader));
- Scorer scorer = w.scorer(previousReader, true, false);
+ IndexSearcher indexSearcher = new IndexSearcher(previousReader);
+ Weight w = q.weight(indexSearcher);
+ Scorer scorer = w.scorer(indexSearcher.getTopReaderContext(), true, false);
if (scorer != null) {
boolean more = scorer.advance(lastDoc[0] + 1) != DocIdSetIterator.NO_MORE_DOCS;
Assert.assertFalse("query's last doc was "+ lastDoc[0] +" but skipTo("+(lastDoc[0]+1)+") got to "+scorer.docID(),more);
}
+ leafPtr++;
}
- this.reader = lastReader[0] = reader;
+ lastReader[0] = reader;
lastDoc[0] = -1;
}
@Override
@@ -404,8 +420,9 @@ public class QueryUtils {
// confirm that skipping beyond the last doc, on the
// previous reader, hits NO_MORE_DOCS
final IndexReader previousReader = lastReader[0];
- Weight w = q.weight(new IndexSearcher(previousReader));
- Scorer scorer = w.scorer(previousReader, true, false);
+ IndexSearcher indexSearcher = new IndexSearcher(previousReader);
+ Weight w = q.weight(indexSearcher);
+ Scorer scorer = w.scorer(indexSearcher.getTopReaderContext(), true, false);
if (scorer != null) {
boolean more = scorer.advance(lastDoc[0] + 1) != DocIdSetIterator.NO_MORE_DOCS;
Assert.assertFalse("query's last doc was "+ lastDoc[0] +" but skipTo("+(lastDoc[0]+1)+") got to "+scorer.docID(),more);
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/SingleDocTestFilter.java Wed Jan 5 20:47:08 2011
@@ -17,7 +17,7 @@ package org.apache.lucene.search;
* limitations under the License.
*/
-import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.util.DocIdBitSet;
import java.util.BitSet;
@@ -31,8 +31,8 @@ public class SingleDocTestFilter extends
}
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
- BitSet bits = new BitSet(reader.maxDoc());
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
+ BitSet bits = new BitSet(context.reader.maxDoc());
bits.set(doc);
return new DocIdBitSet(bits);
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java Wed Jan 5 20:47:08 2011
@@ -23,6 +23,8 @@ import org.apache.lucene.analysis.MockAn
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.SerialMergeScheduler;
import org.apache.lucene.index.SlowMultiReaderWrapper;
@@ -40,20 +42,20 @@ public class TestCachingWrapperFilter ex
writer.close();
IndexReader reader = IndexReader.open(dir, true);
-
+ ReaderContext context = reader.getTopReaderContext();
MockFilter filter = new MockFilter();
CachingWrapperFilter cacher = new CachingWrapperFilter(filter);
// first time, nested filter is called
- cacher.getDocIdSet(reader);
+ cacher.getDocIdSet(context);
assertTrue("first time", filter.wasCalled());
// make sure no exception if cache is holding the wrong docIdSet
- cacher.getDocIdSet(reader);
+ cacher.getDocIdSet(context);
// second time, nested filter should not be called
filter.clear();
- cacher.getDocIdSet(reader);
+ cacher.getDocIdSet(context);
assertFalse("second time", filter.wasCalled());
reader.close();
@@ -66,17 +68,18 @@ public class TestCachingWrapperFilter ex
writer.close();
IndexReader reader = IndexReader.open(dir, true);
+ ReaderContext context = reader.getTopReaderContext();
final Filter filter = new Filter() {
@Override
- public DocIdSet getDocIdSet(IndexReader reader) {
+ public DocIdSet getDocIdSet(ReaderContext context) {
return null;
}
};
CachingWrapperFilter cacher = new CachingWrapperFilter(filter);
// the caching filter should return the empty set constant
- assertSame(DocIdSet.EMPTY_DOCIDSET, cacher.getDocIdSet(reader));
+ assertSame(DocIdSet.EMPTY_DOCIDSET, cacher.getDocIdSet(context));
reader.close();
dir.close();
@@ -88,10 +91,11 @@ public class TestCachingWrapperFilter ex
writer.close();
IndexReader reader = IndexReader.open(dir, true);
+ ReaderContext context = reader.getTopReaderContext();
final Filter filter = new Filter() {
@Override
- public DocIdSet getDocIdSet(IndexReader reader) {
+ public DocIdSet getDocIdSet(ReaderContext context) {
return new DocIdSet() {
@Override
public DocIdSetIterator iterator() {
@@ -103,16 +107,17 @@ public class TestCachingWrapperFilter ex
CachingWrapperFilter cacher = new CachingWrapperFilter(filter);
// the caching filter should return the empty set constant
- assertSame(DocIdSet.EMPTY_DOCIDSET, cacher.getDocIdSet(reader));
+ assertSame(DocIdSet.EMPTY_DOCIDSET, cacher.getDocIdSet(context));
reader.close();
dir.close();
}
private static void assertDocIdSetCacheable(IndexReader reader, Filter filter, boolean shouldCacheable) throws IOException {
+ ReaderContext context = reader.getTopReaderContext();
final CachingWrapperFilter cacher = new CachingWrapperFilter(filter);
- final DocIdSet originalSet = filter.getDocIdSet(reader);
- final DocIdSet cachedSet = cacher.getDocIdSet(reader);
+ final DocIdSet originalSet = filter.getDocIdSet(context);
+ final DocIdSet cachedSet = cacher.getDocIdSet(context);
assertTrue(cachedSet.isCacheable());
assertEquals(shouldCacheable, originalSet.isCacheable());
//System.out.println("Original: "+originalSet.getClass().getName()+" -- cached: "+cachedSet.getClass().getName());
@@ -140,7 +145,7 @@ public class TestCachingWrapperFilter ex
// a openbitset filter is always cacheable
assertDocIdSetCacheable(reader, new Filter() {
@Override
- public DocIdSet getDocIdSet(IndexReader reader) {
+ public DocIdSet getDocIdSet(ReaderContext context) {
return new OpenBitSet();
}
}, true);
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java Wed Jan 5 20:47:08 2011
@@ -25,6 +25,7 @@ import org.apache.lucene.index.IndexRead
import org.apache.lucene.index.SlowMultiReaderWrapper;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.Term;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.store.Directory;
import java.text.DecimalFormat;
@@ -163,9 +164,9 @@ public class TestDisjunctionMaxQuery ext
dq.add(tq("dek", "DOES_NOT_EXIST"));
QueryUtils.check(random, dq, s);
-
+ assertTrue(s.getTopReaderContext().isAtomic);
final Weight dw = dq.weight(s);
- final Scorer ds = dw.scorer(s.getIndexReader(), true, false);
+ final Scorer ds = dw.scorer(s.getTopReaderContext(), true, false);
final boolean skipOk = ds.advance(3) != DocIdSetIterator.NO_MORE_DOCS;
if (skipOk) {
fail("firsttime skipTo found a match? ... "
@@ -177,11 +178,10 @@ public class TestDisjunctionMaxQuery ext
final DisjunctionMaxQuery dq = new DisjunctionMaxQuery(0.0f);
dq.add(tq("dek", "albino"));
dq.add(tq("dek", "DOES_NOT_EXIST"));
-
+ assertTrue(s.getTopReaderContext().isAtomic);
QueryUtils.check(random, dq, s);
-
final Weight dw = dq.weight(s);
- final Scorer ds = dw.scorer(s.getIndexReader(), true, false);
+ final Scorer ds = dw.scorer(s.getTopReaderContext(), true, false);
assertTrue("firsttime skipTo found no match",
ds.advance(3) != DocIdSetIterator.NO_MORE_DOCS);
assertEquals("found wrong docid", "d4", r.document(ds.docID()).get("id"));
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDocIdSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDocIdSet.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDocIdSet.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestDocIdSet.java Wed Jan 5 20:47:08 2011
@@ -28,6 +28,7 @@ import org.apache.lucene.document.Docume
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.LuceneTestCase;
@@ -114,7 +115,7 @@ public class TestDocIdSet extends Lucene
// Now search w/ a Filter which returns a null DocIdSet
Filter f = new Filter() {
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
return null;
}
};
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredQuery.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredQuery.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredQuery.java Wed Jan 5 20:47:08 2011
@@ -20,6 +20,7 @@ package org.apache.lucene.search;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause.Occur;
@@ -87,7 +88,7 @@ public class TestFilteredQuery extends L
private static Filter newStaticFilterB() {
return new Filter() {
@Override
- public DocIdSet getDocIdSet (IndexReader reader) {
+ public DocIdSet getDocIdSet (ReaderContext context) {
BitSet bitset = new BitSet(5);
bitset.set (1);
bitset.set (3);
@@ -158,7 +159,7 @@ public class TestFilteredQuery extends L
private static Filter newStaticFilterA() {
return new Filter() {
@Override
- public DocIdSet getDocIdSet (IndexReader reader) {
+ public DocIdSet getDocIdSet (ReaderContext context) {
BitSet bitset = new BitSet(5);
bitset.set(0, 5);
return new DocIdBitSet(bitset);
@@ -216,7 +217,7 @@ public class TestFilteredQuery extends L
bq.add(new TermQuery(new Term("field", "two")), BooleanClause.Occur.SHOULD);
ScoreDoc[] hits = searcher.search(query, 1000).scoreDocs;
assertEquals(1, hits.length);
- QueryUtils.check(random, query,searcher);
+ QueryUtils.check(random, query, searcher);
}
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredSearch.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredSearch.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestFilteredSearch.java Wed Jan 5 20:47:08 2011
@@ -25,6 +25,8 @@ import org.apache.lucene.document.Docume
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
@@ -33,6 +35,7 @@ import org.apache.lucene.store.LockObtai
import org.apache.lucene.util.OpenBitSet;
+
/**
*
*/
@@ -59,7 +62,7 @@ public class TestFilteredSearch extends
directory.close();
}
- public void searchFiltered(IndexWriter writer, Directory directory, SimpleDocIdSetFilter filter, boolean optimize) {
+ public void searchFiltered(IndexWriter writer, Directory directory, Filter filter, boolean optimize) {
try {
for (int i = 0; i < 60; i++) {//Simple docs
Document doc = new Document();
@@ -75,7 +78,6 @@ public class TestFilteredSearch extends
IndexSearcher indexSearcher = new IndexSearcher(directory, true);
- filter.setTopReader(indexSearcher.getIndexReader());
ScoreDoc[] hits = indexSearcher.search(booleanQuery, filter, 1000).scoreDocs;
assertEquals("Number of matched documents", 1, hits.length);
indexSearcher.close();
@@ -89,20 +91,17 @@ public class TestFilteredSearch extends
public static final class SimpleDocIdSetFilter extends Filter {
private final int[] docs;
private int index;
- private IndexReader topReader;
+
public SimpleDocIdSetFilter(int[] docs) {
this.docs = docs;
}
- public void setTopReader(IndexReader r) {
- topReader = r;
- }
-
@Override
- public DocIdSet getDocIdSet(IndexReader reader) {
+ public DocIdSet getDocIdSet(ReaderContext context) {
+ assert context.isAtomic;
final OpenBitSet set = new OpenBitSet();
- int docBase = topReader.getSubReaderDocBase(reader);
- final int limit = docBase+reader.maxDoc();
+ int docBase = ((AtomicReaderContext)context).docBase;
+ final int limit = docBase+context.reader.maxDoc();
for (;index < docs.length; index++) {
final int docId = docs[index];
if(docId > limit)
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java Wed Jan 5 20:47:08 2011
@@ -177,13 +177,13 @@ public class TestNumericRangeQuery32 ext
@Test
public void testInverseRange() throws Exception {
NumericRangeFilter<Integer> f = NumericRangeFilter.newIntRange("field8", 8, 1000, -1000, true, true);
- assertSame("A inverse range should return the EMPTY_DOCIDSET instance", DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader())));
+ assertSame("A inverse range should return the EMPTY_DOCIDSET instance", DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader()).getTopReaderContext()));
f = NumericRangeFilter.newIntRange("field8", 8, Integer.MAX_VALUE, null, false, false);
assertSame("A exclusive range starting with Integer.MAX_VALUE should return the EMPTY_DOCIDSET instance",
- DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader())));
+ DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader()).getTopReaderContext()));
f = NumericRangeFilter.newIntRange("field8", 8, null, Integer.MIN_VALUE, false, false);
assertSame("A exclusive range ending with Integer.MIN_VALUE should return the EMPTY_DOCIDSET instance",
- DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader())));
+ DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader()).getTopReaderContext()));
}
@Test
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java Wed Jan 5 20:47:08 2011
@@ -182,13 +182,14 @@ public class TestNumericRangeQuery64 ext
@Test
public void testInverseRange() throws Exception {
NumericRangeFilter<Long> f = NumericRangeFilter.newLongRange("field8", 8, 1000L, -1000L, true, true);
- assertSame("A inverse range should return the EMPTY_DOCIDSET instance", DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader())));
+ assertSame("A inverse range should return the EMPTY_DOCIDSET instance", DocIdSet.EMPTY_DOCIDSET,
+ f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader()).getTopReaderContext()));
f = NumericRangeFilter.newLongRange("field8", 8, Long.MAX_VALUE, null, false, false);
assertSame("A exclusive range starting with Long.MAX_VALUE should return the EMPTY_DOCIDSET instance",
- DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader())));
+ DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader()).getTopReaderContext()));
f = NumericRangeFilter.newLongRange("field8", 8, null, Long.MIN_VALUE, false, false);
assertSame("A exclusive range ending with Long.MIN_VALUE should return the EMPTY_DOCIDSET instance",
- DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader())));
+ DocIdSet.EMPTY_DOCIDSET, f.getDocIdSet(new SlowMultiReaderWrapper(searcher.getIndexReader()).getTopReaderContext()));
}
@Test
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestScorerPerf.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestScorerPerf.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestScorerPerf.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestScorerPerf.java Wed Jan 5 20:47:08 2011
@@ -7,6 +7,7 @@ import java.util.BitSet;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
@@ -141,7 +142,7 @@ public class TestScorerPerf extends Luce
final BitSet rnd = sets[random.nextInt(sets.length)];
Query q = new ConstantScoreQuery(new Filter() {
@Override
- public DocIdSet getDocIdSet(IndexReader reader) {
+ public DocIdSet getDocIdSet(ReaderContext context) {
return new DocIdBitSet(rnd);
}
});
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestSort.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestSort.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestSort.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestSort.java Wed Jan 5 20:47:08 2011
@@ -34,6 +34,7 @@ import org.apache.lucene.document.Docume
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.MultiReader;
@@ -687,9 +688,9 @@ public class TestSort extends LuceneTest
// a filter that only allows through the first hit
Filter filt = new Filter() {
@Override
- public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
- BitSet bs = new BitSet(reader.maxDoc());
- bs.set(0, reader.maxDoc());
+ public DocIdSet getDocIdSet(ReaderContext context) throws IOException {
+ BitSet bs = new BitSet(context.reader.maxDoc());
+ bs.set(0, context.reader.maxDoc());
bs.set(docs1.scoreDocs[0].doc);
return new DocIdBitSet(bs);
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestTermScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestTermScorer.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestTermScorer.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/TestTermScorer.java Wed Jan 5 20:47:08 2011
@@ -28,6 +28,7 @@ import org.apache.lucene.index.IndexRead
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.SlowMultiReaderWrapper;
+import org.apache.lucene.index.IndexReader.ReaderContext;
import org.apache.lucene.store.Directory;
public class TestTermScorer extends LuceneTestCase {
@@ -71,7 +72,7 @@ public class TestTermScorer extends Luce
Weight weight = termQuery.weight(indexSearcher);
- Scorer ts = weight.scorer(indexSearcher.getIndexReader(), true, true);
+ Scorer ts = weight.scorer(indexSearcher.getTopReaderContext(), true, true);
// we have 2 documents with the term all in them, one document for all the
// other values
final List<TestHit> docs = new ArrayList<TestHit>();
@@ -132,7 +133,7 @@ public class TestTermScorer extends Luce
Weight weight = termQuery.weight(indexSearcher);
- Scorer ts = weight.scorer(indexSearcher.getIndexReader(), true, true);
+ Scorer ts = weight.scorer(indexSearcher.getTopReaderContext(), true, true);
assertTrue("next did not return a doc",
ts.nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
assertTrue("score is not correct", ts.score() == 1.6931472f);
@@ -150,7 +151,7 @@ public class TestTermScorer extends Luce
Weight weight = termQuery.weight(indexSearcher);
- Scorer ts = weight.scorer(indexSearcher.getIndexReader(), true, true);
+ Scorer ts = weight.scorer(indexSearcher.getTopReaderContext(), true, true);
assertTrue("Didn't skip", ts.advance(3) != DocIdSetIterator.NO_MORE_DOCS);
// The next doc should be doc 5
assertTrue("doc should be number 5", ts.docID() == 5);
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestNearSpansOrdered.java Wed Jan 5 20:47:08 2011
@@ -168,7 +168,7 @@ public class TestNearSpansOrdered extend
public void testSpanNearScorerSkipTo1() throws Exception {
SpanNearQuery q = makeQuery();
Weight w = q.weight(searcher);
- Scorer s = w.scorer(searcher.getIndexReader(), true, false);
+ Scorer s = w.scorer(searcher.getTopReaderContext(), true, false);
assertEquals(1, s.advance(1));
}
/**
@@ -177,7 +177,7 @@ public class TestNearSpansOrdered extend
*/
public void testSpanNearScorerExplain() throws Exception {
SpanNearQuery q = makeQuery();
- Explanation e = q.weight(searcher).explain(searcher.getIndexReader(), 1);
+ Explanation e = q.weight(searcher).explain(searcher.getTopReaderContext(), 1);
assertTrue("Scorer explanation value for doc#1 isn't positive: "
+ e.toString(),
0.0f < e.getValue());
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestSpans.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestSpans.java?rev=1055636&r1=1055635&r2=1055636&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestSpans.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/spans/TestSpans.java Wed Jan 5 20:47:08 2011
@@ -29,6 +29,7 @@ import org.apache.lucene.store.Directory
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
import org.apache.lucene.index.SlowMultiReaderWrapper;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.RandomIndexWriter;
@@ -420,7 +421,7 @@ public class TestSpans extends LuceneTes
}
};
- Scorer spanScorer = snq.weight(searcher).scorer(new SlowMultiReaderWrapper(searcher.getIndexReader()), true, false);
+ Scorer spanScorer = snq.weight(searcher).scorer(new AtomicReaderContext(new SlowMultiReaderWrapper(searcher.getIndexReader())), true, false);
assertTrue("first doc", spanScorer.nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
assertEquals("first doc number", spanScorer.docID(), 11);