20
20
package org .elasticsearch .search .aggregations .metrics ;
21
21
22
22
import org .elasticsearch .common .ParseField ;
23
- import org .elasticsearch .common .ParsingException ;
24
23
import org .elasticsearch .common .io .stream .StreamInput ;
25
24
import org .elasticsearch .common .io .stream .StreamOutput ;
25
+ import org .elasticsearch .common .xcontent .ConstructingObjectParser ;
26
26
import org .elasticsearch .common .xcontent .XContentBuilder ;
27
- import org .elasticsearch .common .xcontent .XContentParser ;
28
27
import org .elasticsearch .index .query .QueryShardContext ;
29
- import org .elasticsearch .script .ScriptedMetricAggContexts ;
30
28
import org .elasticsearch .script .Script ;
29
+ import org .elasticsearch .script .ScriptedMetricAggContexts ;
31
30
import org .elasticsearch .search .aggregations .AbstractAggregationBuilder ;
32
31
import org .elasticsearch .search .aggregations .AggregationBuilder ;
33
32
import org .elasticsearch .search .aggregations .AggregatorFactories .Builder ;
38
37
import java .util .Map ;
39
38
import java .util .Objects ;
40
39
40
+ import static org .elasticsearch .common .xcontent .ConstructingObjectParser .constructorArg ;
41
+
41
42
public class ScriptedMetricAggregationBuilder extends AbstractAggregationBuilder <ScriptedMetricAggregationBuilder > {
42
43
public static final String NAME = "scripted_metric" ;
43
44
@@ -47,6 +48,20 @@ public class ScriptedMetricAggregationBuilder extends AbstractAggregationBuilder
47
48
private static final ParseField REDUCE_SCRIPT_FIELD = new ParseField ("reduce_script" );
48
49
private static final ParseField PARAMS_FIELD = new ParseField ("params" );
49
50
51
+ public static final ConstructingObjectParser <ScriptedMetricAggregationBuilder , String > PARSER =
52
+ new ConstructingObjectParser <>(NAME , false , (args , name ) -> {
53
+ ScriptedMetricAggregationBuilder builder = new ScriptedMetricAggregationBuilder (name );
54
+ builder .mapScript ((Script ) args [0 ]);
55
+ return builder ;
56
+ });
57
+ static {
58
+ Script .declareScript (PARSER , ScriptedMetricAggregationBuilder ::initScript , INIT_SCRIPT_FIELD );
59
+ Script .declareScript (PARSER , constructorArg (), MAP_SCRIPT_FIELD );
60
+ Script .declareScript (PARSER , ScriptedMetricAggregationBuilder ::combineScript , COMBINE_SCRIPT_FIELD );
61
+ Script .declareScript (PARSER , ScriptedMetricAggregationBuilder ::reduceScript , REDUCE_SCRIPT_FIELD );
62
+ PARSER .declareObject (ScriptedMetricAggregationBuilder ::params , (p , name ) -> p .map (), PARAMS_FIELD );
63
+ }
64
+
50
65
private Script initScript ;
51
66
private Script mapScript ;
52
67
private Script combineScript ;
@@ -260,62 +275,6 @@ protected XContentBuilder internalXContent(XContentBuilder builder, Params build
260
275
return builder ;
261
276
}
262
277
263
- public static ScriptedMetricAggregationBuilder parse (String aggregationName , XContentParser parser ) throws IOException {
264
- Script initScript = null ;
265
- Script mapScript = null ;
266
- Script combineScript = null ;
267
- Script reduceScript = null ;
268
- Map <String , Object > params = null ;
269
- XContentParser .Token token ;
270
- String currentFieldName = null ;
271
-
272
- while ((token = parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
273
- if (token == XContentParser .Token .FIELD_NAME ) {
274
- currentFieldName = parser .currentName ();
275
- } else if (token == XContentParser .Token .START_OBJECT || token == XContentParser .Token .VALUE_STRING ) {
276
- if (INIT_SCRIPT_FIELD .match (currentFieldName , parser .getDeprecationHandler ())) {
277
- initScript = Script .parse (parser );
278
- } else if (MAP_SCRIPT_FIELD .match (currentFieldName , parser .getDeprecationHandler ())) {
279
- mapScript = Script .parse (parser );
280
- } else if (COMBINE_SCRIPT_FIELD .match (currentFieldName , parser .getDeprecationHandler ())) {
281
- combineScript = Script .parse (parser );
282
- } else if (REDUCE_SCRIPT_FIELD .match (currentFieldName , parser .getDeprecationHandler ())) {
283
- reduceScript = Script .parse (parser );
284
- } else if (token == XContentParser .Token .START_OBJECT &&
285
- PARAMS_FIELD .match (currentFieldName , parser .getDeprecationHandler ())) {
286
- params = parser .map ();
287
- } else {
288
- throw new ParsingException (parser .getTokenLocation (),
289
- "Unknown key for a " + token + " in [" + aggregationName + "]: [" + currentFieldName + "]." );
290
- }
291
- } else {
292
- throw new ParsingException (parser .getTokenLocation (), "Unexpected token " + token + " in [" + aggregationName + "]." );
293
- }
294
- }
295
-
296
- if (mapScript == null ) {
297
- throw new ParsingException (parser .getTokenLocation (), "map_script field is required in [" + aggregationName + "]." );
298
- }
299
-
300
- ScriptedMetricAggregationBuilder factory = new ScriptedMetricAggregationBuilder (aggregationName );
301
- if (initScript != null ) {
302
- factory .initScript (initScript );
303
- }
304
- if (mapScript != null ) {
305
- factory .mapScript (mapScript );
306
- }
307
- if (combineScript != null ) {
308
- factory .combineScript (combineScript );
309
- }
310
- if (reduceScript != null ) {
311
- factory .reduceScript (reduceScript );
312
- }
313
- if (params != null ) {
314
- factory .params (params );
315
- }
316
- return factory ;
317
- }
318
-
319
278
@ Override
320
279
public String getType () {
321
280
return NAME ;
0 commit comments