2121
2222import org .apache .lucene .document .Document ;
2323import org .apache .lucene .document .LatLonDocValuesField ;
24+ import org .apache .lucene .document .NumericDocValuesField ;
2425import org .apache .lucene .index .IndexReader ;
2526import org .apache .lucene .index .RandomIndexWriter ;
2627import org .apache .lucene .search .IndexSearcher ;
2728import org .apache .lucene .search .MatchAllDocsQuery ;
2829import org .apache .lucene .store .Directory ;
30+ import org .elasticsearch .ElasticsearchParseException ;
2931import org .elasticsearch .common .geo .GeoPoint ;
32+ import org .elasticsearch .geo .GeometryTestUtils ;
33+ import org .elasticsearch .geometry .Point ;
3034import org .elasticsearch .index .mapper .GeoPointFieldMapper ;
3135import org .elasticsearch .index .mapper .MappedFieldType ;
36+ import org .elasticsearch .search .aggregations .AggregationBuilder ;
3237import org .elasticsearch .search .aggregations .AggregatorTestCase ;
3338import org .elasticsearch .search .aggregations .support .AggregationInspectionHelper ;
39+ import org .elasticsearch .search .aggregations .support .CoreValuesSourceType ;
40+ import org .elasticsearch .search .aggregations .support .ValuesSourceType ;
3441import org .elasticsearch .test .geo .RandomGeoGenerator ;
3542
43+ import java .util .List ;
44+
3645import static org .elasticsearch .search .aggregations .metrics .InternalGeoBoundsTests .GEOHASH_TOLERANCE ;
3746import static org .hamcrest .Matchers .closeTo ;
47+ import static org .hamcrest .Matchers .equalTo ;
48+ import static org .hamcrest .Matchers .startsWith ;
3849
3950public 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