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/TestMatchAllDocsQuery.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestMatchAllDocsQuery.java (revision 1097776) +++ lucene/src/test/org/apache/lucene/search/TestMatchAllDocsQuery.java (working copy) @@ -54,9 +54,9 @@ hits = is.search(new MatchAllDocsQuery(), null, 1000).scoreDocs; assertEquals(3, hits.length); - assertEquals("one", ir.document(hits[0].doc).get("key")); - assertEquals("two", ir.document(hits[1].doc).get("key")); - assertEquals("three four", ir.document(hits[2].doc).get("key")); + assertEquals("one", is.doc(hits[0].doc).get("key")); + assertEquals("two", is.doc(hits[1].doc).get("key")); + assertEquals("three four", is.doc(hits[2].doc).get("key")); // assert with norms scoring turned on @@ -64,19 +64,19 @@ hits = is.search(normsQuery, null, 1000).scoreDocs; assertEquals(3, hits.length); - assertEquals("three four", ir.document(hits[0].doc).get("key")); - assertEquals("two", ir.document(hits[1].doc).get("key")); - assertEquals("one", ir.document(hits[2].doc).get("key")); + assertEquals("three four", is.doc(hits[0].doc).get("key")); + assertEquals("two", is.doc(hits[1].doc).get("key")); + assertEquals("one", is.doc(hits[2].doc).get("key")); // change norm & retest - ir.setNorm(0, "key", is.getSimilarityProvider().get("key").encodeNormValue(400f)); + is.getIndexReader().setNorm(0, "key", is.getSimilarityProvider().get("key").encodeNormValue(400f)); normsQuery = new MatchAllDocsQuery("key"); hits = is.search(normsQuery, null, 1000).scoreDocs; assertEquals(3, hits.length); - assertEquals("one", ir.document(hits[0].doc).get("key")); - assertEquals("three four", ir.document(hits[1].doc).get("key")); - assertEquals("two", ir.document(hits[2].doc).get("key")); + assertEquals("one", is.doc(hits[0].doc).get("key")); + assertEquals("three four", is.doc(hits[1].doc).get("key")); + assertEquals("two", is.doc(hits[2].doc).get("key")); // some artificial queries to trigger the use of skipTo(): @@ -93,7 +93,7 @@ assertEquals(1, hits.length); // delete a document: - ir.deleteDocument(0); + is.getIndexReader().deleteDocument(0); hits = is.search(new MatchAllDocsQuery(), null, 1000).scoreDocs; assertEquals(2, hits.length); 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/xml-query-parser/src/test/org/apache/lucene/xmlparser/TestParser.java =================================================================== --- lucene/contrib/xml-query-parser/src/test/org/apache/lucene/xmlparser/TestParser.java (revision 1097776) +++ lucene/contrib/xml-query-parser/src/test/org/apache/lucene/xmlparser/TestParser.java (working copy) @@ -187,7 +187,8 @@ } public void testDuplicateFilterQueryXML() throws ParserException, IOException { - Assume.assumeTrue(searcher.getIndexReader().getSequentialSubReaders().length == 1); + Assume.assumeTrue(searcher.getIndexReader().getSequentialSubReaders() == null || + searcher.getIndexReader().getSequentialSubReaders().length == 1); Query q=parse("DuplicateFilterQuery.xml"); int h = searcher.search(q, null, 1000).totalHits; assertEquals("DuplicateFilterQuery should produce 1 result ", 1,h); 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); }