--- /home/dnaber/workspace/LuceneCVS142/jakarta-lucene/src/java/org/apache/lucene/search/IndexSearcher.java 2004-10-01 22:10:28.000000000 +0200 +++ IndexSearcher.java 2004-10-21 16:45:40.000000000 +0200 @@ -82,7 +82,7 @@ // inherit javadoc public TopDocs search(Query query, Filter filter, final int nDocs) throws IOException { - Scorer scorer = query.weight(this).scorer(reader); + Scorer scorer = query.weight(getTopmostSearcher()).scorer(reader); if (scorer == null) return new TopDocs(0, new ScoreDoc[0]); @@ -114,7 +114,7 @@ public TopFieldDocs search(Query query, Filter filter, final int nDocs, Sort sort) throws IOException { - Scorer scorer = query.weight(this).scorer(reader); + Scorer scorer = query.weight(getTopmostSearcher()).scorer(reader); if (scorer == null) return new TopFieldDocs(0, new ScoreDoc[0], sort.fields); @@ -155,7 +155,7 @@ }; } - Scorer scorer = query.weight(this).scorer(reader); + Scorer scorer = query.weight(getTopmostSearcher()).scorer(reader); if (scorer == null) return; scorer.score(collector); @@ -171,7 +171,7 @@ } public Explanation explain(Query query, int doc) throws IOException { - return query.weight(this).explain(reader, doc); + return query.weight(getTopmostSearcher()).explain(reader, doc); } } --- /home/dnaber/workspace/LuceneCVS142/jakarta-lucene/src/java/org/apache/lucene/search/MultiSearcher.java 2004-03-30 00:48:03.000000000 +0200 +++ MultiSearcher.java 2004-10-21 16:43:02.000000000 +0200 @@ -37,6 +37,7 @@ starts = new int[searchables.length + 1]; // build starts array for (int i = 0; i < searchables.length; i++) { + if (searchables[i] instanceof Searcher) ((Searcher)searchables[i]).setTopmostSearcher(getTopmostSearcher()); starts[i] = maxDoc; maxDoc += searchables[i].maxDoc(); // compute maxDocs } --- /home/dnaber/workspace/LuceneCVS142/jakarta-lucene/src/java/org/apache/lucene/search/Query.java 2004-03-02 14:48:10.000000000 +0100 +++ Query.java 2004-10-21 17:03:28.000000000 +0200 @@ -96,11 +96,10 @@ /** Expert: called when re-writing queries under MultiSearcher. * - *

Only implemented by derived queries, with no - * {@link #createWeight(Searcher)} implementatation. + *

Individual queries must override if combining is required. */ public Query combine(Query[] queries) { - throw new UnsupportedOperationException(); + return queries[0]; } --- /home/dnaber/workspace/LuceneCVS142/jakarta-lucene/src/java/org/apache/lucene/search/Searcher.java 2004-03-30 00:48:04.000000000 +0200 +++ Searcher.java 2004-10-21 16:42:08.000000000 +0200 @@ -22,6 +22,9 @@ * Implements some common utility methods. */ public abstract class Searcher implements Searchable { + + private Searcher topmostSearcher = this; + /** Returns the documents matching query. */ public final Hits search(Query query) throws IOException { return search(query, (Filter)null); @@ -85,4 +88,18 @@ public Similarity getSimilarity() { return this.similarity; } + + /** Expert: Access the topmost Searcher + * @return the topmost Searcher, which is typically this or an encompassing MultiSearcher + */ + public Searcher getTopmostSearcher() { + return topmostSearcher; + } + + /** Expert: set the topmost Searcher + * @param topmostSearcher the outermost Searcher of which we are a subsearcher + */ + public void setTopmostSearcher(Searcher topmostSearcher) { + this.topmostSearcher = topmostSearcher; + } }