Skip to content

Commit 4b33908

Browse files
authored
Add more tests in GeoBoundsAggregatorTests (#53033)
this commit introduces more thorough field-type support tests as well as tests for unmapped and missing values. relates #42949.
1 parent 7004216 commit 4b33908

File tree

1 file changed

+109
-2
lines changed

1 file changed

+109
-2
lines changed

server/src/test/java/org/elasticsearch/search/aggregations/metrics/GeoBoundsAggregatorTests.java

Lines changed: 109 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,35 @@
2121

2222
import org.apache.lucene.document.Document;
2323
import org.apache.lucene.document.LatLonDocValuesField;
24+
import org.apache.lucene.document.NumericDocValuesField;
2425
import org.apache.lucene.index.IndexReader;
2526
import org.apache.lucene.index.RandomIndexWriter;
2627
import org.apache.lucene.search.IndexSearcher;
2728
import org.apache.lucene.search.MatchAllDocsQuery;
2829
import org.apache.lucene.store.Directory;
30+
import org.elasticsearch.ElasticsearchParseException;
2931
import org.elasticsearch.common.geo.GeoPoint;
32+
import org.elasticsearch.geo.GeometryTestUtils;
33+
import org.elasticsearch.geometry.Point;
3034
import org.elasticsearch.index.mapper.GeoPointFieldMapper;
3135
import org.elasticsearch.index.mapper.MappedFieldType;
36+
import org.elasticsearch.search.aggregations.AggregationBuilder;
3237
import org.elasticsearch.search.aggregations.AggregatorTestCase;
3338
import org.elasticsearch.search.aggregations.support.AggregationInspectionHelper;
39+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
40+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
3441
import org.elasticsearch.test.geo.RandomGeoGenerator;
3542

43+
import java.util.List;
44+
3645
import static org.elasticsearch.search.aggregations.metrics.InternalGeoBoundsTests.GEOHASH_TOLERANCE;
3746
import static org.hamcrest.Matchers.closeTo;
47+
import static org.hamcrest.Matchers.equalTo;
48+
import static org.hamcrest.Matchers.startsWith;
3849

3950
public class GeoBoundsAggregatorTests extends AggregatorTestCase {
4051
public void testEmpty() throws Exception {
41-
try (Directory dir = newDirectory();
42-
RandomIndexWriter w = new RandomIndexWriter(random(), dir)) {
52+
try (Directory dir = newDirectory(); RandomIndexWriter w = new RandomIndexWriter(random(), dir)) {
4353
GeoBoundsAggregationBuilder aggBuilder = new GeoBoundsAggregationBuilder("my_agg")
4454
.field("field")
4555
.wrapLongitude(false);
@@ -61,6 +71,93 @@ public void testEmpty() throws Exception {
6171
}
6272
}
6373

74+
public void testUnmappedFieldWithDocs() throws Exception {
75+
try (Directory dir = newDirectory(); RandomIndexWriter w = new RandomIndexWriter(random(), dir)) {
76+
if (randomBoolean()) {
77+
Document doc = new Document();
78+
doc.add(new LatLonDocValuesField("field", 0.0, 0.0));
79+
w.addDocument(doc);
80+
}
81+
82+
GeoBoundsAggregationBuilder aggBuilder = new GeoBoundsAggregationBuilder("my_agg")
83+
.field("non_existent")
84+
.wrapLongitude(false);
85+
86+
MappedFieldType fieldType = new GeoPointFieldMapper.GeoPointFieldType();
87+
fieldType.setHasDocValues(true);
88+
fieldType.setName("field");
89+
try (IndexReader reader = w.getReader()) {
90+
IndexSearcher searcher = new IndexSearcher(reader);
91+
InternalGeoBounds bounds = search(searcher, new MatchAllDocsQuery(), aggBuilder, fieldType);
92+
assertTrue(Double.isInfinite(bounds.top));
93+
assertTrue(Double.isInfinite(bounds.bottom));
94+
assertTrue(Double.isInfinite(bounds.posLeft));
95+
assertTrue(Double.isInfinite(bounds.posRight));
96+
assertTrue(Double.isInfinite(bounds.negLeft));
97+
assertTrue(Double.isInfinite(bounds.negRight));
98+
assertFalse(AggregationInspectionHelper.hasValue(bounds));
99+
}
100+
}
101+
}
102+
103+
public void testMissing() throws Exception {
104+
try (Directory dir = newDirectory(); RandomIndexWriter w = new RandomIndexWriter(random(), dir)) {
105+
Document doc = new Document();
106+
doc.add(new NumericDocValuesField("not_field", 1000L));
107+
w.addDocument(doc);
108+
109+
MappedFieldType fieldType = new GeoPointFieldMapper.GeoPointFieldType();
110+
fieldType.setHasDocValues(true);
111+
fieldType.setName("field");
112+
113+
Point point = GeometryTestUtils.randomPoint(false);
114+
double lon = point.getX();
115+
double lat = point.getY();
116+
117+
// valid missing values
118+
for (Object missingVal : List.of("POINT(" + lon + " " + lat + ")", lat + ", " + lon, new GeoPoint(lat, lon))) {
119+
GeoBoundsAggregationBuilder aggBuilder = new GeoBoundsAggregationBuilder("my_agg")
120+
.field("field")
121+
.missing(missingVal)
122+
.wrapLongitude(false);
123+
124+
try (IndexReader reader = w.getReader()) {
125+
IndexSearcher searcher = new IndexSearcher(reader);
126+
InternalGeoBounds bounds = search(searcher, new MatchAllDocsQuery(), aggBuilder, fieldType);
127+
assertThat(bounds.top, equalTo(lat));
128+
assertThat(bounds.bottom, equalTo(lat));
129+
assertThat(bounds.posLeft, equalTo(lon >= 0 ? lon : Double.POSITIVE_INFINITY));
130+
assertThat(bounds.posRight, equalTo(lon >= 0 ? lon : Double.NEGATIVE_INFINITY));
131+
assertThat(bounds.negLeft, equalTo(lon >= 0 ? Double.POSITIVE_INFINITY : lon));
132+
assertThat(bounds.negRight, equalTo(lon >= 0 ? Double.NEGATIVE_INFINITY : lon));
133+
}
134+
}
135+
}
136+
}
137+
138+
public void testInvalidMissing() throws Exception {
139+
try (Directory dir = newDirectory(); RandomIndexWriter w = new RandomIndexWriter(random(), dir)) {
140+
Document doc = new Document();
141+
doc.add(new NumericDocValuesField("not_field", 1000L));
142+
w.addDocument(doc);
143+
144+
MappedFieldType fieldType = new GeoPointFieldMapper.GeoPointFieldType();
145+
fieldType.setHasDocValues(true);
146+
fieldType.setName("field");
147+
148+
GeoBoundsAggregationBuilder aggBuilder = new GeoBoundsAggregationBuilder("my_agg")
149+
.field("field")
150+
.missing("invalid")
151+
.wrapLongitude(false);
152+
try (IndexReader reader = w.getReader()) {
153+
IndexSearcher searcher = new IndexSearcher(reader);
154+
ElasticsearchParseException exception = expectThrows(ElasticsearchParseException.class,
155+
() -> search(searcher, new MatchAllDocsQuery(), aggBuilder, fieldType));
156+
assertThat(exception.getMessage(), startsWith("unsupported symbol"));
157+
}
158+
}
159+
}
160+
64161
public void testRandom() throws Exception {
65162
double top = Double.NEGATIVE_INFINITY;
66163
double bottom = Double.POSITIVE_INFINITY;
@@ -118,4 +215,14 @@ public void testRandom() throws Exception {
118215
}
119216
}
120217
}
218+
219+
@Override
220+
protected AggregationBuilder createAggBuilderForTypeTest(MappedFieldType fieldType, String fieldName) {
221+
return new GeoBoundsAggregationBuilder("foo").field(fieldName);
222+
}
223+
224+
@Override
225+
protected List<ValuesSourceType> getSupportedValuesSourceTypes() {
226+
return List.of(CoreValuesSourceType.GEOPOINT);
227+
}
121228
}

0 commit comments

Comments
 (0)