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 Ipv4RangeAggregationIntegrationTest extends AbstractIntegrationTest {
private final String INDEX = "ipv4_range_aggregation";
private final String TYPE = "document";
@Test
public void testGetIpv4RangRangeAggregation()
throws IOException {
createIndex(INDEX);
PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX)
.type(TYPE)
.source("{\"document\":{\"properties\":{\"address\":{\"store\":true,\"type\":\"ip\"}}}}")
).actionGet();
assertTrue(putMappingResponse.isAcknowledged());
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.23\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.1\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.1.0\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.123\"}");
refresh();
ensureSearchable(INDEX);
String query = "{\n" +
" \"query\" : {\n" +
" \"match_all\" : {}\n" +
" },\n" +
" \"aggs\" : {\n" +
" \"ipv4_range1\" : {\n" +
" \"ip_range\" : {\n" +
" \"field\" : \"address\",\n" +
" \"ranges\" : [\n" +
" { \"to\": \"10.0.0.25\"},\n" +
" { \"from\": \"10.0.0.25\"}\n" +
" ]\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());
Ipv4RangeAggregation ipv4Range = result.getAggregations().getIpv4RangeAggregation("ipv4_range1");
assertEquals("ipv4_range1", ipv4Range.getName());
assertEquals(2, ipv4Range.getBuckets().size());
assertTrue(2L == ipv4Range.getBuckets().get(0).getCount());
assertNull(ipv4Range.getBuckets().get(0).getFrom());
assertEquals("10.0.0.25", ipv4Range.getBuckets().get(0).getTo());
assertTrue(2L == ipv4Range.getBuckets().get(1).getCount());
assertNull(ipv4Range.getBuckets().get(1).getTo());
assertEquals("10.0.0.25", ipv4Range.getBuckets().get(1).getFrom());
Aggregation aggregation = result.getAggregations().getAggregation("ipv4_range1", Ipv4RangeAggregation.class);
assertTrue(aggregation instanceof Ipv4RangeAggregation);
Ipv4RangeAggregation ipv4RangeByType = (Ipv4RangeAggregation) aggregation;
assertEquals(ipv4Range, ipv4RangeByType);
Map<String, Class> nameToTypeMap = new HashMap<String, Class>();
nameToTypeMap.put("ipv4_range1", Ipv4RangeAggregation.class);
List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap);
assertEquals(1, aggregations.size());
assertTrue(aggregations.get(0) instanceof Ipv4RangeAggregation);
Ipv4RangeAggregation ipv4RangeWithMap = (Ipv4RangeAggregation) aggregations.get(0);
assertEquals(ipv4Range, ipv4RangeWithMap);
}
@Test
public void testGetIpv4RangRangeWithCIDRMaskAggregation() throws IOException {
createIndex(INDEX);
PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX)
.type(TYPE)
.source("{\"document\":{\"properties\":{\"address\":{\"store\":true,\"type\":\"ip\"}}}}")
).actionGet();
assertTrue(putMappingResponse.isAcknowledged());
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.23\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.1\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.1.0\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.123\"}");
refresh();
ensureSearchable(INDEX);
String query = "{\n" +
" \"query\" : {\n" +
" \"match_all\" : {}\n" +
" },\n" +
" \"aggs\" : {\n" +
" \"ipv4_range1\" : {\n" +
" \"ip_range\" : {\n" +
" \"field\" : \"address\",\n" +
" \"ranges\" : [\n" +
" { \"mask\": \"10.0.0.0/24\"}\n" +
" ]\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());
Ipv4RangeAggregation ipv4Range = result.getAggregations().getIpv4RangeAggregation("ipv4_range1");
assertEquals("ipv4_range1", ipv4Range.getName());
assertEquals(1, ipv4Range.getBuckets().size());
assertTrue(3L == ipv4Range.getBuckets().get(0).getCount());
assertEquals("10.0.0.0", ipv4Range.getBuckets().get(0).getFrom());
assertEquals("10.0.1.0", ipv4Range.getBuckets().get(0).getTo());
assertEquals("10.0.0.0/24", ipv4Range.getBuckets().get(0).getKey());
Aggregation aggregation = result.getAggregations().getAggregation("ipv4_range1", Ipv4RangeAggregation.class);
assertTrue(aggregation instanceof Ipv4RangeAggregation);
Ipv4RangeAggregation ipv4RangeByType = (Ipv4RangeAggregation) aggregation;
assertEquals(ipv4Range, ipv4RangeByType);
Map<String, Class> nameToTypeMap = new HashMap<String, Class>();
nameToTypeMap.put("ipv4_range1", Ipv4RangeAggregation.class);
List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap);
assertEquals(1, aggregations.size());
assertTrue(aggregations.get(0) instanceof Ipv4RangeAggregation);
Ipv4RangeAggregation ipv4RangeWithMap = (Ipv4RangeAggregation) aggregations.get(0);
assertEquals(ipv4Range, ipv4RangeWithMap);
}
@Test
public void testBadAggregationQueryResult()
throws IOException {
createIndex(INDEX);
PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX)
.type(TYPE)
.source("{\"document\":{\"properties\":{\"address\":{\"store\":true,\"type\":\"ip\"}}}}")
).actionGet();
assertTrue(putMappingResponse.isAcknowledged());
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.23\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.1\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.1.0\"}");
index(INDEX, TYPE, null, "{\"address\":\"10.0.0.123\"}");
refresh();
ensureSearchable(INDEX);
String query = "{\n" +
" \"query\" : {\n" +
" \"match_all\" : {}\n" +
" },\n" +
" \"aggs\" : {\n" +
" \"ipv4_range1\" : {\n" +
" \"ip_range\" : {\n" +
" \"field\" : \"bad_field\",\n" +
" \"ranges\" : [\n" +
" { \"to\": \"10.0.0.25\"},\n" +
" { \"from\": \"10.0.0.25\"}\n" +
" ]\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());
Ipv4RangeAggregation ipv4Range = result.getAggregations().getIpv4RangeAggregation("ipv4_range1");
assertEquals("ipv4_range1", ipv4Range.getName());
assertEquals(2, ipv4Range.getBuckets().size());
assertTrue(0L == ipv4Range.getBuckets().get(0).getCount());
assertNull(ipv4Range.getBuckets().get(0).getFrom());
assertEquals("10.0.0.25", ipv4Range.getBuckets().get(0).getTo());
assertTrue(0L == ipv4Range.getBuckets().get(1).getCount());
assertNull(ipv4Range.getBuckets().get(1).getTo());
assertEquals("10.0.0.25", ipv4Range.getBuckets().get(1).getFrom());
Aggregation aggregation = result.getAggregations().getAggregation("ipv4_range1", Ipv4RangeAggregation.class);
assertTrue(aggregation instanceof Ipv4RangeAggregation);
Ipv4RangeAggregation ipv4RangeByType = (Ipv4RangeAggregation) aggregation;
assertEquals(ipv4Range, ipv4RangeByType);
Map<String, Class> nameToTypeMap = new HashMap<String, Class>();
nameToTypeMap.put("ipv4_range1", Ipv4RangeAggregation.class);
List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap);
assertEquals(1, aggregations.size());
assertTrue(aggregations.get(0) instanceof Ipv4RangeAggregation);
Ipv4RangeAggregation ipv4RangeWithMap = (Ipv4RangeAggregation) aggregations.get(0);
assertEquals(ipv4Range, ipv4RangeWithMap);
}
}