18
18
*/
19
19
package org .elasticsearch .search .aggregations ;
20
20
21
+ import org .elasticsearch .action .support .ToXContentToBytes ;
22
+ import org .elasticsearch .common .io .stream .StreamInput ;
23
+ import org .elasticsearch .common .io .stream .StreamOutput ;
24
+ import org .elasticsearch .common .io .stream .Writeable ;
25
+ import org .elasticsearch .common .xcontent .XContentBuilder ;
21
26
import org .elasticsearch .search .aggregations .pipeline .PipelineAggregator ;
22
27
import org .elasticsearch .search .aggregations .pipeline .PipelineAggregatorFactory ;
23
28
import org .elasticsearch .search .aggregations .support .AggregationContext ;
26
31
27
32
import java .io .IOException ;
28
33
import java .util .ArrayList ;
34
+ import java .util .Arrays ;
35
+ import java .util .Collections ;
29
36
import java .util .HashMap ;
30
37
import java .util .HashSet ;
31
38
import java .util .LinkedList ;
32
39
import java .util .List ;
33
40
import java .util .Map ;
41
+ import java .util .Objects ;
34
42
import java .util .Set ;
35
43
36
44
/**
37
45
*
38
46
*/
39
- public class AggregatorFactories {
47
+ public class AggregatorFactories extends ToXContentToBytes implements Writeable < AggregatorFactories > {
40
48
41
- public static final AggregatorFactories EMPTY = new Empty ();
49
+ public static final AggregatorFactories EMPTY = new AggregatorFactories (new AggregatorFactory [0 ],
50
+ new ArrayList <PipelineAggregatorFactory >());
42
51
43
52
private AggregatorFactory parent ;
44
53
private AggregatorFactory [] factories ;
@@ -48,7 +57,8 @@ public static Builder builder() {
48
57
return new Builder ();
49
58
}
50
59
51
- private AggregatorFactories (AggregatorFactory [] factories , List <PipelineAggregatorFactory > pipelineAggregators ) {
60
+ private AggregatorFactories (AggregatorFactory [] factories ,
61
+ List <PipelineAggregatorFactory > pipelineAggregators ) {
52
62
this .factories = factories ;
53
63
this .pipelineAggregatorFactories = pipelineAggregators ;
54
64
}
@@ -115,33 +125,12 @@ public void validate() {
115
125
}
116
126
}
117
127
118
- private final static class Empty extends AggregatorFactories {
119
-
120
- private static final AggregatorFactory [] EMPTY_FACTORIES = new AggregatorFactory [0 ];
121
- private static final Aggregator [] EMPTY_AGGREGATORS = new Aggregator [0 ];
122
- private static final List <PipelineAggregatorFactory > EMPTY_PIPELINE_AGGREGATORS = new ArrayList <>();
123
-
124
- private Empty () {
125
- super (EMPTY_FACTORIES , EMPTY_PIPELINE_AGGREGATORS );
126
- }
127
-
128
- @ Override
129
- public Aggregator [] createSubAggregators (Aggregator parent ) {
130
- return EMPTY_AGGREGATORS ;
131
- }
132
-
133
- @ Override
134
- public Aggregator [] createTopLevelAggregators () {
135
- return EMPTY_AGGREGATORS ;
136
- }
137
-
138
- }
139
-
140
128
public static class Builder {
141
129
142
130
private final Set <String > names = new HashSet <>();
143
131
private final List <AggregatorFactory > factories = new ArrayList <>();
144
132
private final List <PipelineAggregatorFactory > pipelineAggregatorFactories = new ArrayList <>();
133
+ private boolean skipResolveOrder ;
145
134
146
135
public Builder addAggregator (AggregatorFactory factory ) {
147
136
if (!names .add (factory .name )) {
@@ -156,15 +145,29 @@ public Builder addPipelineAggregator(PipelineAggregatorFactory pipelineAggregato
156
145
return this ;
157
146
}
158
147
148
+ /**
149
+ * FOR TESTING ONLY
150
+ */
151
+ Builder skipResolveOrder () {
152
+ this .skipResolveOrder = true ;
153
+ return this ;
154
+ }
155
+
159
156
public AggregatorFactories build () {
160
157
if (factories .isEmpty () && pipelineAggregatorFactories .isEmpty ()) {
161
158
return EMPTY ;
162
159
}
163
- List <PipelineAggregatorFactory > orderedpipelineAggregators = resolvePipelineAggregatorOrder (this .pipelineAggregatorFactories , this .factories );
160
+ List <PipelineAggregatorFactory > orderedpipelineAggregators = null ;
161
+ if (skipResolveOrder ) {
162
+ orderedpipelineAggregators = new ArrayList <>(pipelineAggregatorFactories );
163
+ } else {
164
+ orderedpipelineAggregators = resolvePipelineAggregatorOrder (this .pipelineAggregatorFactories , this .factories );
165
+ }
164
166
return new AggregatorFactories (factories .toArray (new AggregatorFactory [factories .size ()]), orderedpipelineAggregators );
165
167
}
166
168
167
- private List <PipelineAggregatorFactory > resolvePipelineAggregatorOrder (List <PipelineAggregatorFactory > pipelineAggregatorFactories , List <AggregatorFactory > aggFactories ) {
169
+ private List <PipelineAggregatorFactory > resolvePipelineAggregatorOrder (List <PipelineAggregatorFactory > pipelineAggregatorFactories ,
170
+ List <AggregatorFactory > aggFactories ) {
168
171
Map <String , PipelineAggregatorFactory > pipelineAggregatorFactoriesMap = new HashMap <>();
169
172
for (PipelineAggregatorFactory factory : pipelineAggregatorFactories ) {
170
173
pipelineAggregatorFactoriesMap .put (factory .getName (), factory );
@@ -259,4 +262,71 @@ List<PipelineAggregatorFactory> getPipelineAggregatorFactories() {
259
262
return this .pipelineAggregatorFactories ;
260
263
}
261
264
}
265
+
266
+ @ Override
267
+ public AggregatorFactories readFrom (StreamInput in ) throws IOException {
268
+ int factoriesSize = in .readVInt ();
269
+ AggregatorFactory [] factoriesList = new AggregatorFactory [factoriesSize ];
270
+ for (int i = 0 ; i < factoriesSize ; i ++) {
271
+ AggregatorFactory factory = in .readAggregatorFactory ();
272
+ factoriesList [i ] = factory ;
273
+ }
274
+ int pipelineFactoriesSize = in .readVInt ();
275
+ List <PipelineAggregatorFactory > pipelineAggregatorFactoriesList = new ArrayList <PipelineAggregatorFactory >(pipelineFactoriesSize );
276
+ for (int i = 0 ; i < pipelineFactoriesSize ; i ++) {
277
+ PipelineAggregatorFactory factory = in .readPipelineAggregatorFactory ();
278
+ pipelineAggregatorFactoriesList .add (factory );
279
+ }
280
+ AggregatorFactories aggregatorFactories = new AggregatorFactories (factoriesList ,
281
+ Collections .unmodifiableList (pipelineAggregatorFactoriesList ));
282
+ return aggregatorFactories ;
283
+ }
284
+
285
+ @ Override
286
+ public void writeTo (StreamOutput out ) throws IOException {
287
+ out .writeVInt (this .factories .length );
288
+ for (AggregatorFactory factory : factories ) {
289
+ out .writeAggregatorFactory (factory );
290
+ }
291
+ out .writeVInt (this .pipelineAggregatorFactories .size ());
292
+ for (PipelineAggregatorFactory factory : pipelineAggregatorFactories ) {
293
+ out .writePipelineAggregatorFactory (factory );
294
+ }
295
+ }
296
+
297
+ @ Override
298
+ public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
299
+ builder .startObject ();
300
+ if (factories != null ) {
301
+ for (AggregatorFactory subAgg : factories ) {
302
+ subAgg .toXContent (builder , params );
303
+ }
304
+ }
305
+ if (pipelineAggregatorFactories != null ) {
306
+ for (PipelineAggregatorFactory subAgg : pipelineAggregatorFactories ) {
307
+ subAgg .toXContent (builder , params );
308
+ }
309
+ }
310
+ builder .endObject ();
311
+ return builder ;
312
+ }
313
+
314
+ @ Override
315
+ public int hashCode () {
316
+ return Objects .hash (Arrays .hashCode (factories ), pipelineAggregatorFactories );
317
+ }
318
+
319
+ @ Override
320
+ public boolean equals (Object obj ) {
321
+ if (obj == null )
322
+ return false ;
323
+ if (getClass () != obj .getClass ())
324
+ return false ;
325
+ AggregatorFactories other = (AggregatorFactories ) obj ;
326
+ if (!Objects .deepEquals (factories , other .factories ))
327
+ return false ;
328
+ if (!Objects .equals (pipelineAggregatorFactories , other .pipelineAggregatorFactories ))
329
+ return false ;
330
+ return true ;
331
+ }
262
332
}
0 commit comments