Index: solr/src/java/org/apache/solr/search/function/QueryValueSource.java =================================================================== --- solr/src/java/org/apache/solr/search/function/QueryValueSource.java (revision 1065253) +++ solr/src/java/org/apache/solr/search/function/QueryValueSource.java (working copy) @@ -19,6 +19,8 @@ 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; import org.apache.lucene.search.*; import org.apache.lucene.search.Weight.ScorerContext; import org.apache.lucene.util.ReaderUtil; @@ -73,7 +75,7 @@ final Query q; // final IndexReader reader; final AtomicReaderContext readerContext; - final Weight weight; + private final Weight weight; final float defVal; final Map fcontext; @@ -97,11 +99,15 @@ if (w == null) { IndexSearcher weightSearcher; if(fcontext == null) { - weightSearcher = new IndexSearcher(ReaderUtil.getTopLevelContext(readerContext), readerContext); + // We want Weight to pull stats from toplevel + // reader: + weightSearcher = new IndexSearcher(ReaderUtil.getTopLevelContext(readerContext)); } else { weightSearcher = (IndexSearcher)fcontext.get("searcher"); if (weightSearcher == null) { - weightSearcher = new IndexSearcher(ReaderUtil.getTopLevelContext(readerContext), readerContext); + // We want Weight to pull stats from toplevel + // reader: + weightSearcher = new IndexSearcher(ReaderUtil.getTopLevelContext(readerContext)); } } w = q.weight(weightSearcher); Index: lucene/src/java/org/apache/lucene/search/IndexSearcher.java =================================================================== --- lucene/src/java/org/apache/lucene/search/IndexSearcher.java (revision 1065253) +++ lucene/src/java/org/apache/lucene/search/IndexSearcher.java (working copy) @@ -153,7 +153,8 @@ } /** - * Creates a searcher searching the provided top-level {@link ReaderContext}. + * Creates a searcher searching the provided top-level or + * atomic {@link ReaderContext}. * * @see ReaderContext * @see IndexReader#getTopReaderContext() @@ -169,12 +170,17 @@ } private IndexSearcher(ReaderContext context, boolean closeReader, ExecutorService executor) { - assert context.isTopLevel: "IndexSearcher's ReaderContext must be topLevel for reader" + context.reader; + // nocommit + //assert context.isTopLevel: "IndexSearcher's ReaderContext must be topLevel for reader" + context.reader; reader = context.reader; this.executor = executor; this.closeReader = closeReader; this.readerContext = context; - leafContexts = ReaderUtil.leaves(context); + if (context.isTopLevel) { + leafContexts = ReaderUtil.leaves(context); + } else { + leafContexts = new AtomicReaderContext[] {(AtomicReaderContext) context}; + } if (executor == null) { subSearchers = null; @@ -184,32 +190,12 @@ if (leafContexts[i].reader == context.reader) { subSearchers[i] = this; } else { - subSearchers[i] = new IndexSearcher(context, leafContexts[i]); + subSearchers[i] = new IndexSearcher(leafContexts[i]); } } } } - /** - * Expert: Creates a searcher from a top-level {@link ReaderContext} with and - * executes searches on the given leave slice exclusively instead of searching - * over all leaves. This constructor should be used to run one or more leaves - * within a single thread. Hence, for scorer and filter this looks like an - * ordinary search in the hierarchy such that there is no difference between - * single and multi-threaded. - * - * @lucene.experimental - * */ - public IndexSearcher(ReaderContext topLevel, AtomicReaderContext... leaves) { - assert assertLeaves(topLevel, leaves); - readerContext = topLevel; - reader = topLevel.reader; - leafContexts = leaves; - executor = null; - subSearchers = null; - closeReader = false; - } - private boolean assertLeaves(ReaderContext topLevel, AtomicReaderContext... leaves) { for (AtomicReaderContext leaf : leaves) { assert ReaderUtil.getTopLevelContext(leaf) == topLevel : "leaf context is not a leaf of the given top-level context";