org.elasticsearch.search.aggregations.metrics.MedianAbsoluteDeviationAggregator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elasticsearch Show documentation
Show all versions of elasticsearch Show documentation
Elasticsearch - Open Source, Distributed, RESTful Search Engine
/*
* 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.metrics;
import org.apache.lucene.search.ScoreMode;
import org.elasticsearch.common.util.ObjectArray;
import org.elasticsearch.core.Releasables;
import org.elasticsearch.index.fielddata.SortedNumericDoubleValues;
import org.elasticsearch.search.DocValueFormat;
import org.elasticsearch.search.aggregations.AggregationExecutionContext;
import org.elasticsearch.search.aggregations.Aggregator;
import org.elasticsearch.search.aggregations.InternalAggregation;
import org.elasticsearch.search.aggregations.LeafBucketCollector;
import org.elasticsearch.search.aggregations.LeafBucketCollectorBase;
import org.elasticsearch.search.aggregations.support.AggregationContext;
import org.elasticsearch.search.aggregations.support.ValuesSource;
import org.elasticsearch.search.aggregations.support.ValuesSourceConfig;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import static org.elasticsearch.search.aggregations.metrics.InternalMedianAbsoluteDeviation.computeMedianAbsoluteDeviation;
public class MedianAbsoluteDeviationAggregator extends NumericMetricsAggregator.SingleValue {
private final ValuesSource.Numeric valuesSource;
private final DocValueFormat format;
private final double compression;
private final TDigestExecutionHint executionHint;
private ObjectArray valueSketches;
MedianAbsoluteDeviationAggregator(
String name,
ValuesSourceConfig config,
DocValueFormat format,
AggregationContext context,
Aggregator parent,
Map metadata,
double compression,
TDigestExecutionHint executionHint
) throws IOException {
super(name, context, parent, metadata);
assert config.hasValues();
this.valuesSource = (ValuesSource.Numeric) config.getValuesSource();
this.format = Objects.requireNonNull(format);
this.compression = compression;
this.executionHint = executionHint;
this.valueSketches = context.bigArrays().newObjectArray(1);
}
private boolean hasDataForBucket(long bucketOrd) {
return bucketOrd < valueSketches.size() && valueSketches.get(bucketOrd) != null;
}
@Override
public double metric(long owningBucketOrd) {
if (hasDataForBucket(owningBucketOrd)) {
return computeMedianAbsoluteDeviation(valueSketches.get(owningBucketOrd));
} else {
return Double.NaN;
}
}
@Override
public ScoreMode scoreMode() {
if (valuesSource.needsScores()) {
return ScoreMode.COMPLETE;
} else {
return ScoreMode.COMPLETE_NO_SCORES;
}
}
@Override
protected LeafBucketCollector getLeafCollector(AggregationExecutionContext aggCtx, LeafBucketCollector sub) throws IOException {
final SortedNumericDoubleValues values = valuesSource.doubleValues(aggCtx.getLeafReaderContext());
return new LeafBucketCollectorBase(sub, values) {
@Override
public void collect(int doc, long bucket) throws IOException {
valueSketches = bigArrays().grow(valueSketches, bucket + 1);
TDigestState valueSketch = valueSketches.get(bucket);
if (valueSketch == null) {
valueSketch = TDigestState.create(compression, executionHint);
valueSketches.set(bucket, valueSketch);
}
if (values.advanceExact(doc)) {
final int valueCount = values.docValueCount();
for (int i = 0; i < valueCount; i++) {
final double value = values.nextValue();
valueSketch.add(value);
}
}
}
};
}
@Override
public InternalAggregation buildAggregation(long bucket) throws IOException {
if (hasDataForBucket(bucket)) {
final TDigestState valueSketch = valueSketches.get(bucket);
return new InternalMedianAbsoluteDeviation(name, metadata(), format, valueSketch);
} else {
return buildEmptyAggregation();
}
}
@Override
public InternalAggregation buildEmptyAggregation() {
return InternalMedianAbsoluteDeviation.empty(name, metadata(), format, compression, executionHint);
}
@Override
public void doClose() {
Releasables.close(valueSketches);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy