Skip to content

Commit cff19c8

Browse files
authored
ESQL: Fix flaky AbstractShapeGeometryFieldMapperTests (elastic#119579) (elastic#119585)
This time, there was an issue with the way even indices were selected: if one of the leaf reader held an odd number of documents, it would screw up the document indices for the remainder of the computation.
1 parent 73a1ce9 commit cff19c8

File tree

1 file changed

+23
-21
lines changed

1 file changed

+23
-21
lines changed

server/src/test/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapperTests.java

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
import org.apache.lucene.store.Directory;
1616
import org.apache.lucene.tests.index.RandomIndexWriter;
1717
import org.apache.lucene.util.BytesRef;
18-
import org.elasticsearch.common.Strings;
1918
import org.elasticsearch.common.geo.Orientation;
19+
import org.elasticsearch.core.Strings;
2020
import org.elasticsearch.geo.GeometryTestUtils;
2121
import org.elasticsearch.geo.ShapeTestUtils;
2222
import org.elasticsearch.geometry.Geometry;
@@ -56,7 +56,7 @@ public void ignoreTestGeoBoundsBlockLoader() throws IOException {
5656
);
5757
}
5858

59-
private void testBoundsBlockLoaderAux(
59+
private static void testBoundsBlockLoaderAux(
6060
CoordinateEncoder encoder,
6161
Supplier<Geometry> generator,
6262
Function<String, ShapeIndexer> indexerFactory,
@@ -74,34 +74,36 @@ private void testBoundsBlockLoaderAux(
7474
iw.addDocument(doc);
7575
}
7676
}
77-
// We specifically check just the even indices, to verify the loader can skip documents correctly.
78-
var evenIndices = evenArray(geometries.size());
77+
78+
var expected = new ArrayList<Rectangle>();
79+
var byteRefResults = new ArrayList<BytesRef>();
80+
int currentIndex = 0;
7981
try (DirectoryReader reader = DirectoryReader.open(directory)) {
80-
var byteRefResults = new ArrayList<BytesRef>();
8182
for (var leaf : reader.leaves()) {
8283
LeafReader leafReader = leaf.reader();
8384
int numDocs = leafReader.numDocs();
84-
try (
85-
TestBlock block = (TestBlock) loader.reader(leaf)
86-
.read(TestBlock.factory(leafReader.numDocs()), TestBlock.docs(evenArray(numDocs)))
87-
) {
85+
// We specifically check just the even indices, to verify the loader can skip documents correctly.
86+
int[] array = evenArray(numDocs);
87+
for (int i = 0; i < array.length; i += 1) {
88+
expected.add(visitor.apply(geometries.get(array[i] + currentIndex)).get());
89+
}
90+
try (var block = (TestBlock) loader.reader(leaf).read(TestBlock.factory(leafReader.numDocs()), TestBlock.docs(array))) {
8891
for (int i = 0; i < block.size(); i++) {
8992
byteRefResults.add((BytesRef) block.get(i));
9093
}
9194
}
95+
currentIndex += numDocs;
9296
}
93-
for (int i = 0; i < evenIndices.length; i++) {
94-
var idx = evenIndices[i];
95-
var geometry = geometries.get(idx);
96-
var geoString = geometry.toString();
97-
var geometryString = geoString.length() > 200 ? geoString.substring(0, 200) + "..." : geoString;
98-
Rectangle r = visitor.apply(geometry).get();
99-
assertThat(
100-
Strings.format("geometries[%d] ('%s') wasn't extracted correctly", idx, geometryString),
101-
byteRefResults.get(i),
102-
WellKnownBinaryBytesRefMatcher.encodes(RectangleMatcher.closeToFloat(r, 1e-3, encoder))
103-
);
104-
}
97+
}
98+
99+
for (int i = 0; i < expected.size(); i++) {
100+
Rectangle rectangle = expected.get(i);
101+
var geoString = rectangle.toString();
102+
assertThat(
103+
Strings.format("geometry '%s' wasn't extracted correctly", geoString),
104+
byteRefResults.get(i),
105+
WellKnownBinaryBytesRefMatcher.encodes(RectangleMatcher.closeToFloat(rectangle, 1e-3, encoder))
106+
);
105107
}
106108
}
107109
}

0 commit comments

Comments
 (0)