Search in sources :

Example 1 with EvictingQueue

use of org.opensearch.common.collect.EvictingQueue in project OpenSearch by opensearch-project.

the class MovAvgPipelineAggregator method reduce.

@Override
public InternalAggregation reduce(InternalAggregation aggregation, ReduceContext reduceContext) {
    InternalMultiBucketAggregation<? extends InternalMultiBucketAggregation, ? extends InternalMultiBucketAggregation.InternalBucket> histo = (InternalMultiBucketAggregation<? extends InternalMultiBucketAggregation, ? extends InternalMultiBucketAggregation.InternalBucket>) aggregation;
    List<? extends InternalMultiBucketAggregation.InternalBucket> buckets = histo.getBuckets();
    HistogramFactory factory = (HistogramFactory) histo;
    List<Bucket> newBuckets = new ArrayList<>();
    EvictingQueue<Double> values = new EvictingQueue<>(this.window);
    Number lastValidKey = 0;
    int lastValidPosition = 0;
    int counter = 0;
    // Do we need to fit the model parameters to the data?
    if (minimize) {
        assert (model.canBeMinimized());
        model = minimize(buckets, histo, model);
    }
    for (InternalMultiBucketAggregation.InternalBucket bucket : buckets) {
        Double thisBucketValue = resolveBucketValue(histo, bucket, bucketsPaths()[0], gapPolicy);
        // Default is to reuse existing bucket. Simplifies the rest of the logic,
        // since we only change newBucket if we can add to it
        Bucket newBucket = bucket;
        if ((thisBucketValue == null || thisBucketValue.equals(Double.NaN)) == false) {
            // Some models (e.g. HoltWinters) have certain preconditions that must be met
            if (model.hasValue(values.size())) {
                double movavg = model.next(values);
                List<InternalAggregation> aggs = StreamSupport.stream(bucket.getAggregations().spliterator(), false).map((p) -> (InternalAggregation) p).collect(Collectors.toList());
                aggs.add(new InternalSimpleValue(name(), movavg, formatter, metadata()));
                newBucket = factory.createBucket(factory.getKey(bucket), bucket.getDocCount(), InternalAggregations.from(aggs));
            }
            if (predict > 0) {
                lastValidKey = factory.getKey(bucket);
                lastValidPosition = counter;
            }
            values.offer(thisBucketValue);
        }
        counter += 1;
        newBuckets.add(newBucket);
    }
    if (buckets.size() > 0 && predict > 0) {
        double[] predictions = model.predict(values, predict);
        for (int i = 0; i < predictions.length; i++) {
            List<InternalAggregation> aggs;
            Number newKey = factory.nextKey(lastValidKey);
            if (lastValidPosition + i + 1 < newBuckets.size()) {
                Bucket bucket = newBuckets.get(lastValidPosition + i + 1);
                // Get the existing aggs in the bucket so we don't clobber data
                aggs = StreamSupport.stream(bucket.getAggregations().spliterator(), false).map((p) -> (InternalAggregation) p).collect(Collectors.toList());
                aggs.add(new InternalSimpleValue(name(), predictions[i], formatter, metadata()));
                Bucket newBucket = factory.createBucket(newKey, bucket.getDocCount(), InternalAggregations.from(aggs));
                // Overwrite the existing bucket with the new version
                newBuckets.set(lastValidPosition + i + 1, newBucket);
            } else {
                // Not seen before, create fresh
                aggs = new ArrayList<>();
                aggs.add(new InternalSimpleValue(name(), predictions[i], formatter, metadata()));
                Bucket newBucket = factory.createBucket(newKey, 0, InternalAggregations.from(aggs));
                // Since this is a new bucket, simply append it
                newBuckets.add(newBucket);
            }
            lastValidKey = newKey;
        }
    }
    return factory.createAggregation(newBuckets);
}
Also used : StreamInput(org.opensearch.common.io.stream.StreamInput) HistogramFactory(org.opensearch.search.aggregations.bucket.histogram.HistogramFactory) ListIterator(java.util.ListIterator) DocValueFormat(org.opensearch.search.DocValueFormat) ReduceContext(org.opensearch.search.aggregations.InternalAggregation.ReduceContext) InternalMultiBucketAggregation(org.opensearch.search.aggregations.InternalMultiBucketAggregation) EvictingQueue(org.opensearch.common.collect.EvictingQueue) StreamOutput(org.opensearch.common.io.stream.StreamOutput) IOException(java.io.IOException) MultiBucketsAggregation(org.opensearch.search.aggregations.bucket.MultiBucketsAggregation) GapPolicy(org.opensearch.search.aggregations.pipeline.BucketHelpers.GapPolicy) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) List(java.util.List) BucketHelpers.resolveBucketValue(org.opensearch.search.aggregations.pipeline.BucketHelpers.resolveBucketValue) InternalAggregations(org.opensearch.search.aggregations.InternalAggregations) Map(java.util.Map) StreamSupport(java.util.stream.StreamSupport) Bucket(org.opensearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket) InternalAggregation(org.opensearch.search.aggregations.InternalAggregation) ArrayList(java.util.ArrayList) HistogramFactory(org.opensearch.search.aggregations.bucket.histogram.HistogramFactory) InternalAggregation(org.opensearch.search.aggregations.InternalAggregation) Bucket(org.opensearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket) EvictingQueue(org.opensearch.common.collect.EvictingQueue) InternalMultiBucketAggregation(org.opensearch.search.aggregations.InternalMultiBucketAggregation)

