Index: lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java (revision 1097776) +++ lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java (working copy) @@ -171,7 +171,8 @@ // but we use .reopen on this reader below and expect to // (must) get an NRT reader: IndexReader reader = IndexReader.open(writer.w, true); - IndexSearcher searcher = newSearcher(reader); + // same reason we don't wrap? + IndexSearcher searcher = newSearcher(reader, false); // add a doc, refresh the reader, and check that its there Document doc = new Document(); @@ -180,7 +181,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); TopDocs docs = searcher.search(new MatchAllDocsQuery(), 1); assertEquals("Should find a hit...", 1, docs.totalHits); @@ -202,7 +203,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); assertEquals("[query + filter] Should *not* find a hit...", 0, docs.totalHits); @@ -218,7 +219,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); @@ -238,7 +239,7 @@ reader = refreshReader(reader); assertTrue(reader != oldReader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); int missCount = filter.missCount; docs = searcher.search(constantScore, 1); assertEquals("[just filter] Should find a hit...", 1, docs.totalHits); @@ -249,7 +250,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); missCount = filter.missCount; docs = searcher.search(new MatchAllDocsQuery(), filter, 1); @@ -265,7 +266,7 @@ writer.addDocument(doc); reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); assertEquals("[query + filter] Should find a hit...", 1, docs.totalHits); @@ -278,7 +279,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); assertEquals("[query + filter] Should *not* find a hit...", 0, docs.totalHits); Index: lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java (revision 1097776) +++ lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java (working copy) @@ -49,7 +49,8 @@ * Generates random regexps, and validates against a simple impl. */ public class TestRegexpRandom2 extends LuceneTestCase { - protected IndexSearcher searcher; + protected IndexSearcher searcher1; + protected IndexSearcher searcher2; private IndexReader reader; private Directory dir; @@ -82,14 +83,16 @@ } reader = writer.getReader(); - searcher = newSearcher(reader); + searcher1 = newSearcher(reader); + searcher2 = newSearcher(reader); writer.close(); } @Override public void tearDown() throws Exception { reader.close(); - searcher.close(); + searcher1.close(); + searcher2.close(); dir.close(); super.tearDown(); } @@ -157,12 +160,12 @@ // automatically comparable. // TODO: does this check even matter anymore?! - Terms terms = MultiFields.getTerms(searcher.getIndexReader(), "field"); + Terms terms = MultiFields.getTerms(searcher1.getIndexReader(), "field"); if (!(smart.getTermsEnum(terms) instanceof AutomatonTermsEnum)) return; - TopDocs smartDocs = searcher.search(smart, 25); - TopDocs dumbDocs = searcher.search(dumb, 25); + TopDocs smartDocs = searcher1.search(smart, 25); + TopDocs dumbDocs = searcher2.search(dumb, 25); CheckHits.checkEqual(smart, smartDocs.scoreDocs, dumbDocs.scoreDocs); } Index: lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java (revision 1097776) +++ lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java (working copy) @@ -49,7 +49,8 @@ // but we use .reopen on this reader below and expect to // (must) get an NRT reader: IndexReader reader = IndexReader.open(writer.w, true); - IndexSearcher searcher = newSearcher(reader); + // same reason we don't wrap? + IndexSearcher searcher = newSearcher(reader, false); // add a doc, refresh the reader, and check that its there Document doc = new Document(); @@ -58,7 +59,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); TopDocs docs = searcher.search(new MatchAllDocsQuery(), 1); assertEquals("Should find a hit...", 1, docs.totalHits); @@ -81,7 +82,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); assertEquals("[query + filter] Should *not* find a hit...", 0, docs.totalHits); @@ -96,7 +97,7 @@ writer.addDocument(doc); reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); assertEquals("[query + filter] Should find a hit...", 1, docs.totalHits); @@ -115,7 +116,7 @@ reader = refreshReader(reader); assertTrue(reader != oldReader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); int missCount = filter.missCount; docs = searcher.search(constantScore, 1); assertEquals("[just filter] Should find a hit...", 1, docs.totalHits); @@ -126,7 +127,7 @@ reader = refreshReader(reader); searcher.close(); - searcher = newSearcher(reader); + searcher = newSearcher(reader, false); docs = searcher.search(new MatchAllDocsQuery(), filter, 1); assertEquals("[query + filter] Should *not* find a hit...", 0, docs.totalHits); Index: lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java (revision 1097776) +++ lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java (working copy) @@ -154,7 +154,9 @@ assertEquals("First doc"+type, 2*distance+startOffset, Integer.parseInt(doc.get(field)) ); doc=searcher.doc(sd[sd.length-1].doc); assertEquals("Last doc"+type, (1+count)*distance+startOffset, Integer.parseInt(doc.get(field)) ); - if (i>0 && searcher.getIndexReader().getSequentialSubReaders().length == 1) { + if (i>0 && + (searcher.getIndexReader().getSequentialSubReaders() == null || + searcher.getIndexReader().getSequentialSubReaders().length == 1)) { assertEquals("Distinct term number is equal for all query types", lastTerms, terms); } lastTerms = terms; @@ -378,7 +380,9 @@ termCountT += tq.getTotalNumberOfTerms(); termCountC += cq.getTotalNumberOfTerms(); } - if (precisionStep == Integer.MAX_VALUE && searcher.getIndexReader().getSequentialSubReaders().length == 1) { + if (precisionStep == Integer.MAX_VALUE && + (searcher.getIndexReader().getSequentialSubReaders() == null || + searcher.getIndexReader().getSequentialSubReaders().length == 1)) { assertEquals("Total number of terms should be equal for unlimited precStep", termCountT, termCountC); } else if (VERBOSE) { System.out.println("Average number of terms during random search on '" + field + "':"); Index: lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java (revision 1097776) +++ lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java (working copy) @@ -154,7 +154,9 @@ assertEquals("First doc"+type, 2*distance+startOffset, Long.parseLong(doc.get(field)) ); doc=searcher.doc(sd[sd.length-1].doc); assertEquals("Last doc"+type, (1+count)*distance+startOffset, Long.parseLong(doc.get(field)) ); - if (i>0 && searcher.getIndexReader().getSequentialSubReaders().length == 1) { + if (i>0 && + (searcher.getIndexReader().getSequentialSubReaders() == null || + searcher.getIndexReader().getSequentialSubReaders().length == 1)) { assertEquals("Distinct term number is equal for all query types", lastTerms, terms); } lastTerms = terms; @@ -395,7 +397,9 @@ termCountT += tq.getTotalNumberOfTerms(); termCountC += cq.getTotalNumberOfTerms(); } - if (precisionStep == Integer.MAX_VALUE && searcher.getIndexReader().getSequentialSubReaders().length == 1) { + if (precisionStep == Integer.MAX_VALUE && + (searcher.getIndexReader().getSequentialSubReaders() == null || + searcher.getIndexReader().getSequentialSubReaders().length == 1)) { assertEquals("Total number of terms should be equal for unlimited precStep", termCountT, termCountC); } else if (VERBOSE) { System.out.println("Average number of terms during random search on '" + field + "':"); Index: lucene/src/test-framework/org/apache/lucene/search/QueryUtils.java =================================================================== --- lucene/src/test-framework/org/apache/lucene/search/QueryUtils.java (revision 1097776) +++ lucene/src/test-framework/org/apache/lucene/search/QueryUtils.java (working copy) @@ -309,7 +309,7 @@ // confirm that skipping beyond the last doc, on the // previous reader, hits NO_MORE_DOCS final IndexReader previousReader = lastReader[0]; - IndexSearcher indexSearcher = LuceneTestCase.newSearcher(previousReader); + IndexSearcher indexSearcher = LuceneTestCase.newSearcher(previousReader, false); Weight w = q.weight(indexSearcher); Scorer scorer = w.scorer((AtomicReaderContext)previousReader.getTopReaderContext(), ScorerContext.def()); if (scorer != null) { Index: lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java =================================================================== --- lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java (revision 1097776) +++ lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java (working copy) @@ -1091,8 +1091,21 @@ /** create a new searcher over the reader. * This searcher might randomly use threads. */ public static IndexSearcher newSearcher(IndexReader r) throws IOException { + return newSearcher(r, true); + } + + /** create a new searcher over the reader. + * This searcher might randomly use threads. + * if maybeWrap is true, this searcher might wrap the reader + * with one that returns null for getSequentialSubReaders. + */ + public static IndexSearcher newSearcher(IndexReader r, boolean maybeWrap) throws IOException { if (random.nextBoolean()) { - return new IndexSearcher(r); + if (maybeWrap && random.nextBoolean()) { + return new IndexSearcher(new SlowMultiReaderWrapper(r)); + } else { + return new IndexSearcher(r); + } } else { int threads = 0; final ExecutorService ex = (random.nextBoolean()) ? null Index: lucene/contrib/queries/src/test/org/apache/lucene/search/TestFieldCacheRewriteMethod.java =================================================================== --- lucene/contrib/queries/src/test/org/apache/lucene/search/TestFieldCacheRewriteMethod.java (revision 1097776) +++ lucene/contrib/queries/src/test/org/apache/lucene/search/TestFieldCacheRewriteMethod.java (working copy) @@ -36,8 +36,8 @@ RegexpQuery filter = new RegexpQuery(new Term("field", regexp), RegExp.NONE); filter.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE); - TopDocs fieldCacheDocs = searcher.search(fieldCache, 25); - TopDocs filterDocs = searcher.search(filter, 25); + TopDocs fieldCacheDocs = searcher1.search(fieldCache, 25); + TopDocs filterDocs = searcher2.search(filter, 25); CheckHits.checkEqual(fieldCache, fieldCacheDocs.scoreDocs, filterDocs.scoreDocs); }