package com.github.obourgain.elasticsearch.http.response.entity.aggs;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
public class Terms extends AbstractAggregation {
private long sumOtherDocCount = -1;
private long docCountErrorUpperBound = -1;
private List<Bucket> buckets;
public Terms(String name) {
super(name);
}
public static Terms parse(XContentParser parser, String name) {
try {
Terms terms = new Terms(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.isValue()) {
if ("doc_count_error_upper_bound".equals(currentFieldName)) {
terms.docCountErrorUpperBound = parser.longValue();
} else if ("sum_other_doc_count".equals(currentFieldName)) {
terms.sumOtherDocCount = parser.longValue();
}
} else if (token == XContentParser.Token.START_ARRAY) {
if ("buckets".equals(currentFieldName)) {
terms.buckets = parseBuckets(parser);
}
}
}
return terms;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
protected static List<Bucket> parseBuckets(XContentParser parser) throws IOException {
XContentParser.Token token;
List<Bucket> result = new ArrayList<>();
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
if (token == XContentParser.Token.START_OBJECT) {
result.add(parseBucket(parser));
}
}
return result;
}
protected static Bucket parseBucket(XContentParser parser) throws IOException {
XContentParser.Token token;
String currentFieldName = null;
Bucket bucket = new Bucket();
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else if (token.isValue()) {
if ("doc_count_error_upper_bound".equals(currentFieldName)) {
bucket.docCountErrorUpperBound = parser.longValue();
} else if ("key".equals(currentFieldName)) {
bucket.key = parser.text();
} else if ("key_as_string".equals(currentFieldName)) {
// ignore for now
} else if ("doc_count".equals(currentFieldName)) {
bucket.docCount = parser.longValue();
}
} else if (token == XContentParser.Token.START_OBJECT && currentFieldName != null) { // parse as sub agg only if not at first level
Pair<String, XContentBuilder> agg = Aggregations.parseInnerAgg(parser, currentFieldName);
bucket.addSubAgg(agg.getKey(), agg.getValue());
}
}
return bucket;
}
@Getter
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public static class Bucket extends AbstractBucket {
private long docCountErrorUpperBound;
private String key;
// private String keyAsString;
private long docCount;
}
}