package io.searchbox.core.search.aggregation;
import io.searchbox.common.AbstractIntegrationTest;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
import org.elasticsearch.test.ESIntegTestCase;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author cfstout
*/
@ESIntegTestCase.ClusterScope (scope = ESIntegTestCase.Scope.TEST, numDataNodes = 1)
public class GeoBoundsAggregationIntegrationTest extends AbstractIntegrationTest {
private final String INDEX = "geo_bounds_aggregation";
private final String TYPE = "document";
@Test
public void testGeoBoundsAggregation()
throws IOException {
createIndex(INDEX);
PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX)
.type(TYPE)
.source("{\"document\":{\"properties\":{\"location\":{\"store\":true,\"type\":\"geo_point\"}}}}")
).actionGet();
assertTrue(putMappingResponse.isAcknowledged());
index(INDEX, TYPE, null, "{\"location\" : {\"lat\" : 40.12,\"lon\" : -71.34},\"tag\" : [\"food\", \"family\"]}");
index(INDEX, TYPE, null, "{\"location\" : {\"lat\" : 38.53999991901219,\"lon\" : -71.78000008687377},\"tag\" : [\"gas\", \"food\"]}");
index(INDEX, TYPE, null, "{\"location\" : {\"lat\" : 41.229999996721745,\"lon\" : -70.67000007256866},\"tag\" : [\"gas\"]}");
refresh();
ensureSearchable(INDEX);
String query = "{\n" +
" \"query\" : {\n" +
" \"match\" : { \"tag\" : \"gas\" }\n" +
" },\n" +
" \"aggs\" : {\n" +
" \"viewport\" : {\n" +
" \"geo_bounds\" : {\n" +
" \"field\" : \"location\"\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
Search search = new Search.Builder(query)
.addIndex(INDEX)
.addType(TYPE)
.build();
SearchResult result = client.execute(search);
assertTrue(result.getErrorMessage(), result.isSucceeded());
GeoBoundsAggregation geoBounds = result.getAggregations().getGeoBoundsAggregation("viewport");
assertEquals("viewport", geoBounds.getName());
assertEquals(new Double(38.53999991901219), geoBounds.getBottomRightLat());
assertEquals(new Double(-70.67000007256866), geoBounds.getBottomRightLon());
assertEquals(new Double(41.229999996721745), geoBounds.getTopLeftLat());
assertEquals(new Double(-71.78000008687377), geoBounds.getTopLeftLon());
Aggregation aggregation = result.getAggregations().getAggregation("viewport", GeoBoundsAggregation.class);
assertTrue(aggregation instanceof GeoBoundsAggregation);
GeoBoundsAggregation geoBoundsByType = (GeoBoundsAggregation) aggregation;
assertEquals(geoBounds, geoBoundsByType);
Map<String, Class> nameToTypeMap = new HashMap<String, Class>();
nameToTypeMap.put("viewport", GeoBoundsAggregation.class);
List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap);
assertEquals(1, aggregations.size());
assertTrue(aggregations.get(0) instanceof GeoBoundsAggregation);
GeoBoundsAggregation geoBoundsWithMap = (GeoBoundsAggregation) aggregations.get(0);
assertEquals(geoBounds, geoBoundsWithMap);
}
@Test
public void testBadAggregationQueryResult()
throws IOException {
createIndex(INDEX);
PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX)
.type(TYPE)
.source("{\"document\":{\"properties\":{\"location\":{\"store\":true,\"type\":\"geo_point\"}}}}")
).actionGet();
assertTrue(putMappingResponse.isAcknowledged());
index(INDEX, TYPE, null, "{\"location\" : {\"lat\" : 40.12,\"lon\" : -71.34},\"tag\" : [\"food\", \"family\"]}");
index(INDEX, TYPE, null, "{\"location\" : {\"lat\" : 38.53999991901219,\"lon\" : -71.78000008687377},\"tag\" : [\"gas\", \"food\"]}");
index(INDEX, TYPE, null, "{\"location\" : {\"lat\" : 41.229999996721745,\"lon\" : -70.67000007256866},\"tag\" : [\"gas\"]}");
refresh();
ensureSearchable(INDEX);
String query = "{\n" +
" \"query\" : {\n" +
" \"match\" : { \"tag\" : \"gas\" }\n" +
" },\n" +
" \"aggs\" : {\n" +
" \"viewport\" : {\n" +
" \"geo_bounds\" : {\n" +
" \"field\" : \"bad_field\"\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
Search search = new Search.Builder(query)
.addIndex(INDEX)
.addType(TYPE)
.build();
SearchResult result = client.execute(search);
assertTrue(result.getErrorMessage(), result.isSucceeded());
GeoBoundsAggregation geoBounds = result.getAggregations().getGeoBoundsAggregation("viewport");
assertEquals("viewport", geoBounds.getName());
assertNull(geoBounds.getBottomRightLat());
assertNull(geoBounds.getBottomRightLon());
assertNull(geoBounds.getTopLeftLat());
assertNull(geoBounds.getTopLeftLon());
Aggregation aggregation = result.getAggregations().getAggregation("viewport", GeoBoundsAggregation.class);
assertTrue(aggregation instanceof GeoBoundsAggregation);
GeoBoundsAggregation geoBoundsByType = (GeoBoundsAggregation) aggregation;
assertEquals(geoBounds, geoBoundsByType);
Map<String, Class> nameToTypeMap = new HashMap<String, Class>();
nameToTypeMap.put("viewport", GeoBoundsAggregation.class);
List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap);
assertEquals(1, aggregations.size());
assertTrue(aggregations.get(0) instanceof GeoBoundsAggregation);
GeoBoundsAggregation geoBoundsWithMap = (GeoBoundsAggregation) aggregations.get(0);
assertEquals(geoBounds, geoBoundsWithMap);
}
}