# Using metric aggregation in java

**URL:** <https://discuss.elastic.co/t/using-metric-aggregation-in-java/2196>\
**Category:** Elasticsearch\
**Created:** [June 9, 2015, 9:01am UTC](https://discuss.elastic.co/t/using-metric-aggregation-in-java/2196 "2015-06-09T09:01:09Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![guillaume](https://avatars.discourse-cdn.com/v4/letter/g/c67d28/32.png) [@guillaume](https://discuss.elastic.co/u/guillaume)\
**Post date:** [June 9, 2015, 9:01am UTC](https://discuss.elastic.co/t/using-metric-aggregation-in-java/2196/1 "2015-06-09T09:01:09Z")

</div>

Hello,

I'm currently using scripted metric aggregation with groovy scripts but I would like to profile my code, that's why I would like to rewrite it but in java.

What is the correct way to do metric aggregation with custom java code instead of scripts?

Thanks

---

<div class="post-metadata">

**Author:** ![guillaume](https://avatars.discourse-cdn.com/v4/letter/g/c67d28/32.png) [@guillaume](https://discuss.elastic.co/u/guillaume)\
**Post date:** [June 10, 2015, 2:08pm UTC](https://discuss.elastic.co/t/using-metric-aggregation-in-java/2196/2 "2015-06-10T14:08:56Z")

</div>

I'm trying to create a plugin to add my custom aggregation.  
I copied ScriptedMetricAggregator and change  
`this.mapScript = scriptService.search(context.searchContext().lookup(), scriptLang, mapScript, mapScriptType, this.params);`

by

`this.mapScript = new MapScript(context.searchContext().lookup(), this.params);`

> <https://github.com/elastic/elasticsearch/blob/1.4/src/main/java/org/elasticsearch/search/aggregations/metrics/scripted/ScriptedMetricAggregator.java#L74>

```
public class MapScript implements ExecutableScript, SearchScript {

protected final static ESLogger logger = ESLoggerFactory.getLogger(MapScript.class.getName());

private Map<String, Object> params;
private SearchLookup lookup;
	
public MapScript(SearchLookup lookup, Map<String, Object> params) {
	this.lookup = lookup;
	this.params = params;
}

@Override
public void setNextVar(String name, Object value) {
}

@Override
public Object run() {
			
	return null;
}

@Override
public Object unwrap(Object value) {
	return value;
}

@Override
public void setNextReader(AtomicReaderContext reader) {
	if (lookup != null) {
		lookup.setNextReader(reader);
	}
}

@Override
public void setScorer(Scorer scorer) {
}

@Override
public void setNextDocId(int doc) {
	if (lookup != null) {
		lookup.setNextDocId(doc);
	}
}

@Override
public void setNextSource(Map<String, Object> source) {
	if (lookup != null) {
		lookup.source().setNextSource(source);
	}
}

@Override
public float runAsFloat() {
	return ((Number) run()).floatValue();
}

@Override
public long runAsLong() {
	return ((Number) run()).longValue();
}

@Override
public double runAsDouble() {
	return ((Number) run()).doubleValue();
}

```

}

But I can't access my document values, lookup.source().source() return null

Do I miss something?

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 12:08am UTC](https://discuss.elastic.co/t/using-metric-aggregation-in-java/2196/3 "2017-07-06T00:08:34Z")

</div>


