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