Index: lucene/src/test/org/apache/lucene/search/TestFuzzyQuery2.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestFuzzyQuery2.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestFuzzyQuery2.java (working copy) @@ -20,12 +20,15 @@ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Random; import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.analysis.MockTokenizer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.LuceneTestCase; @@ -55,6 +58,13 @@ public class TestFuzzyQuery2 extends LuceneTestCase { /** epsilon for score comparisons */ static final float epsilon = 0.00001f; + private Random random; + + @Override + public void setUp() throws Exception { + super.setUp(); + random = newRandom(); + } public void testFromTestData() throws Exception { // TODO: randomize! @@ -78,8 +88,8 @@ int terms = (int) Math.pow(2, bits); RAMDirectory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new MockAnalyzer(MockTokenizer.KEYWORD, false), - IndexWriter.MaxFieldLength.UNLIMITED); + RandomIndexWriter writer = new RandomIndexWriter(random, dir, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(MockTokenizer.KEYWORD, false))); Document doc = new Document(); Field field = new Field("field", "", Field.Store.NO, Field.Index.ANALYZED); @@ -88,12 +98,11 @@ for (int i = 0; i < terms; i++) { field.setValue(mapInt(codePointTable, i)); writer.addDocument(doc); - } + } - writer.optimize(); - writer.close(); - - IndexSearcher searcher = new IndexSearcher(dir); + IndexReader r = writer.getReader(); + IndexSearcher searcher = new IndexSearcher(r); + writer.close(); String line; while ((line = reader.readLine()) != null) { String params[] = line.split(","); @@ -113,6 +122,7 @@ } } searcher.close(); + r.close(); dir.close(); } Index: lucene/src/test/org/apache/lucene/search/TestAutomatonQueryUnicode.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestAutomatonQueryUnicode.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestAutomatonQueryUnicode.java (working copy) @@ -18,12 +18,16 @@ */ import java.io.IOException; +import java.util.Random; import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; +import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.automaton.Automaton; @@ -35,15 +39,18 @@ * and the differences between UTF-8/UTF-32 and UTF-16 binary sort order. */ public class TestAutomatonQueryUnicode extends LuceneTestCase { + private IndexReader reader; private IndexSearcher searcher; + private Directory directory; private final String FN = "field"; public void setUp() throws Exception { super.setUp(); - RAMDirectory directory = new RAMDirectory(); - IndexWriter writer = new IndexWriter(directory, new MockAnalyzer(), true, - IndexWriter.MaxFieldLength.LIMITED); + Random random = newRandom(); + directory = new RAMDirectory(); + RandomIndexWriter writer = new RandomIndexWriter(random, directory, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); Document doc = new Document(); Field titleField = new Field("title", "some title", Field.Store.NO, Field.Index.ANALYZED); @@ -79,13 +86,15 @@ writer.addDocument(doc); field.setValue("\uFFFD\uFFFD"); writer.addDocument(doc); - writer.optimize(); + reader = writer.getReader(); + searcher = new IndexSearcher(reader); writer.close(); - searcher = new IndexSearcher(directory, true); } public void tearDown() throws Exception { searcher.close(); + reader.close(); + directory.close(); super.tearDown(); } Index: lucene/src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java (working copy) @@ -24,8 +24,8 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; @@ -37,16 +37,17 @@ */ public class TestBooleanMinShouldMatch extends LuceneTestCase { + private Random rnd; + private Directory index; + private IndexReader r; + private IndexSearcher s; - public Directory index; - public IndexReader r; - public IndexSearcher s; - @Override protected void setUp() throws Exception { super.setUp(); - + rnd = newRandom(); + String[] data = new String [] { "A 1 2 3 4 5 6", "Z 4 5 6", @@ -59,7 +60,7 @@ }; index = new RAMDirectory(); - IndexWriter writer = new IndexWriter(index, new IndexWriterConfig( + RandomIndexWriter w = new RandomIndexWriter(rnd, index, new IndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer())); for (int i = 0; i < data.length; i++) { @@ -69,18 +70,24 @@ if (null != data[i]) { doc.add(new Field("data", data[i], Field.Store.YES, Field.Index.ANALYZED));//Field.Text("data",data[i])); } - writer.addDocument(doc); + w.addDocument(doc); } - writer.optimize(); - writer.close(); - - r = IndexReader.open(index, true); + r = w.getReader(); s = new IndexSearcher(r); - + w.close(); //System.out.println("Set up " + getName()); } + + @Override + protected void tearDown() throws Exception { + s.close(); + r.close(); + index.close(); + super.tearDown(); + } + public void verifyNrHits(Query q, int expected) throws Exception { ScoreDoc[] h = s.search(q, null, 1000).scoreDocs; if (expected != h.length) { @@ -295,8 +302,6 @@ } public void testRandomQueries() throws Exception { - final Random rnd = newRandom(); - String field="data"; String[] vals = {"1","2","3","4","5","6","A","Z","B","Y","Z","X","foo"}; int maxLev=4; Index: lucene/src/test/org/apache/lucene/search/TestBooleanOr.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestBooleanOr.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestBooleanOr.java (working copy) @@ -16,20 +16,23 @@ * limitations under the License. */ import java.io.IOException; +import java.util.Random; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; +import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; public class TestBooleanOr extends LuceneTestCase { @@ -43,6 +46,9 @@ private TermQuery c2 = new TermQuery(new Term(FIELD_C, "optimize")); private IndexSearcher searcher = null; + private Directory dir; + private IndexReader reader; + private int search(Query q) throws IOException { QueryUtils.check(q,searcher); @@ -133,10 +139,11 @@ super.setUp(); // - RAMDirectory rd = new RAMDirectory(); + dir = new RAMDirectory(); + Random random = newRandom(); // - IndexWriter writer = new IndexWriter(rd, new IndexWriterConfig( + RandomIndexWriter writer = new RandomIndexWriter(random, dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer())); // @@ -154,9 +161,18 @@ // writer.addDocument(d); - writer.close(); + reader = writer.getReader(); // - searcher = new IndexSearcher(rd, true); + searcher = new IndexSearcher(reader); + writer.close(); } + + @Override + protected void tearDown() throws Exception { + searcher.close(); + reader.close(); + dir.close(); + super.tearDown(); + } } Index: lucene/src/test/org/apache/lucene/search/TestWildcardRandom.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestWildcardRandom.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestWildcardRandom.java (working copy) @@ -26,8 +26,11 @@ import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; +import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util._TestUtil; @@ -40,13 +43,15 @@ public class TestWildcardRandom extends LuceneTestCase { private Searcher searcher; private Random random; + private Directory dir; @Override protected void setUp() throws Exception { super.setUp(); - RAMDirectory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new MockAnalyzer(), - IndexWriter.MaxFieldLength.UNLIMITED); + random = newRandom(); + dir = new RAMDirectory(); + RandomIndexWriter writer = new RandomIndexWriter(random, dir, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); Document doc = new Document(); Field field = new Field("field", "", Field.Store.NO, Field.Index.ANALYZED); @@ -58,9 +63,9 @@ writer.addDocument(doc); } - writer.optimize(); + IndexReader reader = writer.getReader(); + searcher = new IndexSearcher(reader); writer.close(); - searcher = new IndexSearcher(dir); } private char N() { @@ -82,6 +87,7 @@ } private void assertPatternHits(String pattern, int numHits) throws Exception { + // TODO: run with different rewrites Query wq = new WildcardQuery(new Term("field", fillPattern(pattern))); TopDocs docs = searcher.search(wq, 25); assertEquals("Incorrect hits for pattern: " + pattern, numHits, docs.totalHits); @@ -90,11 +96,11 @@ @Override protected void tearDown() throws Exception { searcher.close(); + dir.close(); super.tearDown(); } - public void testWildcards() throws Exception { - random = newRandom(System.nanoTime()); + public void testWildcards() throws Exception {; for (int i = 0; i < 100*_TestUtil.getRandomMultiplier(); i++) { assertPatternHits("NNNN", 1); assertPatternHits("?NNN", 10); Index: lucene/src/test/org/apache/lucene/search/TestTopDocsCollector.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestTopDocsCollector.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestTopDocsCollector.java (working copy) @@ -22,8 +22,8 @@ import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.LuceneTestCase; @@ -93,10 +93,11 @@ private static final float MAX_SCORE = 9.17561f; private Directory dir = new RAMDirectory(); + private IndexReader reader; private TopDocsCollector doSearch(int numResults) throws IOException { Query q = new MatchAllDocsQuery(); - IndexSearcher searcher = new IndexSearcher(dir, true); + IndexSearcher searcher = new IndexSearcher(reader); TopDocsCollector tdc = new MyTopsDocCollector(numResults); searcher.search(q, tdc); searcher.close(); @@ -109,15 +110,17 @@ // populate an index with 30 documents, this should be enough for the test. // The documents have no content - the test uses MatchAllDocsQuery(). - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + RandomIndexWriter writer = new RandomIndexWriter(newRandom(), dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); for (int i = 0; i < 30; i++) { writer.addDocument(new Document()); } + reader = writer.getReader(); writer.close(); } @Override protected void tearDown() throws Exception { + reader.close(); dir.close(); dir = null; super.tearDown(); Index: lucene/src/test/org/apache/lucene/search/TestWildcard.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestWildcard.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestWildcard.java (working copy) @@ -23,19 +23,28 @@ import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.Field.Index; -import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.store.RAMDirectory; import java.io.IOException; +import java.util.Random; /** * TestWildcard tests the '*' and '?' wildcard characters. */ public class TestWildcard extends LuceneTestCase { + private Random random; + + @Override + public void setUp() throws Exception { + super.setUp(); + random = newRandom(); + } + public void testEquals() { WildcardQuery wq1 = new WildcardQuery(new Term("field", "b*a")); WildcardQuery wq2 = new WildcardQuery(new Term("field", "b*a")); @@ -193,14 +202,13 @@ private RAMDirectory getIndexStore(String field, String[] contents) throws IOException { RAMDirectory indexStore = new RAMDirectory(); - IndexWriter writer = new IndexWriter(indexStore, new IndexWriterConfig( + RandomIndexWriter writer = new RandomIndexWriter(random, indexStore, new IndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer())); for (int i = 0; i < contents.length; ++i) { Document doc = new Document(); doc.add(new Field(field, contents[i], Field.Store.YES, Field.Index.ANALYZED)); writer.addDocument(doc); } - writer.optimize(); writer.close(); return indexStore; @@ -251,7 +259,8 @@ // prepare the index RAMDirectory dir = new RAMDirectory(); - IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + RandomIndexWriter iw = new RandomIndexWriter(random, dir, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); for (int i = 0; i < docs.length; i++) { Document doc = new Document(); doc.add(new Field(field,docs[i],Store.NO,Index.ANALYZED)); Index: lucene/src/test/org/apache/lucene/search/TestAutomatonQuery.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestAutomatonQuery.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestAutomatonQuery.java (working copy) @@ -18,13 +18,17 @@ */ import java.io.IOException; +import java.util.Random; import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermsEnum; +import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.automaton.Automaton; @@ -32,15 +36,18 @@ import org.apache.lucene.util.automaton.BasicOperations; public class TestAutomatonQuery extends LuceneTestCase { + private Directory directory; + private IndexReader reader; private IndexSearcher searcher; - + private final String FN = "field"; public void setUp() throws Exception { super.setUp(); - RAMDirectory directory = new RAMDirectory(); - IndexWriter writer = new IndexWriter(directory, new MockAnalyzer(), true, - IndexWriter.MaxFieldLength.LIMITED); + Random random = newRandom(); + directory = new RAMDirectory(); + RandomIndexWriter writer = new RandomIndexWriter(random, directory, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); Document doc = new Document(); Field titleField = new Field("title", "some title", Field.Store.NO, Field.Index.ANALYZED); @@ -57,13 +64,15 @@ field.setValue("doc three has some different stuff" + " with numbers 1234 5678.9 and letter b"); writer.addDocument(doc); - writer.optimize(); + reader = writer.getReader(); + searcher = new IndexSearcher(reader); writer.close(); - searcher = new IndexSearcher(directory, true); } public void tearDown() throws Exception { searcher.close(); + reader.close(); + directory.close(); super.tearDown(); } Index: lucene/src/test/org/apache/lucene/search/TestBoolean2.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestBoolean2.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestBoolean2.java (working copy) @@ -23,8 +23,8 @@ import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; -import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; @@ -42,6 +42,7 @@ private IndexSearcher searcher; private IndexSearcher bigSearcher; private IndexReader reader; + private Random rnd; private static int NUM_EXTRA_DOCS = 6000; public static final String field = "field"; @@ -51,8 +52,9 @@ @Override protected void setUp() throws Exception { super.setUp(); + rnd = newRandom(); RAMDirectory directory = new RAMDirectory(); - IndexWriter writer= new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + RandomIndexWriter writer= new RandomIndexWriter(rnd, directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); for (int i = 0; i < docFields.length; i++) { Document doc = new Document(); doc.add(new Field(field, docFields[i], Field.Store.NO, Field.Index.ANALYZED)); @@ -69,14 +71,14 @@ int docCount = 0; do { final Directory copy = new RAMDirectory(dir2); - IndexWriter w = new IndexWriter(dir2, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + RandomIndexWriter w = new RandomIndexWriter(rnd, dir2, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); w.addIndexes(new Directory[] {copy}); docCount = w.maxDoc(); w.close(); mulFactor *= 2; } while(docCount < 3000); - IndexWriter w = new IndexWriter(dir2, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + RandomIndexWriter w = new RandomIndexWriter(rnd, dir2, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); Document doc = new Document(); doc.add(new Field("field2", "xxx", Field.Store.NO, Field.Index.ANALYZED)); for(int i=0;i tdc = TopScoreDocCollector.create(3, inOrder[i]); assertEquals("org.apache.lucene.search.TopScoreDocCollector$" + actualTSDCClass[i], tdc.getClass().getName()); @@ -71,6 +75,10 @@ assertEquals("expected doc Id " + j + " found " + sd[j].doc, j, sd[j].doc); } } + writer.close(); + searcher.close(); + reader.close(); + dir.close(); } } Index: lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java (revision 963263) +++ lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery32.java (working copy) @@ -23,8 +23,10 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.NumericField; +import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.BytesRef; @@ -46,12 +48,15 @@ private static final int noDocs = 10000*_TestUtil.getRandomMultiplier(); private static RAMDirectory directory = null; + private static IndexReader reader = null; private static IndexSearcher searcher = null; - + @BeforeClass public static void beforeClass() throws Exception { directory = new RAMDirectory(); - IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + Random random = newStaticRandom(TestNumericRangeQuery32.class); + RandomIndexWriter writer = new RandomIndexWriter(random, directory, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); NumericField field8 = new NumericField("field8", 8, Field.Store.YES, true), @@ -83,15 +88,17 @@ writer.addDocument(doc); } - writer.optimize(); + reader = writer.getReader(); + searcher=new IndexSearcher(reader); writer.close(); - searcher=new IndexSearcher(directory, true); } @AfterClass public static void afterClass() throws Exception { searcher.close(); searcher = null; + reader.close(); + reader = null; directory.close(); directory = null; } @@ -147,7 +154,7 @@ 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) { + if (i>0 && searcher.getIndexReader().getSequentialSubReaders().length == 1) { assertEquals("Distinct term number is equal for all query types", lastTerms, terms); } lastTerms = terms; @@ -372,7 +379,7 @@ termCountT += tq.getTotalNumberOfTerms(); termCountC += cq.getTotalNumberOfTerms(); } - if (precisionStep == Integer.MAX_VALUE) { + if (precisionStep == Integer.MAX_VALUE && 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 963263) +++ lucene/src/test/org/apache/lucene/search/TestNumericRangeQuery64.java (working copy) @@ -23,8 +23,10 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.NumericField; +import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.LuceneTestCaseJ4; @@ -45,12 +47,15 @@ private static final int noDocs = 10000*_TestUtil.getRandomMultiplier(); private static RAMDirectory directory = null; + private static IndexReader reader = null; private static IndexSearcher searcher = null; @BeforeClass public static void beforeClass() throws Exception { directory = new RAMDirectory(); - IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); + Random random = newStaticRandom(TestNumericRangeQuery64.class); + RandomIndexWriter writer = new RandomIndexWriter(random, directory, + new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())); NumericField field8 = new NumericField("field8", 8, Field.Store.YES, true), @@ -86,15 +91,17 @@ writer.addDocument(doc); } - writer.optimize(); + reader = writer.getReader(); + searcher=new IndexSearcher(reader); writer.close(); - searcher=new IndexSearcher(directory, true); } @AfterClass public static void afterClass() throws Exception { searcher.close(); searcher = null; + reader.close(); + reader = null; directory.close(); directory = null; } @@ -150,7 +157,7 @@ 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) { + if (i>0 && searcher.getIndexReader().getSequentialSubReaders().length == 1) { assertEquals("Distinct term number is equal for all query types", lastTerms, terms); } lastTerms = terms; @@ -391,7 +398,7 @@ termCountT += tq.getTotalNumberOfTerms(); termCountC += cq.getTotalNumberOfTerms(); } - if (precisionStep == Integer.MAX_VALUE) { + if (precisionStep == Integer.MAX_VALUE && 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/index/RandomIndexWriter.java =================================================================== --- lucene/src/test/org/apache/lucene/index/RandomIndexWriter.java (revision 0) +++ lucene/src/test/org/apache/lucene/index/RandomIndexWriter.java (revision 0) @@ -0,0 +1,125 @@ +package org.apache.lucene.index; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Random; +import java.io.Closeable; +import java.io.IOException; + +import org.apache.lucene.util._TestUtil; +import org.apache.lucene.store.Directory; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.codecs.Codec; +import org.apache.lucene.index.codecs.CodecProvider; +import org.apache.lucene.index.codecs.intblock.IntBlockCodec; +import org.apache.lucene.index.codecs.preflex.PreFlexCodec; +import org.apache.lucene.index.codecs.pulsing.PulsingCodec; +import org.apache.lucene.index.codecs.sep.SepCodec; +import org.apache.lucene.index.codecs.standard.StandardCodec; + +/** Silly class that randomizes the indexing experience. EG + * it may swap in a different merge policy/scheduler; may + * commit periodically; may or may not optimize in the end, + * may flush by doc count instead of RAM, etc. + */ + +public class RandomIndexWriter implements Closeable { + + public IndexWriter w; + private final Random r; + int docCount; + int flushAt; + + public RandomIndexWriter(Random r, Directory dir, IndexWriterConfig c) throws IOException { + this.r = r; + if (r.nextBoolean()) { + c.setMergePolicy(new LogDocMergePolicy()); + } + if (r.nextBoolean()) { + c.setMergeScheduler(new SerialMergeScheduler()); + } + if (r.nextBoolean()) { + c.setMaxBufferedDocs(_TestUtil.nextInt(r, 20, 1000)); + } + if (r.nextBoolean()) { + c.setTermIndexInterval(_TestUtil.nextInt(r, 1, 1000)); + } + + if (c.getMergePolicy() instanceof LogMergePolicy) { + LogMergePolicy logmp = (LogMergePolicy) c.getMergePolicy(); + logmp.setUseCompoundDocStore(r.nextBoolean()); + logmp.setUseCompoundFile(r.nextBoolean()); + logmp.setCalibrateSizeByDeletes(r.nextBoolean()); + } + + c.setReaderPooling(r.nextBoolean()); + c.setCodecProvider(new RandomCodecProvider(r)); + w = new IndexWriter(dir, c); + flushAt = _TestUtil.nextInt(r, 10, 1000); + } + + public void addDocument(Document doc) throws IOException { + w.addDocument(doc); + if (docCount++ == flushAt) { + w.commit(); + flushAt += _TestUtil.nextInt(r, 10, 1000); + } + } + + public void addIndexes(Directory... dirs) throws CorruptIndexException, IOException { + w.addIndexes(dirs); + } + + public int maxDoc() { + return w.maxDoc(); + } + + public IndexReader getReader() throws IOException { + if (r.nextBoolean()) { + return w.getReader(); + } else { + w.commit(); + return IndexReader.open(w.getDirectory(), new KeepOnlyLastCommitDeletionPolicy(), r.nextBoolean(), _TestUtil.nextInt(r, 1, 10)); + } + } + + public void close() throws IOException { + if (r.nextInt(4) == 2) { + w.optimize(); + } + w.close(); + } + + class RandomCodecProvider extends CodecProvider { + final String codec; + + RandomCodecProvider(Random random) { + register(new StandardCodec()); + register(new IntBlockCodec()); + register(new PreFlexCodec()); + register(new PulsingCodec()); + register(new SepCodec()); + codec = CodecProvider.CORE_CODECS[random.nextInt(CodecProvider.CORE_CODECS.length)]; + } + + @Override + public Codec getWriter(SegmentWriteState state) { + return lookup(codec); + } + } +} Property changes on: lucene\src\test\org\apache\lucene\index\RandomIndexWriter.java ___________________________________________________________________ Added: svn:eol-style + native Index: lucene/src/test/org/apache/lucene/util/LuceneTestCaseJ4.java =================================================================== --- lucene/src/test/org/apache/lucene/util/LuceneTestCaseJ4.java (revision 963263) +++ lucene/src/test/org/apache/lucene/util/LuceneTestCaseJ4.java (working copy) @@ -33,6 +33,7 @@ import java.io.PrintStream; import java.io.IOException; import java.util.Arrays; +import java.util.Hashtable; import java.util.Iterator; import java.util.Random; import java.util.ArrayList; @@ -330,6 +331,17 @@ return new Random(seed); } + private static Hashtable,Long> staticSeeds = new Hashtable,Long>(); + + public static Random newStaticRandom(Class clazz) { + return newStaticRandom(clazz, seedRnd.nextLong()); + } + + public static Random newStaticRandom(Class clazz, long seed) { + staticSeeds.put(clazz, Long.valueOf(seed)); + return new Random(seed); + } + public String getName() { return this.name; } @@ -348,6 +360,11 @@ // We get here from InterceptTestCaseEvents on the 'failed' event.... public void reportAdditionalFailureInfo() { + Long staticSeed = staticSeeds.get(getClass()); + if (staticSeed != null) { + System.out.println("NOTE: random static seed of testclass '" + getName() + "' was: " + staticSeed); + } + if (seed != null) { System.out.println("NOTE: random seed of testcase '" + getName() + "' was: " + seed); }