package io.searchbox.core.search.aggregation;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static io.searchbox.core.search.aggregation.AggregationField.BUCKETS;
/**
* @author cfstout
*/
public class FiltersAggregation extends BucketAggregation {
private final static Logger log = LoggerFactory.getLogger(FiltersAggregation.class);
public static final String TYPE = "filters";
private String name;
private Map<String, Bucket> bucketMap = new HashMap<String, Bucket>();
private List<Bucket> bucketList = new LinkedList<Bucket>();
public FiltersAggregation(String name, JsonObject filtersAggregation) {
super(name, filtersAggregation);
if (filtersAggregation.has(String.valueOf(BUCKETS))) {
parseBuckets(filtersAggregation.get(String.valueOf(BUCKETS)));
}
}
private void parseBuckets(JsonElement buckets) {
if (buckets.isJsonArray()) {
int elementNumber = 0;
for (JsonElement bucket : buckets.getAsJsonArray()) {
addBucket("filter" + Integer.toString(elementNumber++), bucket.getAsJsonObject());
}
} else if (buckets.isJsonObject()) {
for (Map.Entry<String, JsonElement> bucket : buckets.getAsJsonObject().entrySet()) {
addBucket(bucket.getKey(), bucket.getValue().getAsJsonObject());
}
} else {
log.debug("Skipped bucket parsing because Buckets element of JSON was neither Object nor Array.");
}
}
private void addBucket(String filterName, JsonObject bucketSource) {
FilterAggregation bucket = new FilterAggregation(filterName, bucketSource);
bucketMap.put(filterName, bucket);
bucketList.add(bucket);
}
/**
* Method for getting counts when filters when using anonymous filtering
* @return A list of counts in the order that the filters were passed in
*/
public List<Bucket> getBuckets() {
return bucketList;
}
/**
* Method for getting counts using named filters
* @return A map filter names to associated counts
*/
public Map<String, Bucket> getBucketMap() {
return bucketMap;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
FiltersAggregation rhs = (FiltersAggregation) obj;
return super.equals(obj) && Objects.equals(bucketMap, rhs.bucketMap);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), bucketMap);
}
}