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.Nullable; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; public class SignificantTerms extends AbstractAggregation { private List<Bucket> buckets = new ArrayList<>(); private long docCount; public SignificantTerms(String name) { super(name); } public List<Bucket> getBuckets() { return buckets; } public long getDocCount() { return docCount; } public static SignificantTerms parse(XContentParser parser, String name) { try { SignificantTerms significantTerms = new SignificantTerms(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() && "doc_count".equals(currentFieldName)) { significantTerms.docCount = parser.longValue(); } else if (token == XContentParser.Token.START_ARRAY) { if ("buckets".equals(currentFieldName)) { significantTerms.buckets = parseBuckets(parser); } } } return significantTerms; } 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) { Bucket bucket = parseBucket(parser); result.add(bucket); } } 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 ("key".equals(currentFieldName)) { bucket.key = parser.text(); } else if ("doc_count".equals(currentFieldName)) { bucket.docCount = parser.longValue(); } else if ("bg_count".equals(currentFieldName)) { bucket.bgCount = parser.longValue(); } else if ("score".equals(currentFieldName)) { bucket.score = parser.doubleValue(); } } else if (token == XContentParser.Token.START_OBJECT) { 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 { @Nullable private String key; private long docCount; private double score; private double bgCount; } }