Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.elasticsearch.search.aggregations.bucket.filter.InternalFilters Maven / Gradle / Ivy
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.search.aggregations.bucket.filter;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.util.Maps;
import org.elasticsearch.search.aggregations.AggregationReduceContext;
import org.elasticsearch.search.aggregations.InternalAggregation;
import org.elasticsearch.search.aggregations.InternalAggregations;
import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation;
import org.elasticsearch.search.aggregations.support.SamplingContext;
import org.elasticsearch.xcontent.XContentBuilder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class InternalFilters extends InternalMultiBucketAggregation implements Filters {
public static class InternalBucket extends InternalMultiBucketAggregation.InternalBucket implements Filters.Bucket {
private final boolean keyed;
private final String key;
private long docCount;
InternalAggregations aggregations;
public InternalBucket(String key, long docCount, InternalAggregations aggregations, boolean keyed) {
this.key = key;
this.docCount = docCount;
this.aggregations = aggregations;
this.keyed = keyed;
}
/**
* Read from a stream.
*/
public InternalBucket(StreamInput in, boolean keyed) throws IOException {
this.keyed = keyed;
key = in.readOptionalString();
docCount = in.readVLong();
aggregations = InternalAggregations.readFrom(in);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeOptionalString(key);
out.writeVLong(docCount);
aggregations.writeTo(out);
}
@Override
public String getKey() {
return key;
}
@Override
public String getKeyAsString() {
return key;
}
@Override
public long getDocCount() {
return docCount;
}
@Override
public InternalAggregations getAggregations() {
return aggregations;
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
if (keyed) {
builder.startObject(key);
} else {
builder.startObject();
}
builder.field(CommonFields.DOC_COUNT.getPreferredName(), docCount);
aggregations.toXContentInternal(builder, params);
builder.endObject();
return builder;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (other == null || getClass() != other.getClass()) {
return false;
}
InternalBucket that = (InternalBucket) other;
return Objects.equals(key, that.key)
&& Objects.equals(keyed, that.keyed)
&& Objects.equals(docCount, that.docCount)
&& Objects.equals(aggregations, that.aggregations);
}
@Override
public int hashCode() {
return Objects.hash(getClass(), key, keyed, docCount, aggregations);
}
InternalBucket finalizeSampling(SamplingContext samplingContext) {
return new InternalBucket(
key,
samplingContext.scaleUp(docCount),
InternalAggregations.finalizeSampling(aggregations, samplingContext),
keyed
);
}
}
private final List buckets;
private final boolean keyed;
// bucketMap gets lazily initialized from buckets in getBucketByKey()
private transient Map bucketMap;
public InternalFilters(String name, List buckets, boolean keyed, Map metadata) {
super(name, metadata);
this.buckets = buckets;
this.keyed = keyed;
}
/**
* Read from a stream.
*/
public InternalFilters(StreamInput in) throws IOException {
super(in);
keyed = in.readBoolean();
int size = in.readVInt();
List buckets = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
buckets.add(new InternalBucket(in, keyed));
}
this.buckets = buckets;
this.bucketMap = null;
}
@Override
protected void doWriteTo(StreamOutput out) throws IOException {
out.writeBoolean(keyed);
out.writeList(buckets);
}
@Override
public String getWriteableName() {
return FiltersAggregationBuilder.NAME;
}
@Override
public InternalFilters create(List buckets) {
return new InternalFilters(name, buckets, keyed, metadata);
}
@Override
public InternalBucket createBucket(InternalAggregations aggregations, InternalBucket prototype) {
return new InternalBucket(prototype.key, prototype.docCount, aggregations, prototype.keyed);
}
@Override
public List getBuckets() {
return buckets;
}
@Override
public InternalBucket getBucketByKey(String key) {
if (bucketMap == null) {
bucketMap = Maps.newMapWithExpectedSize(buckets.size());
for (InternalBucket bucket : buckets) {
bucketMap.put(bucket.getKey(), bucket);
}
}
return bucketMap.get(key);
}
@Override
public InternalAggregation reduce(List aggregations, AggregationReduceContext reduceContext) {
List> bucketsList = null;
for (InternalAggregation aggregation : aggregations) {
InternalFilters filters = (InternalFilters) aggregation;
if (bucketsList == null) {
bucketsList = new ArrayList<>(filters.buckets.size());
for (InternalBucket bucket : filters.buckets) {
List sameRangeList = new ArrayList<>(aggregations.size());
sameRangeList.add(bucket);
bucketsList.add(sameRangeList);
}
} else {
int i = 0;
for (InternalBucket bucket : filters.buckets) {
bucketsList.get(i++).add(bucket);
}
}
}
reduceContext.consumeBucketsAndMaybeBreak(bucketsList.size());
InternalFilters reduced = new InternalFilters(name, new ArrayList<>(bucketsList.size()), keyed, getMetadata());
for (List sameRangeList : bucketsList) {
reduced.buckets.add(reduceBucket(sameRangeList, reduceContext));
}
return reduced;
}
@Override
public InternalAggregation finalizeSampling(SamplingContext samplingContext) {
return new InternalFilters(name, buckets.stream().map(b -> b.finalizeSampling(samplingContext)).toList(), keyed, getMetadata());
}
@Override
protected InternalBucket reduceBucket(List buckets, AggregationReduceContext context) {
assert buckets.size() > 0;
InternalBucket reduced = null;
List aggregationsList = new ArrayList<>(buckets.size());
for (InternalBucket bucket : buckets) {
if (reduced == null) {
reduced = new InternalBucket(bucket.key, bucket.docCount, bucket.aggregations, bucket.keyed);
} else {
reduced.docCount += bucket.docCount;
}
aggregationsList.add(bucket.aggregations);
}
reduced.aggregations = InternalAggregations.reduce(aggregationsList, context);
return reduced;
}
@Override
public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException {
if (keyed) {
builder.startObject(CommonFields.BUCKETS.getPreferredName());
} else {
builder.startArray(CommonFields.BUCKETS.getPreferredName());
}
for (InternalBucket bucket : buckets) {
bucket.toXContent(builder, params);
}
if (keyed) {
builder.endObject();
} else {
builder.endArray();
}
return builder;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), buckets, keyed);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
if (super.equals(obj) == false) return false;
InternalFilters that = (InternalFilters) obj;
return Objects.equals(buckets, that.buckets) && Objects.equals(keyed, that.keyed);
}
}