Fixed writeable name from range to geo_distance (#20860)
* Fixed writeable name from range to geo_distance * Added testGeoDistanceAggregation * Added asserts for correct result in testGeoDistanceAggregation * Setup mapping on test index.
This commit is contained in:
parent
298cf1cf21
commit
a3908c4c40
|
@ -119,4 +119,9 @@ public class InternalGeoDistance extends InternalRange<InternalGeoDistance.Bucke
|
|||
public InternalRange.Factory<Bucket, InternalGeoDistance> getFactory() {
|
||||
return FACTORY;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWriteableName() {
|
||||
return GeoDistanceAggregationBuilder.NAME;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,26 +20,32 @@
|
|||
package org.elasticsearch.search.geo;
|
||||
|
||||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.action.search.SearchRequestBuilder;
|
||||
import org.elasticsearch.action.search.SearchResponse;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.common.geo.GeoHashUtils;
|
||||
import org.elasticsearch.common.geo.GeoPoint;
|
||||
import org.elasticsearch.common.geo.GeoUtils;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.unit.DistanceUnit;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.index.fielddata.ScriptDocValues;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.script.MockScriptPlugin;
|
||||
import org.elasticsearch.script.Script;
|
||||
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
||||
import org.elasticsearch.search.aggregations.Aggregations;
|
||||
import org.elasticsearch.search.aggregations.bucket.range.Range;
|
||||
import org.elasticsearch.search.aggregations.bucket.range.geodistance.InternalGeoDistance;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
import org.elasticsearch.test.InternalSettingsPlugin;
|
||||
import org.elasticsearch.test.VersionUtils;
|
||||
import org.junit.Before;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||
|
@ -63,7 +69,6 @@ public class GeoDistanceIT extends ESIntegTestCase {
|
|||
public static class CustomScriptPlugin extends MockScriptPlugin {
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
protected Map<String, Function<Map<String, Object>, Object>> pluginScripts() {
|
||||
Map<String, Function<Map<String, Object>, Object>> scripts = new HashMap<>();
|
||||
|
||||
|
@ -83,15 +88,14 @@ public class GeoDistanceIT extends ESIntegTestCase {
|
|||
return scripts;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static Double distanceScript(Map<String, Object> vars, Function<ScriptDocValues.GeoPoints, Double> distance) {
|
||||
Map<?, ?> doc = (Map) vars.get("doc");
|
||||
return distance.apply((ScriptDocValues.GeoPoints) doc.get("location"));
|
||||
}
|
||||
}
|
||||
|
||||
public void testDistanceScript() throws Exception {
|
||||
|
||||
@Before
|
||||
public void setupTestIndex() throws IOException {
|
||||
Version version = VersionUtils.randomVersionBetween(random(), Version.V_2_0_0, Version.CURRENT);
|
||||
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
|
||||
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject().startObject("type1")
|
||||
|
@ -102,7 +106,9 @@ public class GeoDistanceIT extends ESIntegTestCase {
|
|||
xContentBuilder.endObject().endObject().endObject().endObject();
|
||||
assertAcked(prepareCreate("test").setSettings(settings).addMapping("type1", xContentBuilder));
|
||||
ensureGreen();
|
||||
}
|
||||
|
||||
public void testDistanceScript() throws Exception {
|
||||
client().prepareIndex("test", "type1", "1")
|
||||
.setSource(jsonBuilder().startObject()
|
||||
.field("name", "TestPosition")
|
||||
|
@ -156,4 +162,41 @@ public class GeoDistanceIT extends ESIntegTestCase {
|
|||
assertThat(resultArcDistance6,
|
||||
closeTo(GeoUtils.arcDistance(src_lat, src_lon, tgt_lat, tgt_lon)/1000d, 0.01d));
|
||||
}
|
||||
|
||||
public void testGeoDistanceAggregation() throws IOException {
|
||||
client().prepareIndex("test", "type1", "1")
|
||||
.setSource(jsonBuilder().startObject()
|
||||
.field("name", "TestPosition")
|
||||
.startObject("location")
|
||||
.field("lat", src_lat)
|
||||
.field("lon", src_lon)
|
||||
.endObject()
|
||||
.endObject())
|
||||
.get();
|
||||
|
||||
refresh();
|
||||
|
||||
SearchRequestBuilder search = client().prepareSearch("test");
|
||||
String name = "TestPosition";
|
||||
|
||||
search.setQuery(QueryBuilders.matchAllQuery())
|
||||
.setTypes("type1")
|
||||
.addAggregation(AggregationBuilders.geoDistance(name, new GeoPoint(tgt_lat, tgt_lon))
|
||||
.field("location")
|
||||
.unit(DistanceUnit.MILES)
|
||||
.addRange(0, 25000));
|
||||
|
||||
search.setSize(0); // no hits please
|
||||
|
||||
SearchResponse response = search.get();
|
||||
Aggregations aggregations = response.getAggregations();
|
||||
assertNotNull(aggregations);
|
||||
InternalGeoDistance geoDistance = aggregations.get(name);
|
||||
assertNotNull(geoDistance);
|
||||
|
||||
List<? extends Range.Bucket> buckets = ((Range) geoDistance).getBuckets();
|
||||
assertNotNull("Buckets should not be null", buckets);
|
||||
assertEquals("Unexpected number of buckets", 1, buckets.size());
|
||||
assertEquals("Unexpected doc count for geo distance", 1, buckets.get(0).getDocCount());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue