1616 */
1717package org .apache .lucene .search .join ;
1818
19+ import java .io .IOException ;
1920import java .util .ArrayList ;
2021import java .util .Arrays ;
2122import java .util .HashSet ;
2223import java .util .List ;
24+ import java .util .Objects ;
2325import java .util .Set ;
2426import java .util .stream .Collectors ;
2527import org .apache .lucene .document .Document ;
2628import org .apache .lucene .document .Field ;
2729import org .apache .lucene .document .StoredField ;
2830import org .apache .lucene .document .StringField ;
2931import org .apache .lucene .index .IndexReader ;
30- import org .apache .lucene .index .NoMergePolicy ;
3132import org .apache .lucene .index .Term ;
3233import org .apache .lucene .search .BooleanClause ;
3334import org .apache .lucene .search .BooleanQuery ;
4748
4849public 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