1111
1212import  org .apache .lucene .document .Document ;
1313import  org .apache .lucene .index .DirectoryReader ;
14- import  org .apache .lucene .index .LeafReaderContext ;
14+ import  org .apache .lucene .index .LeafReader ;
1515import  org .apache .lucene .store .Directory ;
1616import  org .apache .lucene .tests .index .RandomIndexWriter ;
1717import  org .apache .lucene .util .BytesRef ;
3030import  org .elasticsearch .test .hamcrest .WellKnownBinaryBytesRefMatcher ;
3131
3232import  java .io .IOException ;
33+ import  java .util .ArrayList ;
3334import  java .util .Optional ;
3435import  java .util .function .Function ;
3536import  java .util .function .Supplier ;
@@ -61,7 +62,7 @@ private void testBoundsBlockLoaderAux(
6162        Function <String , ShapeIndexer > indexerFactory ,
6263        Function <Geometry , Optional <Rectangle >> visitor 
6364    ) throws  IOException  {
64-         var  geometries  = IntStream .range (0 , 20 ).mapToObj (i  -> generator .get ()).toList ();
65+         var  geometries  = IntStream .range (0 , 50 ).mapToObj (i  -> generator .get ()).toList ();
6566        var  loader  = new  AbstractShapeGeometryFieldMapper .AbstractShapeGeometryFieldType .BoundsBlockLoader ("field" , encoder );
6667        try  (Directory  directory  = newDirectory ()) {
6768            try  (var  iw  = new  RandomIndexWriter (random (), directory )) {
@@ -73,23 +74,39 @@ private void testBoundsBlockLoaderAux(
7374                    iw .addDocument (doc );
7475                }
7576            }
76-             var  indices  = IntStream .range (0 , geometries .size () / 2 ).map (x  -> x  * 2 ).toArray ();
77+             // We specifically check just the even indices, to verify the loader can skip documents correctly. 
78+             var  evenIndices  = evenArray (geometries .size ());
7779            try  (DirectoryReader  reader  = DirectoryReader .open (directory )) {
78-                 LeafReaderContext  ctx  = reader .leaves ().get (0 );
79-                 TestBlock  block  = (TestBlock ) loader .reader (ctx ).read (TestBlock .factory (ctx .reader ().numDocs ()), TestBlock .docs (indices ));
80-                 for  (int  i  = 0 ; i  < indices .length ; i ++) {
81-                     var  idx  = indices [i ];
80+                 var  byteRefResults  = new  ArrayList <BytesRef >();
81+                 for  (var  leaf  : reader .leaves ()) {
82+                     LeafReader  leafReader  = leaf .reader ();
83+                     int  numDocs  = leafReader .numDocs ();
84+                     try  (
85+                         TestBlock  block  = (TestBlock ) loader .reader (leaf )
86+                             .read (TestBlock .factory (leafReader .numDocs ()), TestBlock .docs (evenArray (numDocs )))
87+                     ) {
88+                         for  (int  i  = 0 ; i  < block .size (); i ++) {
89+                             byteRefResults .add ((BytesRef ) block .get (i ));
90+                         }
91+                     }
92+                 }
93+                 for  (int  i  = 0 ; i  < evenIndices .length ; i ++) {
94+                     var  idx  = evenIndices [i ];
8295                    var  geometry  = geometries .get (idx );
8396                    var  geoString  = geometry .toString ();
8497                    var  geometryString  = geoString .length () > 200  ? geoString .substring (0 , 200 ) + "..."  : geoString ;
8598                    Rectangle  r  = visitor .apply (geometry ).get ();
8699                    assertThat (
87100                        Strings .format ("geometries[%d] ('%s') wasn't extracted correctly" , idx , geometryString ),
88-                         ( BytesRef )  block .get (i ),
101+                         byteRefResults .get (i ),
89102                        WellKnownBinaryBytesRefMatcher .encodes (RectangleMatcher .closeToFloat (r , 1e-3 , encoder ))
90103                    );
91104                }
92105            }
93106        }
94107    }
108+ 
109+     private  static  int [] evenArray (int  maxIndex ) {
110+         return  IntStream .range (0 , maxIndex  / 2 ).map (x  -> x  * 2 ).toArray ();
111+     }
95112}
0 commit comments