|
25 | 25 | import org.elasticsearch.search.aggregations.metrics.max.MaxAggregationBuilder;
|
26 | 26 | import org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder;
|
27 | 27 | import org.elasticsearch.search.builder.SearchSourceBuilder;
|
28 |
| -import org.elasticsearch.xpack.core.ml.MlParserType; |
29 | 28 | import org.elasticsearch.xpack.core.ml.datafeed.extractor.ExtractorUtils;
|
30 | 29 | import org.elasticsearch.xpack.core.ml.job.config.Job;
|
31 | 30 | import org.elasticsearch.xpack.core.ml.job.messages.Messages;
|
|
38 | 37 | import java.util.ArrayList;
|
39 | 38 | import java.util.Collections;
|
40 | 39 | import java.util.Comparator;
|
41 |
| -import java.util.EnumMap; |
42 | 40 | import java.util.List;
|
43 | 41 | import java.util.Map;
|
44 | 42 | import java.util.Objects;
|
@@ -87,44 +85,46 @@ public class DatafeedConfig extends AbstractDiffable<DatafeedConfig> implements
|
87 | 85 | public static final ParseField HEADERS = new ParseField("headers");
|
88 | 86 |
|
89 | 87 | // These parsers follow the pattern that metadata is parsed leniently (to allow for enhancements), whilst config is parsed strictly
|
90 |
| - public static final ObjectParser<Builder, Void> METADATA_PARSER = new ObjectParser<>("datafeed_config", true, Builder::new); |
91 |
| - public static final ObjectParser<Builder, Void> CONFIG_PARSER = new ObjectParser<>("datafeed_config", false, Builder::new); |
92 |
| - public static final Map<MlParserType, ObjectParser<Builder, Void>> PARSERS = new EnumMap<>(MlParserType.class); |
93 |
| - |
94 |
| - static { |
95 |
| - PARSERS.put(MlParserType.METADATA, METADATA_PARSER); |
96 |
| - PARSERS.put(MlParserType.CONFIG, CONFIG_PARSER); |
97 |
| - for (MlParserType parserType : MlParserType.values()) { |
98 |
| - ObjectParser<Builder, Void> parser = PARSERS.get(parserType); |
99 |
| - assert parser != null; |
100 |
| - parser.declareString(Builder::setId, ID); |
101 |
| - parser.declareString(Builder::setJobId, Job.ID); |
102 |
| - parser.declareStringArray(Builder::setIndices, INDEXES); |
103 |
| - parser.declareStringArray(Builder::setIndices, INDICES); |
104 |
| - parser.declareStringArray(Builder::setTypes, TYPES); |
105 |
| - parser.declareString((builder, val) -> |
106 |
| - builder.setQueryDelay(TimeValue.parseTimeValue(val, QUERY_DELAY.getPreferredName())), QUERY_DELAY); |
107 |
| - parser.declareString((builder, val) -> |
108 |
| - builder.setFrequency(TimeValue.parseTimeValue(val, FREQUENCY.getPreferredName())), FREQUENCY); |
109 |
| - parser.declareObject(Builder::setQuery, (p, c) -> AbstractQueryBuilder.parseInnerQueryBuilder(p), QUERY); |
110 |
| - parser.declareObject(Builder::setAggregations, (p, c) -> AggregatorFactories.parseAggregators(p), AGGREGATIONS); |
111 |
| - parser.declareObject(Builder::setAggregations, (p, c) -> AggregatorFactories.parseAggregators(p), AGGS); |
112 |
| - parser.declareObject(Builder::setScriptFields, (p, c) -> { |
113 |
| - List<SearchSourceBuilder.ScriptField> parsedScriptFields = new ArrayList<>(); |
114 |
| - while (p.nextToken() != XContentParser.Token.END_OBJECT) { |
115 |
| - parsedScriptFields.add(new SearchSourceBuilder.ScriptField(p)); |
116 |
| - } |
117 |
| - parsedScriptFields.sort(Comparator.comparing(SearchSourceBuilder.ScriptField::fieldName)); |
118 |
| - return parsedScriptFields; |
119 |
| - }, SCRIPT_FIELDS); |
120 |
| - parser.declareInt(Builder::setScrollSize, SCROLL_SIZE); |
121 |
| - // TODO this is to read former _source field. Remove in v7.0.0 |
122 |
| - parser.declareBoolean((builder, value) -> {}, SOURCE); |
123 |
| - parser.declareObject(Builder::setChunkingConfig, ChunkingConfig.PARSERS.get(parserType), CHUNKING_CONFIG); |
124 |
| - } |
125 |
| - // Headers are only parsed by the metadata parser, so headers supplied in the _body_ of a REST request will be rejected. |
126 |
| - // (For config headers are explicitly transferred from the auth headers by code in the put/update datafeed actions.) |
127 |
| - METADATA_PARSER.declareObject(Builder::setHeaders, (p, c) -> p.mapStrings(), HEADERS); |
| 88 | + public static final ObjectParser<Builder, Void> LENIENT_PARSER = createParser(true); |
| 89 | + public static final ObjectParser<Builder, Void> STRICT_PARSER = createParser(false); |
| 90 | + |
| 91 | + private static ObjectParser<Builder, Void> createParser(boolean ignoreUnknownFields) { |
| 92 | + ObjectParser<Builder, Void> parser = new ObjectParser<>("datafeed_config", ignoreUnknownFields, Builder::new); |
| 93 | + |
| 94 | + parser.declareString(Builder::setId, ID); |
| 95 | + parser.declareString(Builder::setJobId, Job.ID); |
| 96 | + parser.declareStringArray(Builder::setIndices, INDEXES); |
| 97 | + parser.declareStringArray(Builder::setIndices, INDICES); |
| 98 | + parser.declareStringArray(Builder::setTypes, TYPES); |
| 99 | + parser.declareString((builder, val) -> |
| 100 | + builder.setQueryDelay(TimeValue.parseTimeValue(val, QUERY_DELAY.getPreferredName())), QUERY_DELAY); |
| 101 | + parser.declareString((builder, val) -> |
| 102 | + builder.setFrequency(TimeValue.parseTimeValue(val, FREQUENCY.getPreferredName())), FREQUENCY); |
| 103 | + parser.declareObject(Builder::setQuery, (p, c) -> AbstractQueryBuilder.parseInnerQueryBuilder(p), QUERY); |
| 104 | + parser.declareObject(Builder::setAggregations, (p, c) -> AggregatorFactories.parseAggregators(p), AGGREGATIONS); |
| 105 | + parser.declareObject(Builder::setAggregations, (p, c) -> AggregatorFactories.parseAggregators(p), AGGS); |
| 106 | + parser.declareObject(Builder::setScriptFields, (p, c) -> { |
| 107 | + List<SearchSourceBuilder.ScriptField> parsedScriptFields = new ArrayList<>(); |
| 108 | + while (p.nextToken() != XContentParser.Token.END_OBJECT) { |
| 109 | + parsedScriptFields.add(new SearchSourceBuilder.ScriptField(p)); |
| 110 | + } |
| 111 | + parsedScriptFields.sort(Comparator.comparing(SearchSourceBuilder.ScriptField::fieldName)); |
| 112 | + return parsedScriptFields; |
| 113 | + }, SCRIPT_FIELDS); |
| 114 | + parser.declareInt(Builder::setScrollSize, SCROLL_SIZE); |
| 115 | + // TODO this is to read former _source field. Remove in v7.0.0 |
| 116 | + parser.declareBoolean((builder, value) -> { |
| 117 | + }, SOURCE); |
| 118 | + parser.declareObject(Builder::setChunkingConfig, ignoreUnknownFields ? ChunkingConfig.LENIENT_PARSER : ChunkingConfig.STRICT_PARSER, |
| 119 | + CHUNKING_CONFIG); |
| 120 | + |
| 121 | + if (ignoreUnknownFields) { |
| 122 | + // Headers are not parsed by the strict (config) parser, so headers supplied in the _body_ of a REST request will be rejected. |
| 123 | + // (For config, headers are explicitly transferred from the auth headers by code in the put/update datafeed actions.) |
| 124 | + parser.declareObject(Builder::setHeaders, (p, c) -> p.mapStrings(), HEADERS); |
| 125 | + } |
| 126 | + |
| 127 | + return parser; |
128 | 128 | }
|
129 | 129 |
|
130 | 130 | private final String id;
|
|
0 commit comments