Example 2 with EvictingQueue

use of org.opensearch.common.collect.EvictingQueue in project OpenSearch by opensearch-project.

the class SerialDiffPipelineAggregator method reduce.

@Override
public InternalAggregation reduce(InternalAggregation aggregation, ReduceContext reduceContext) {
    InternalMultiBucketAggregation<? extends InternalMultiBucketAggregation, ? extends InternalMultiBucketAggregation.InternalBucket> histo = (InternalMultiBucketAggregation<? extends InternalMultiBucketAggregation, ? extends InternalMultiBucketAggregation.InternalBucket>) aggregation;
    List<? extends InternalMultiBucketAggregation.InternalBucket> buckets = histo.getBuckets();
    HistogramFactory factory = (HistogramFactory) histo;
    List<Bucket> newBuckets = new ArrayList<>();
    EvictingQueue<Double> lagWindow = new EvictingQueue<>(lag);
    int counter = 0;
    for (InternalMultiBucketAggregation.InternalBucket bucket : buckets) {
        Double thisBucketValue = resolveBucketValue(histo, bucket, bucketsPaths()[0], gapPolicy);
        Bucket newBucket = bucket;
        counter += 1;
        // Still under the initial lag period, add nothing and move on
        Double lagValue;
        if (counter <= lag) {
            lagValue = Double.NaN;
        } else {
            // Peek here, because we rely on add'ing to always move the window
            lagValue = lagWindow.peek();
        }
        // Normalize null's to NaN
        if (thisBucketValue == null) {
            thisBucketValue = Double.NaN;
        }
        // Both have values, calculate diff and replace the "empty" bucket
        if (!Double.isNaN(thisBucketValue) && !Double.isNaN(lagValue)) {
            double diff = thisBucketValue - lagValue;
            List<InternalAggregation> aggs = StreamSupport.stream(bucket.getAggregations().spliterator(), false).map((p) -> (InternalAggregation) p).collect(Collectors.toList());
            aggs.add(new InternalSimpleValue(name(), diff, formatter, metadata()));
            newBucket = factory.createBucket(factory.getKey(bucket), bucket.getDocCount(), InternalAggregations.from(aggs));
        }
        newBuckets.add(newBucket);
        lagWindow.add(thisBucketValue);
    }
    return factory.createAggregation(newBuckets);
}
Also used : StreamInput(org.opensearch.common.io.stream.StreamInput) HistogramFactory(org.opensearch.search.aggregations.bucket.histogram.HistogramFactory) DocValueFormat(org.opensearch.search.DocValueFormat) ReduceContext(org.opensearch.search.aggregations.InternalAggregation.ReduceContext) InternalMultiBucketAggregation(org.opensearch.search.aggregations.InternalMultiBucketAggregation) EvictingQueue(org.opensearch.common.collect.EvictingQueue) StreamOutput(org.opensearch.common.io.stream.StreamOutput) IOException(java.io.IOException) GapPolicy(org.opensearch.search.aggregations.pipeline.BucketHelpers.GapPolicy) Collectors(java.util.stream.Collectors) Nullable(org.opensearch.common.Nullable) ArrayList(java.util.ArrayList) List(java.util.List) BucketHelpers.resolveBucketValue(org.opensearch.search.aggregations.pipeline.BucketHelpers.resolveBucketValue) InternalAggregations(org.opensearch.search.aggregations.InternalAggregations) Map(java.util.Map) StreamSupport(java.util.stream.StreamSupport) Bucket(org.opensearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket) InternalAggregation(org.opensearch.search.aggregations.InternalAggregation) ArrayList(java.util.ArrayList) HistogramFactory(org.opensearch.search.aggregations.bucket.histogram.HistogramFactory) InternalAggregation(org.opensearch.search.aggregations.InternalAggregation) Bucket(org.opensearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket) EvictingQueue(org.opensearch.common.collect.EvictingQueue) InternalMultiBucketAggregation(org.opensearch.search.aggregations.InternalMultiBucketAggregation)

Aggregations

IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 Map (java.util.Map)2 Collectors (java.util.stream.Collectors)2 StreamSupport (java.util.stream.StreamSupport)2 EvictingQueue (org.opensearch.common.collect.EvictingQueue)2 StreamInput (org.opensearch.common.io.stream.StreamInput)2 StreamOutput (org.opensearch.common.io.stream.StreamOutput)2 DocValueFormat (org.opensearch.search.DocValueFormat)2 InternalAggregation (org.opensearch.search.aggregations.InternalAggregation)2 ReduceContext (org.opensearch.search.aggregations.InternalAggregation.ReduceContext)2 InternalAggregations (org.opensearch.search.aggregations.InternalAggregations)2 InternalMultiBucketAggregation (org.opensearch.search.aggregations.InternalMultiBucketAggregation)2 Bucket (org.opensearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket)2 HistogramFactory (org.opensearch.search.aggregations.bucket.histogram.HistogramFactory)2 GapPolicy (org.opensearch.search.aggregations.pipeline.BucketHelpers.GapPolicy)2 BucketHelpers.resolveBucketValue (org.opensearch.search.aggregations.pipeline.BucketHelpers.resolveBucketValue)2 ListIterator (java.util.ListIterator)1 Nullable (org.opensearch.common.Nullable)1