|  | @@ -211,6 +211,7 @@ import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.max.MaxBucke
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.max.MaxBucketPipelineAggregator;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.min.MinBucketPipelineAggregationBuilder;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.min.MinBucketPipelineAggregator;
 | 
	
		
			
				|  |  | +import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.percentile.InternalPercentilesBucket;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.percentile.PercentilesBucketPipelineAggregationBuilder;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.percentile.PercentilesBucketPipelineAggregator;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.aggregations.pipeline.bucketmetrics.stats.InternalStatsBucket;
 | 
	
	
		
			
				|  | @@ -437,18 +438,16 @@ public class SearchModule extends AbstractModule {
 | 
	
		
			
				|  |  |              pipelineAggregationParserRegistry.register(spec.parser, spec.name);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          namedWriteableRegistry.register(PipelineAggregationBuilder.class, spec.name.getPreferredName(), spec.builderReader);
 | 
	
		
			
				|  |  | -        for (Map.Entry<String, Writeable.Reader<? extends PipelineAggregator>> resultReader : spec.resultReaders.entrySet()) {
 | 
	
		
			
				|  |  | -            namedWriteableRegistry.register(PipelineAggregator.class, resultReader.getKey(), resultReader.getValue());
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        for (Map.Entry<String, Writeable.Reader<? extends InternalAggregation>> bucketReaders : spec.bucketReaders.entrySet()) {
 | 
	
		
			
				|  |  | -            namedWriteableRegistry.register(InternalAggregation.class, bucketReaders.getKey(), bucketReaders.getValue());
 | 
	
		
			
				|  |  | +        namedWriteableRegistry.register(PipelineAggregator.class, spec.name.getPreferredName(), spec.aggregatorReader);
 | 
	
		
			
				|  |  | +        for (Map.Entry<String, Writeable.Reader<? extends InternalAggregation>> resultReader : spec.resultReaders.entrySet()) {
 | 
	
		
			
				|  |  | +            namedWriteableRegistry.register(InternalAggregation.class, resultReader.getKey(), resultReader.getValue());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public static class PipelineAggregationSpec {
 | 
	
		
			
				|  |  | -        private final Map<String, Writeable.Reader<? extends PipelineAggregator>> resultReaders = new TreeMap<>();
 | 
	
		
			
				|  |  | -        private final Map<String, Writeable.Reader<? extends InternalAggregation>> bucketReaders = new TreeMap<>();
 | 
	
		
			
				|  |  | +        private final Map<String, Writeable.Reader<? extends InternalAggregation>> resultReaders = new TreeMap<>();
 | 
	
		
			
				|  |  |          private final Writeable.Reader<? extends PipelineAggregationBuilder> builderReader;
 | 
	
		
			
				|  |  | +        private final Writeable.Reader<? extends PipelineAggregator> aggregatorReader;
 | 
	
		
			
				|  |  |          private final PipelineAggregator.Parser parser;
 | 
	
		
			
				|  |  |          private final ParseField name;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -456,13 +455,16 @@ public class SearchModule extends AbstractModule {
 | 
	
		
			
				|  |  |           * Register a pipeline aggregation.
 | 
	
		
			
				|  |  |           *
 | 
	
		
			
				|  |  |           * @param builderReader reads the {@link PipelineAggregationBuilder} from a stream
 | 
	
		
			
				|  |  | +         * @param aggregatorReader reads the {@link PipelineAggregator} from a stream
 | 
	
		
			
				|  |  |           * @param parser reads the aggregation builder from XContent
 | 
	
		
			
				|  |  |           * @param name names by which the aggregation may be parsed. The first name is special because it is the name that the reader is
 | 
	
		
			
				|  |  |           *        registered under.
 | 
	
		
			
				|  |  |           */
 | 
	
		
			
				|  |  |          public PipelineAggregationSpec(Reader<? extends PipelineAggregationBuilder> builderReader,
 | 
	
		
			
				|  |  | +                Writeable.Reader<? extends PipelineAggregator> aggregatorReader,
 | 
	
		
			
				|  |  |                  PipelineAggregator.Parser parser, ParseField name) {
 | 
	
		
			
				|  |  |              this.builderReader = builderReader;
 | 
	
		
			
				|  |  | +            this.aggregatorReader = aggregatorReader;
 | 
	
		
			
				|  |  |              this.parser = parser;
 | 
	
		
			
				|  |  |              this.name = name;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -471,33 +473,17 @@ public class SearchModule extends AbstractModule {
 | 
	
		
			
				|  |  |           * Add a reader for the shard level results of the aggregation with {@linkplain #name}'s {@link ParseField#getPreferredName()} as
 | 
	
		
			
				|  |  |           * the {@link NamedWriteable#getWriteableName()}.
 | 
	
		
			
				|  |  |           */
 | 
	
		
			
				|  |  | -        public PipelineAggregationSpec addResultReader(Writeable.Reader<? extends PipelineAggregator> resultReader) {
 | 
	
		
			
				|  |  | +        public PipelineAggregationSpec addResultReader(Writeable.Reader<? extends InternalAggregation> resultReader) {
 | 
	
		
			
				|  |  |              return addResultReader(name.getPreferredName(), resultReader);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /**
 | 
	
		
			
				|  |  |           * Add a reader for the shard level results of the aggregation.
 | 
	
		
			
				|  |  |           */
 | 
	
		
			
				|  |  | -        public PipelineAggregationSpec addResultReader(String writeableName, Writeable.Reader<? extends PipelineAggregator> resultReader) {
 | 
	
		
			
				|  |  | +        public PipelineAggregationSpec addResultReader(String writeableName, Writeable.Reader<? extends InternalAggregation> resultReader) {
 | 
	
		
			
				|  |  |              resultReaders.put(writeableName, resultReader);
 | 
	
		
			
				|  |  |              return this;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /**
 | 
	
		
			
				|  |  | -         * Add a reader for the shard level bucket results of the aggregation with {@linkplain name}'s {@link ParseField#getPreferredName()}
 | 
	
		
			
				|  |  | -         * as the {@link NamedWriteable#getWriteableName()}.
 | 
	
		
			
				|  |  | -         */
 | 
	
		
			
				|  |  | -        public PipelineAggregationSpec addBucketReader(Writeable.Reader<? extends InternalAggregation> resultReader) {
 | 
	
		
			
				|  |  | -            return addBucketReader(name.getPreferredName(), resultReader);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /**
 | 
	
		
			
				|  |  | -         * Add a reader for the shard level results of the aggregation.
 | 
	
		
			
				|  |  | -         */
 | 
	
		
			
				|  |  | -        public PipelineAggregationSpec addBucketReader(String writeableName, Writeable.Reader<? extends InternalAggregation> resultReader) {
 | 
	
		
			
				|  |  | -            bucketReaders.put(writeableName, resultReader);
 | 
	
		
			
				|  |  | -            return this;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void registerPipelineAggregation(Writeable.Reader<? extends PipelineAggregationBuilder> reader,
 | 
	
	
		
			
				|  | @@ -606,49 +592,80 @@ public class SearchModule extends AbstractModule {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  |                  DerivativePipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                DerivativePipelineAggregator::new,
 | 
	
		
			
				|  |  |                  DerivativePipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  |                  DerivativePipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | -                    .addResultReader(DerivativePipelineAggregator::new)
 | 
	
		
			
				|  |  | -                    .addBucketReader(InternalDerivative::new));
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(MaxBucketPipelineAggregationBuilder::new, MaxBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | -                MaxBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(MinBucketPipelineAggregationBuilder::new, MinBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | -                MinBucketPipelineAggregationBuilder.AGGREGATION_FIELD_NAME);
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(AvgBucketPipelineAggregationBuilder::new, AvgBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | -                AvgBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(SumBucketPipelineAggregationBuilder::new, SumBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | -                SumBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | +                    .addResultReader(InternalDerivative::new));
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                MaxBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                MaxBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                MaxBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | +                MaxBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | +                    // This bucket is used by many pipeline aggreations.
 | 
	
		
			
				|  |  | +                    .addResultReader(InternalBucketMetricValue.NAME, InternalBucketMetricValue::new));
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                MinBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                MinBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                MinBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | +                MinBucketPipelineAggregationBuilder.AGGREGATION_FIELD_NAME)
 | 
	
		
			
				|  |  | +                    /* Uses InternalBucketMetricValue */);
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                AvgBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                AvgBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                AvgBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | +                AvgBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | +                    // This bucket is used by many pipeline aggreations.
 | 
	
		
			
				|  |  | +                    .addResultReader(InternalSimpleValue.NAME, InternalSimpleValue::new));
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                SumBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                SumBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                SumBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | +                SumBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | +                    /* Uses InternalSimpleValue */);
 | 
	
		
			
				|  |  |          registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  |                  StatsBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                StatsBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  |                  StatsBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  |                  StatsBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | -                    .addResultReader(StatsBucketPipelineAggregator::new)
 | 
	
		
			
				|  |  | -                    .addBucketReader(InternalStatsBucket::new));
 | 
	
		
			
				|  |  | +                    .addResultReader(InternalStatsBucket::new));
 | 
	
		
			
				|  |  |          registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  |                  ExtendedStatsBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                ExtendedStatsBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  |                  new ExtendedStatsBucketParser(),
 | 
	
		
			
				|  |  |                  ExtendedStatsBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | -                    .addResultReader(ExtendedStatsBucketPipelineAggregator::new)
 | 
	
		
			
				|  |  | -                    .addBucketReader(InternalExtendedStatsBucket::new));
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(PercentilesBucketPipelineAggregationBuilder::new, PercentilesBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | -                PercentilesBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | +                    .addResultReader(InternalExtendedStatsBucket::new));
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                PercentilesBucketPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                PercentilesBucketPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                PercentilesBucketPipelineAggregationBuilder.PARSER,
 | 
	
		
			
				|  |  | +                PercentilesBucketPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | +                    .addResultReader(InternalPercentilesBucket::new));
 | 
	
		
			
				|  |  |          registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  |                  MovAvgPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                MovAvgPipelineAggregator::new,
 | 
	
		
			
				|  |  |                  (n, c) -> MovAvgPipelineAggregationBuilder.parse(movingAverageModelParserRegistry, n, c),
 | 
	
		
			
				|  |  |                  MovAvgPipelineAggregationBuilder.AGGREGATION_FIELD_NAME)
 | 
	
		
			
				|  |  | -                    .addResultReader(MovAvgPipelineAggregator::new)
 | 
	
		
			
				|  |  |                      /* Uses InternalHistogram for buckets */);
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(CumulativeSumPipelineAggregationBuilder::new, CumulativeSumPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | -                CumulativeSumPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(BucketScriptPipelineAggregationBuilder::new, BucketScriptPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | -                BucketScriptPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | -        registerPipelineAggregation(BucketSelectorPipelineAggregationBuilder::new, BucketSelectorPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | -                BucketSelectorPipelineAggregationBuilder.AGGREGATION_NAME_FIELD);
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                CumulativeSumPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                CumulativeSumPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                CumulativeSumPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | +                CumulativeSumPipelineAggregationBuilder.AGGREGATION_NAME_FIELD));
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                BucketScriptPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                BucketScriptPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                BucketScriptPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | +                BucketScriptPipelineAggregationBuilder.AGGREGATION_NAME_FIELD));
 | 
	
		
			
				|  |  | +        registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  | +                BucketSelectorPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                BucketSelectorPipelineAggregator::new,
 | 
	
		
			
				|  |  | +                BucketSelectorPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | +                BucketSelectorPipelineAggregationBuilder.AGGREGATION_NAME_FIELD));
 | 
	
		
			
				|  |  |          registerPipelineAggregation(new PipelineAggregationSpec(
 | 
	
		
			
				|  |  |                  SerialDiffPipelineAggregationBuilder::new,
 | 
	
		
			
				|  |  | +                SerialDiffPipelineAggregator::new,
 | 
	
		
			
				|  |  |                  SerialDiffPipelineAggregationBuilder::parse,
 | 
	
		
			
				|  |  | -                SerialDiffPipelineAggregationBuilder.AGGREGATION_NAME_FIELD)
 | 
	
		
			
				|  |  | -                    .addResultReader(SerialDiffPipelineAggregator::new));
 | 
	
		
			
				|  |  | +                SerialDiffPipelineAggregationBuilder.AGGREGATION_NAME_FIELD));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      protected void configureSearch() {
 | 
	
	
		
			
				|  | @@ -879,18 +896,4 @@ public class SearchModule extends AbstractModule {
 | 
	
		
			
				|  |  |              registerQuery(GeoShapeQueryBuilder::new, GeoShapeQueryBuilder::fromXContent, GeoShapeQueryBuilder.QUERY_NAME_FIELD);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    static {
 | 
	
		
			
				|  |  | -        // Pipeline Aggregations
 | 
	
		
			
				|  |  | -        InternalSimpleValue.registerStreams();
 | 
	
		
			
				|  |  | -        InternalBucketMetricValue.registerStreams();
 | 
	
		
			
				|  |  | -        MaxBucketPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        MinBucketPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        AvgBucketPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        SumBucketPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        PercentilesBucketPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        CumulativeSumPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        BucketScriptPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -        BucketSelectorPipelineAggregator.registerStreams();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  }
 |