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 ScriptedMetricAggregationIntegrationTest extends AbstractIntegrationTest { private final String INDEX = "scripted_metric_aggregation"; private final String TYPE = "document"; @Test public void testGetScriptedMetricAggregation() throws IOException { createIndex(INDEX); PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX) .type(TYPE) .source("{\"document\":{\"properties\":{\"amount\":{\"store\":true,\"type\":\"integer\"}}}}") ).actionGet(); assertTrue(putMappingResponse.isAcknowledged()); index(INDEX, TYPE, null, "{\"amount\":2}"); index(INDEX, TYPE, null, "{\"amount\":3}"); index(INDEX, TYPE, null, "{\"amount\":-1}"); refresh(); ensureSearchable(INDEX); String query = "{\n" + " \"query\" : {\n" + " \"match_all\" : {}\n" + " },\n" + " \"aggs\" : {\n" + " \"profit\" : {\n" + " \"scripted_metric\" : {\n" + " \"init_script\" : \"params._agg.transactions = []\",\n" + " \"map_script\" : \"params._agg.transactions.add(doc.amount.value)\",\n" + " \"combine_script\" : \"double profit = 0; for (t in params._agg.transactions) { profit += t } return profit\",\n" + " \"reduce_script\" : \"double profit = 0; for (a in params._aggs) { profit += a } return profit\"\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()); ScriptedMetricAggregation scriptedMetric = result.getAggregations().getScriptedMetricAggregation("profit"); assertEquals("profit", scriptedMetric.getName()); assertEquals(new Double(4) , scriptedMetric.getScriptedMetric()); Aggregation aggregation = result.getAggregations().getAggregation("profit", ScriptedMetricAggregation.class); assertTrue(aggregation instanceof ScriptedMetricAggregation); ScriptedMetricAggregation scriptedMetricByType = (ScriptedMetricAggregation) aggregation; assertEquals(scriptedMetric, scriptedMetricByType); Map<String, Class> nameToTypeMap = new HashMap<String, Class>(); nameToTypeMap.put("profit", ScriptedMetricAggregation.class); List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap); assertEquals(1, aggregations.size()); assertTrue(aggregations.get(0) instanceof ScriptedMetricAggregation); ScriptedMetricAggregation scriptedMetricWithMap = (ScriptedMetricAggregation) aggregations.get(0); assertEquals(scriptedMetric, scriptedMetricWithMap); } @Test public void testBadAggregationQueryResult() throws Exception { createIndex(INDEX); PutMappingResponse putMappingResponse = client().admin().indices().putMapping(new PutMappingRequest(INDEX) .type(TYPE) .source("{\"document\":{\"properties\":{\"amount\":{\"store\":true,\"type\":\"integer\"},"+ "\"bad_field\":{\"store\":true,\"type\":\"integer\"}}}}") ).actionGet(); assertTrue(putMappingResponse.isAcknowledged()); assertConcreteMappingsOnAll(INDEX, TYPE, "amount", "bad_field"); index(INDEX, TYPE, null, "{\"amount\":2}"); index(INDEX, TYPE, null, "{\"amount\":3}"); index(INDEX, TYPE, null, "{\"amount\":-1}"); refresh(); ensureSearchable(INDEX); String query = "{\n" + " \"query\" : {\n" + " \"match_all\" : {}\n" + " },\n" + " \"aggs\" : {\n" + " \"profit\" : {\n" + " \"scripted_metric\" : {\n" + " \"init_script\" : \"params._agg.transactions = []\",\n" + " \"map_script\" : \"params._agg.transactions.add(doc.bad_field.value)\",\n" + " \"combine_script\" : \"double profit = 0; for (t in params._agg.transactions) { profit += t } return profit\",\n" + " \"reduce_script\" : \"double profit = 0; for (a in params._aggs) { profit += a } return profit\"\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()); ScriptedMetricAggregation scriptedMetric = result.getAggregations().getScriptedMetricAggregation("profit"); assertEquals(new Double(0), scriptedMetric.getScriptedMetric()); Aggregation aggregation = result.getAggregations().getAggregation("profit", ScriptedMetricAggregation.class); assertTrue(aggregation instanceof ScriptedMetricAggregation); ScriptedMetricAggregation scriptedMetricByType = (ScriptedMetricAggregation) aggregation; assertEquals(scriptedMetric, scriptedMetricByType); Map<String, Class> nameToTypeMap = new HashMap<String, Class>(); nameToTypeMap.put("profit", ScriptedMetricAggregation.class); List<Aggregation> aggregations = result.getAggregations().getAggregations(nameToTypeMap); assertEquals(1, aggregations.size()); assertTrue(aggregations.get(0) instanceof ScriptedMetricAggregation); ScriptedMetricAggregation scriptedMetricWithMap = (ScriptedMetricAggregation) aggregations.get(0); assertEquals(scriptedMetric, scriptedMetricWithMap); } }