forked from elastic/elasticsearch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
InternalMAD.java
120 lines (100 loc) · 4.17 KB
/
InternalMAD.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.search.aggregations.metrics.mad;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.search.DocValueFormat;
import org.elasticsearch.search.aggregations.InternalAggregation;
import org.elasticsearch.search.aggregations.metrics.InternalNumericMetricsAggregation;
import org.elasticsearch.search.aggregations.metrics.TDigestState;
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static org.elasticsearch.search.aggregations.metrics.mad.MADAggregator.computeMAD;
public class InternalMAD extends InternalNumericMetricsAggregation.SingleValue implements MedianAbsoluteDeviation {
private final TDigestState valueSketch;
public InternalMAD(String name,
List<PipelineAggregator> pipelineAggregators,
Map<String, Object> metaData,
DocValueFormat format,
TDigestState valueSketch) {
super(name, pipelineAggregators, metaData);
this.format = format;
this.valueSketch = valueSketch;
}
public InternalMAD(StreamInput in) throws IOException {
super(in);
format = in.readNamedWriteable(DocValueFormat.class);
valueSketch = TDigestState.read(in);
}
@Override
protected void doWriteTo(StreamOutput out) throws IOException {
out.writeNamedWriteable(format);
TDigestState.write(valueSketch, out);
}
@Override
public InternalAggregation doReduce(List<InternalAggregation> aggregations, ReduceContext reduceContext) {
TDigestState valueMerged = null;
for (InternalAggregation aggregation : aggregations) {
final InternalMAD magAgg = (InternalMAD) aggregation;
if (valueMerged == null) {
valueMerged = new TDigestState(magAgg.valueSketch.compression());
}
valueMerged.add(magAgg.valueSketch);
}
return new InternalMAD(name, pipelineAggregators(), metaData, format, valueMerged);
}
@Override
public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException {
final boolean anyResults = valueSketch.size() > 0;
final Double mad = anyResults
? getMAD()
: null;
builder.field(CommonFields.VALUE.getPreferredName(), mad);
if (format != DocValueFormat.RAW && anyResults) {
builder.field(CommonFields.VALUE_AS_STRING.getPreferredName(), format.format(mad).toString());
}
return builder;
}
@Override
protected int doHashCode() {
return Objects.hash(valueSketch);
}
@Override
protected boolean doEquals(Object obj) {
InternalMAD other = (InternalMAD) obj;
return Objects.equals(valueSketch, other.valueSketch);
}
@Override
public String getWriteableName() {
return MADAggregationBuilder.NAME;
}
@Override
public double value() {
return getMAD();
}
// todo maybe - compute this when the object is constructed so we don't have to build a new tdigest for the deviations every time
@Override
public double getMAD() {
return computeMAD(valueSketch);
}
}