Skip to content

Commit 3e8c879

Browse files
authored
Fix flaky TestParentsChildrenBlockJoinQuery (#15435)
These tests assumed that merges would preserve document order across segments. Using some form of LogMergePolicy ensures that's true.
1 parent dd70ed5 commit 3e8c879

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

lucene/join/src/test/org/apache/lucene/search/join/TestParentsChildrenBlockJoinQuery.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616
*/
1717
package org.apache.lucene.search.join;
1818

19+
import java.io.IOException;
1920
import java.util.ArrayList;
2021
import java.util.Arrays;
2122
import java.util.HashSet;
2223
import java.util.List;
24+
import java.util.Objects;
2325
import java.util.Set;
2426
import java.util.stream.Collectors;
2527
import org.apache.lucene.document.Document;
2628
import org.apache.lucene.document.Field;
2729
import org.apache.lucene.document.StoredField;
2830
import org.apache.lucene.document.StringField;
2931
import org.apache.lucene.index.IndexReader;
30-
import org.apache.lucene.index.NoMergePolicy;
3132
import org.apache.lucene.index.Term;
3233
import org.apache.lucene.search.BooleanClause;
3334
import org.apache.lucene.search.BooleanQuery;
@@ -47,6 +48,15 @@
4748

4849
public class TestParentsChildrenBlockJoinQuery extends LuceneTestCase {
4950

51+
private static RandomIndexWriter createIndexWriter(Directory dir) throws IOException {
52+
// We need a merge policy that merges segments sequentially.
53+
// Most tests here merge down to a single segment and assume the order of documents in the
54+
// segment
55+
// matches the order in which they were added.
56+
return new RandomIndexWriter(
57+
random(), dir, newIndexWriterConfig().setMergePolicy(newLogMergePolicy()));
58+
}
59+
5060
@Test
5161
public void testEmptyIndex() throws Exception {
5262
// No documents to index, just test the query execution
@@ -78,7 +88,6 @@ public void testFirstParentWithoutChild() throws Exception {
7888

7989
@Test
8090
public void testWithRandomizedIndex() throws Exception {
81-
8291
for (int i = 0; i < 10; i++) {
8392
// Run multiple iterations to ensure randomness
8493
if (VERBOSE) {
@@ -162,9 +171,7 @@ public void testAdvance() throws Exception {
162171
blocks[2][2] = new TestDoc("parent", true, 9); // docId=9
163172

164173
final Directory dir = newDirectory();
165-
final RandomIndexWriter writer =
166-
new RandomIndexWriter(
167-
random(), dir, newIndexWriterConfig().setMergePolicy(newMergePolicy(random(), false)));
174+
final RandomIndexWriter writer = createIndexWriter(dir);
168175

169176
// Add documents
170177
List<Document> docs = new ArrayList<>();
@@ -204,7 +211,7 @@ public void testAdvance() throws Exception {
204211
Weight weight =
205212
searcher.createWeight(
206213
searcher.rewrite(query), org.apache.lucene.search.ScoreMode.COMPLETE, 1);
207-
Scorer scorer = weight.scorer(reader.leaves().get(0));
214+
Scorer scorer = weight.scorer(reader.leaves().getFirst());
208215
assert scorer != null;
209216
DocIdSetIterator it = scorer.iterator();
210217

@@ -224,9 +231,7 @@ public void testAdvance() throws Exception {
224231
private void test(TestDoc[][] blocks, int[] expectedDocIds, int childLimitPerParent)
225232
throws Exception {
226233
final Directory dir = newDirectory();
227-
final RandomIndexWriter writer =
228-
new RandomIndexWriter(
229-
random(), dir, newIndexWriterConfig().setMergePolicy(newMergePolicy(random(), false)));
234+
final RandomIndexWriter writer = createIndexWriter(dir);
230235

231236
// Add documents based on test case
232237
final List<Document> docs = new ArrayList<>();
@@ -274,8 +279,8 @@ private void test(TestDoc[][] blocks, int[] expectedDocIds, int childLimitPerPar
274279
// Verify the matching documents
275280
for (ScoreDoc scoreDoc : results.scoreDocs) {
276281
Document doc = reader.storedFields().document(scoreDoc.doc);
277-
String type = doc.getField("type").stringValue();
278-
Integer id = doc.getField("ID").numericValue().intValue();
282+
String type = Objects.requireNonNull(doc.getField("type")).stringValue();
283+
Integer id = Objects.requireNonNull(doc.getField("ID")).numericValue().intValue();
279284
assertEquals("child", type); // All results should be children
280285
assertTrue(expectedDocIdSet.contains(id));
281286
}
@@ -292,7 +297,7 @@ private void test(TestDoc[][] blocks, int[] expectedDocIds, int childLimitPerPar
292297
int i = 0;
293298
for (ScoreDoc scoreDoc : results.scoreDocs) {
294299
Document doc = reader.storedFields().document(scoreDoc.doc);
295-
int id = doc.getField("ID").numericValue().intValue();
300+
int id = Objects.requireNonNull(doc.getField("ID")).numericValue().intValue();
296301
actualDocIds[i++] = id;
297302
}
298303
System.out.println("Actual docIds: " + Arrays.toString(actualDocIds));
@@ -352,9 +357,7 @@ public void testExplain() throws Exception {
352357
blocks[1][2] = new TestDoc("parent", true, 5); // docId=5
353358

354359
Directory dir = newDirectory();
355-
final RandomIndexWriter writer =
356-
new RandomIndexWriter(
357-
random(), dir, newIndexWriterConfig().setMergePolicy(NoMergePolicy.INSTANCE));
360+
final RandomIndexWriter writer = createIndexWriter(dir);
358361

359362
// Add documents
360363
List<Document> docs = new ArrayList<>();
@@ -428,9 +431,7 @@ public void testIntraSegmentConcurrencyNotSupported() throws Exception {
428431
}
429432

430433
Directory dir = newDirectory();
431-
final RandomIndexWriter writer =
432-
new RandomIndexWriter(
433-
random(), dir, newIndexWriterConfig().setMergePolicy(newMergePolicy(random(), false)));
434+
final RandomIndexWriter writer = createIndexWriter(dir);
434435

435436
// Add documents
436437
List<Document> docs = new ArrayList<>();

0 commit comments

Comments
 (0)