5
5
*/
6
6
package org .elasticsearch .xpack .analytics .rate ;
7
7
8
- import org .apache .lucene .index .LeafReaderContext ;
8
+ import java .io .IOException ;
9
+ import java .util .Map ;
10
+
9
11
import org .apache .lucene .search .ScoreMode ;
10
12
import org .elasticsearch .common .Rounding ;
11
13
import org .elasticsearch .common .lease .Releasables ;
12
- import org .elasticsearch .common .util .BigArrays ;
13
14
import org .elasticsearch .common .util .DoubleArray ;
14
- import org .elasticsearch .index .fielddata .SortedNumericDoubleValues ;
15
15
import org .elasticsearch .search .DocValueFormat ;
16
16
import org .elasticsearch .search .aggregations .Aggregator ;
17
17
import org .elasticsearch .search .aggregations .InternalAggregation ;
18
- import org .elasticsearch .search .aggregations .LeafBucketCollector ;
19
- import org .elasticsearch .search .aggregations .LeafBucketCollectorBase ;
20
18
import org .elasticsearch .search .aggregations .bucket .histogram .SizedBucketAggregator ;
21
- import org .elasticsearch .search .aggregations .metrics .CompensatedSum ;
22
19
import org .elasticsearch .search .aggregations .metrics .NumericMetricsAggregator ;
23
20
import org .elasticsearch .search .aggregations .support .ValuesSource ;
24
21
import org .elasticsearch .search .aggregations .support .ValuesSourceConfig ;
25
22
import org .elasticsearch .search .internal .SearchContext ;
26
23
27
- import java .io .IOException ;
28
- import java .util .Map ;
29
-
30
- public class RateAggregator extends NumericMetricsAggregator .SingleValue {
24
+ public abstract class AbstractRateAggregator extends NumericMetricsAggregator .SingleValue {
31
25
32
- private final ValuesSource . Numeric valuesSource ;
26
+ protected final ValuesSource valuesSource ;
33
27
private final DocValueFormat format ;
34
28
private final Rounding .DateTimeUnit rateUnit ;
35
29
private final SizedBucketAggregator sizedBucketAggregator ;
36
30
37
- private DoubleArray sums ;
38
- private DoubleArray compensations ;
31
+ protected DoubleArray sums ;
32
+ protected DoubleArray compensations ;
39
33
40
- public RateAggregator (
34
+ public AbstractRateAggregator (
41
35
String name ,
42
36
ValuesSourceConfig valuesSourceConfig ,
43
37
Rounding .DateTimeUnit rateUnit ,
@@ -46,7 +40,7 @@ public RateAggregator(
46
40
Map <String , Object > metadata
47
41
) throws IOException {
48
42
super (name , context , parent , metadata );
49
- this .valuesSource = ( ValuesSource . Numeric ) valuesSourceConfig .getValuesSource ();
43
+ this .valuesSource = valuesSourceConfig .getValuesSource ();
50
44
this .format = valuesSourceConfig .format ();
51
45
if (valuesSource != null ) {
52
46
sums = context .bigArrays ().newDoubleArray (1 , true );
@@ -75,38 +69,6 @@ public ScoreMode scoreMode() {
75
69
return valuesSource != null && valuesSource .needsScores () ? ScoreMode .COMPLETE : ScoreMode .COMPLETE_NO_SCORES ;
76
70
}
77
71
78
- @ Override
79
- public LeafBucketCollector getLeafCollector (LeafReaderContext ctx , final LeafBucketCollector sub ) throws IOException {
80
- final BigArrays bigArrays = context .bigArrays ();
81
- final SortedNumericDoubleValues values = valuesSource .doubleValues (ctx );
82
- final CompensatedSum kahanSummation = new CompensatedSum (0 , 0 );
83
-
84
- return new LeafBucketCollectorBase (sub , values ) {
85
- @ Override
86
- public void collect (int doc , long bucket ) throws IOException {
87
- sums = bigArrays .grow (sums , bucket + 1 );
88
- compensations = bigArrays .grow (compensations , bucket + 1 );
89
-
90
- if (values .advanceExact (doc )) {
91
- final int valuesCount = values .docValueCount ();
92
- // Compute the sum of double values with Kahan summation algorithm which is more
93
- // accurate than naive summation.
94
- double sum = sums .get (bucket );
95
- double compensation = compensations .get (bucket );
96
- kahanSummation .reset (sum , compensation );
97
-
98
- for (int i = 0 ; i < valuesCount ; i ++) {
99
- double value = values .nextValue ();
100
- kahanSummation .add (value );
101
- }
102
-
103
- compensations .set (bucket , kahanSummation .delta ());
104
- sums .set (bucket , kahanSummation .value ());
105
- }
106
- }
107
- };
108
- }
109
-
110
72
@ Override
111
73
public double metric (long owningBucketOrd ) {
112
74
if (sizedBucketAggregator == null || valuesSource == null || owningBucketOrd >= sums .size ()) {
0 commit comments