You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2014/04/21 20:40:49 UTC
svn commit: r1588957 - in /lucene/dev/branches/branch_4x: ./ lucene/
lucene/misc/
lucene/misc/src/test/org/apache/lucene/index/sorter/TestEarlyTermination.java
lucene/misc/src/test/org/apache/lucene/index/sorter/TestSortingMergePolicy.java
Author: rmuir
Date: Mon Apr 21 18:40:49 2014
New Revision: 1588957
URL: http://svn.apache.org/r1588957
Log:
LUCENE-5623: fix test to be reproducible and more evil
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/misc/ (props changed)
lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestEarlyTermination.java
lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestSortingMergePolicy.java
Modified: lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestEarlyTermination.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestEarlyTermination.java?rev=1588957&r1=1588956&r2=1588957&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestEarlyTermination.java (original)
+++ lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestEarlyTermination.java Mon Apr 21 18:40:49 2014
@@ -33,8 +33,11 @@ import org.apache.lucene.index.AtomicRea
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.SerialMergeScheduler;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
@@ -71,7 +74,7 @@ public class TestEarlyTermination extend
return doc;
}
- private void createRandomIndexes(int maxSegments) throws IOException {
+ private void createRandomIndex() throws IOException {
dir = newDirectory();
numDocs = atLeast(150);
final int numTerms = TestUtil.nextInt(random(), 1, numDocs / 5);
@@ -82,8 +85,10 @@ public class TestEarlyTermination extend
terms = new ArrayList<>(randomTerms);
final long seed = random().nextLong();
final IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(new Random(seed)));
+ iwc.setMergeScheduler(new SerialMergeScheduler()); // for reproducible tests
iwc.setMergePolicy(TestSortingMergePolicy.newSortingMergePolicy(sort));
iw = new RandomIndexWriter(new Random(seed), dir, iwc);
+ iw.setDoRandomForceMerge(false); // don't do this, it may happen anyway with MockRandomMP
for (int i = 0; i < numDocs; ++i) {
final Document doc = randomDocument();
iw.addDocument(doc);
@@ -95,56 +100,70 @@ public class TestEarlyTermination extend
iw.deleteDocuments(new Term("s", term));
}
}
+ if (random().nextBoolean()) {
+ iw.forceMerge(5);
+ }
reader = iw.getReader();
}
-
- @Override
- public void tearDown() throws Exception {
+
+ private void closeIndex() throws IOException {
reader.close();
iw.close();
dir.close();
- super.tearDown();
}
public void testEarlyTermination() throws IOException {
- createRandomIndexes(5);
- final int numHits = TestUtil.nextInt(random(), 1, numDocs / 10);
- final Sort sort = new Sort(new SortField("ndv1", SortField.Type.LONG, false));
- final boolean fillFields = random().nextBoolean();
- final boolean trackDocScores = random().nextBoolean();
- final boolean trackMaxScore = random().nextBoolean();
- final boolean inOrder = random().nextBoolean();
- final TopFieldCollector collector1 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
- final TopFieldCollector collector2 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
-
- final IndexSearcher searcher = newSearcher(reader);
- final int iters = atLeast(5);
+ final int iters = atLeast(8);
for (int i = 0; i < iters; ++i) {
- final TermQuery query = new TermQuery(new Term("s", RandomPicks.randomFrom(random(), terms)));
- searcher.search(query, collector1);
- searcher.search(query, new EarlyTerminatingSortingCollector(collector2, sort, numHits));
+ createRandomIndex();
+ for (int j = 0; j < iters; ++j) {
+ final IndexSearcher searcher = newSearcher(reader);
+ final int numHits = TestUtil.nextInt(random(), 1, numDocs);
+ final Sort sort = new Sort(new SortField("ndv1", SortField.Type.LONG, false));
+ final boolean fillFields = random().nextBoolean();
+ final boolean trackDocScores = random().nextBoolean();
+ final boolean trackMaxScore = random().nextBoolean();
+ final boolean inOrder = random().nextBoolean();
+ final TopFieldCollector collector1 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
+ final TopFieldCollector collector2 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
+
+ final Query query;
+ if (random().nextBoolean()) {
+ query = new TermQuery(new Term("s", RandomPicks.randomFrom(random(), terms)));
+ } else {
+ query = new MatchAllDocsQuery();
+ }
+ searcher.search(query, collector1);
+ searcher.search(query, new EarlyTerminatingSortingCollector(collector2, sort, numHits));
+ assertTrue(collector1.getTotalHits() >= collector2.getTotalHits());
+ assertTopDocsEquals(collector1.topDocs().scoreDocs, collector2.topDocs().scoreDocs);
+ }
+ closeIndex();
}
- assertTrue(collector1.getTotalHits() >= collector2.getTotalHits());
- assertTopDocsEquals(collector1.topDocs().scoreDocs, collector2.topDocs().scoreDocs);
}
public void testEarlyTerminationDifferentSorter() throws IOException {
- // test that the collector works correctly when the index was sorted by a
- // different sorter than the one specified in the ctor.
- createRandomIndexes(5);
- final int numHits = TestUtil.nextInt(random(), 1, numDocs / 10);
- final Sort sort = new Sort(new SortField("ndv2", SortField.Type.LONG, false));
- final boolean fillFields = random().nextBoolean();
- final boolean trackDocScores = random().nextBoolean();
- final boolean trackMaxScore = random().nextBoolean();
- final boolean inOrder = random().nextBoolean();
- final TopFieldCollector collector1 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
- final TopFieldCollector collector2 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
-
- final IndexSearcher searcher = newSearcher(reader);
- final int iters = atLeast(5);
+ createRandomIndex();
+ final int iters = atLeast(3);
for (int i = 0; i < iters; ++i) {
- final TermQuery query = new TermQuery(new Term("s", RandomPicks.randomFrom(random(), terms)));
+ final IndexSearcher searcher = newSearcher(reader);
+ // test that the collector works correctly when the index was sorted by a
+ // different sorter than the one specified in the ctor.
+ final int numHits = TestUtil.nextInt(random(), 1, numDocs);
+ final Sort sort = new Sort(new SortField("ndv2", SortField.Type.LONG, false));
+ final boolean fillFields = random().nextBoolean();
+ final boolean trackDocScores = random().nextBoolean();
+ final boolean trackMaxScore = random().nextBoolean();
+ final boolean inOrder = random().nextBoolean();
+ final TopFieldCollector collector1 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
+ final TopFieldCollector collector2 = TopFieldCollector.create(sort, numHits, fillFields, trackDocScores, trackMaxScore, inOrder);
+
+ final Query query;
+ if (random().nextBoolean()) {
+ query = new TermQuery(new Term("s", RandomPicks.randomFrom(random(), terms)));
+ } else {
+ query = new MatchAllDocsQuery();
+ }
searcher.search(query, collector1);
Sort different = new Sort(new SortField("ndv2", SortField.Type.LONG));
searcher.search(query, new EarlyTerminatingSortingCollector(collector2, different, numHits) {
@@ -154,9 +173,10 @@ public class TestEarlyTermination extend
assertFalse("segment should not be recognized as sorted as different sorter was used", segmentSorted);
}
});
+ assertTrue(collector1.getTotalHits() >= collector2.getTotalHits());
+ assertTopDocsEquals(collector1.topDocs().scoreDocs, collector2.topDocs().scoreDocs);
}
- assertTrue(collector1.getTotalHits() >= collector2.getTotalHits());
- assertTopDocsEquals(collector1.topDocs().scoreDocs, collector2.topDocs().scoreDocs);
+ closeIndex();
}
private static void assertTopDocsEquals(ScoreDoc[] scoreDocs1, ScoreDoc[] scoreDocs2) {
Modified: lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestSortingMergePolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestSortingMergePolicy.java?rev=1588957&r1=1588956&r2=1588957&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestSortingMergePolicy.java (original)
+++ lucene/dev/branches/branch_4x/lucene/misc/src/test/org/apache/lucene/index/sorter/TestSortingMergePolicy.java Mon Apr 21 18:40:49 2014
@@ -73,18 +73,22 @@ public class TestSortingMergePolicy exte
}
static MergePolicy newSortingMergePolicy(Sort sort) {
- // create a MP with a low merge factor so that many merges happen
+ // usually create a MP with a low merge factor so that many merges happen
MergePolicy mp;
- if (random().nextBoolean()) {
+ int thingToDo = random().nextInt(3);
+ if (thingToDo == 0) {
TieredMergePolicy tmp = newTieredMergePolicy(random());
final int numSegs = TestUtil.nextInt(random(), 3, 5);
tmp.setSegmentsPerTier(numSegs);
tmp.setMaxMergeAtOnce(TestUtil.nextInt(random(), 2, numSegs));
mp = tmp;
- } else {
+ } else if (thingToDo == 1) {
LogMergePolicy lmp = newLogMergePolicy(random());
lmp.setMergeFactor(TestUtil.nextInt(random(), 3, 5));
mp = lmp;
+ } else {
+ // just a regular random one from LTC (could be alcoholic etc)
+ mp = newMergePolicy();
}
// wrap it with a sorting mp
return new SortingMergePolicy(mp, sort);