package com.github.obourgain.elasticsearch.http.response.entity.aggs; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.elasticsearch.common.xcontent.XContentParser; public abstract class AbstractPercentiles<T extends AbstractPercentiles<?>> extends AbstractAggregation { protected List<Percentile> percentiles; public AbstractPercentiles() {} public final List<Percentile> getPercentiles() { return percentiles; } public T parse(XContentParser parser, String name) { try { this.name = name; XContentParser.Token token; String currentFieldName = null; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else if (token == XContentParser.Token.START_OBJECT && "values".equals(currentFieldName)) { // keyed percentiles = parseKeyedPercentiles(parser); } else if (token == XContentParser.Token.START_ARRAY && "values".equals(currentFieldName)) { // not keyed percentiles = parsePercentiles(parser); } } return (T) this; } catch (IOException e) { throw new RuntimeException(e); } } protected static List<Percentile> parsePercentiles(XContentParser parser) throws IOException { assert parser.currentToken() == XContentParser.Token.START_ARRAY : "expected a START_ARRAY token but was " + parser.currentToken(); XContentParser.Token token; List<Percentile> result = new ArrayList<>(); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { if (token == XContentParser.Token.START_OBJECT) { result.add(parsePercentile(parser)); } } return result; } protected static Percentile parsePercentile(XContentParser parser) throws IOException { assert parser.currentToken() == XContentParser.Token.START_OBJECT : "expected a START_OBJECT token but was " + parser.currentToken(); XContentParser.Token token; String currentFieldName = null; Percentile percentile = new Percentile(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else if (token.isValue()) { if ("key".equals(currentFieldName)) { percentile.key = parser.doubleValue(); } else if ("value".equals(currentFieldName)) { percentile.value = parser.doubleValue(); } } } return percentile; } protected static List<Percentile> parseKeyedPercentiles(XContentParser parser) throws IOException { assert parser.currentToken() == XContentParser.Token.START_OBJECT : "expected a START_OBJECT token but was " + parser.currentToken(); XContentParser.Token token; List<Percentile> result = new ArrayList<>(); Percentile currentPercentile = null; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentPercentile = new Percentile(); currentPercentile.key = Double.parseDouble(parser.text()); } else if (token.isValue()) { assert currentPercentile != null; currentPercentile.value = parser.doubleValue(); result.add(currentPercentile); } } return result; } }