@@ -67,7 +67,7 @@ public static DatafeedConfig createRandomizedDatafeedConfig(String jobId, long b
6767 builder .setIndices (randomStringList (1 , 10 ));
6868 builder .setTypes (randomStringList (0 , 10 ));
6969 if (randomBoolean ()) {
70- builder .setQuery (QueryBuilders .termQuery (randomAlphaOfLength (10 ), randomAlphaOfLength (10 )));
70+ builder .setParsedQuery (QueryBuilders .termQuery (randomAlphaOfLength (10 ), randomAlphaOfLength (10 )));
7171 }
7272 boolean addScriptFields = randomBoolean ();
7373 if (addScriptFields ) {
@@ -91,7 +91,7 @@ public static DatafeedConfig createRandomizedDatafeedConfig(String jobId, long b
9191 MaxAggregationBuilder maxTime = AggregationBuilders .max ("time" ).field ("time" );
9292 aggs .addAggregator (AggregationBuilders .dateHistogram ("buckets" )
9393 .interval (aggHistogramInterval ).subAggregation (maxTime ).field ("time" ));
94- builder .setAggregations (aggs );
94+ builder .setParsedAggregations (aggs );
9595 }
9696 if (randomBoolean ()) {
9797 builder .setScrollSize (randomIntBetween (0 , Integer .MAX_VALUE ));
@@ -155,6 +155,43 @@ protected DatafeedConfig doParseInstance(XContentParser parser) {
155155 " \" scroll_size\" : 1234\n " +
156156 "}" ;
157157
158+ private static final String ANACHRONISTIC_QUERY_DATAFEED = "{\n " +
159+ " \" datafeed_id\" : \" farequote-datafeed\" ,\n " +
160+ " \" job_id\" : \" farequote\" ,\n " +
161+ " \" frequency\" : \" 1h\" ,\n " +
162+ " \" indices\" : [\" farequote1\" , \" farequote2\" ],\n " +
163+ //query:match:type stopped being supported in 6.x
164+ " \" query\" : {\" match\" : {\" query\" :\" fieldName\" , \" type\" : \" phrase\" }},\n " +
165+ " \" scroll_size\" : 1234\n " +
166+ "}" ;
167+
168+ private static final String ANACHRONISTIC_AGG_DATAFEED = "{\n " +
169+ " \" datafeed_id\" : \" farequote-datafeed\" ,\n " +
170+ " \" job_id\" : \" farequote\" ,\n " +
171+ " \" frequency\" : \" 1h\" ,\n " +
172+ " \" indices\" : [\" farequote1\" , \" farequote2\" ],\n " +
173+ " \" aggregations\" : {\n " +
174+ " \" buckets\" : {\n " +
175+ " \" date_histogram\" : {\n " +
176+ " \" field\" : \" time\" ,\n " +
177+ " \" interval\" : \" 360s\" ,\n " +
178+ " \" time_zone\" : \" UTC\" \n " +
179+ " },\n " +
180+ " \" aggregations\" : {\n " +
181+ " \" time\" : {\n " +
182+ " \" max\" : {\" field\" : \" time\" }\n " +
183+ " },\n " +
184+ " \" airline\" : {\n " +
185+ " \" terms\" : {\n " +
186+ " \" field\" : \" airline\" ,\n " +
187+ " \" size\" : 0\n " + //size: 0 stopped being supported in 6.x
188+ " }\n " +
189+ " }\n " +
190+ " }\n " +
191+ " }\n " +
192+ " }\n " +
193+ "}" ;
194+
158195 public void testFutureConfigParse () throws IOException {
159196 XContentParser parser = XContentFactory .xContent (XContentType .JSON )
160197 .createParser (NamedXContentRegistry .EMPTY , DeprecationHandler .THROW_UNSUPPORTED_OPERATION , FUTURE_DATAFEED );
@@ -163,6 +200,44 @@ public void testFutureConfigParse() throws IOException {
163200 assertEquals ("[6:5] [datafeed_config] unknown field [tomorrows_technology_today], parser not found" , e .getMessage ());
164201 }
165202
203+ public void testPastQueryConfigParse () throws IOException {
204+ try (XContentParser parser = XContentFactory .xContent (XContentType .JSON )
205+ .createParser (NamedXContentRegistry .EMPTY , DeprecationHandler .THROW_UNSUPPORTED_OPERATION , ANACHRONISTIC_QUERY_DATAFEED )) {
206+
207+ DatafeedConfig config = DatafeedConfig .LENIENT_PARSER .apply (parser , null ).build ();
208+ ElasticsearchException e = expectThrows (ElasticsearchException .class , () -> config .getParsedQuery ());
209+ assertEquals ("[match] query doesn't support multiple fields, found [query] and [type]" , e .getMessage ());
210+ }
211+
212+ try (XContentParser parser = XContentFactory .xContent (XContentType .JSON )
213+ .createParser (NamedXContentRegistry .EMPTY , DeprecationHandler .THROW_UNSUPPORTED_OPERATION , ANACHRONISTIC_QUERY_DATAFEED )) {
214+
215+ XContentParseException e = expectThrows (XContentParseException .class ,
216+ () -> DatafeedConfig .STRICT_PARSER .apply (parser , null ).build ());
217+ assertEquals ("[6:25] [datafeed_config] failed to parse field [query]" , e .getMessage ());
218+ }
219+ }
220+
221+ public void testPastAggConfigParse () throws IOException {
222+ try (XContentParser parser = XContentFactory .xContent (XContentType .JSON )
223+ .createParser (NamedXContentRegistry .EMPTY , DeprecationHandler .THROW_UNSUPPORTED_OPERATION , ANACHRONISTIC_AGG_DATAFEED )) {
224+
225+ DatafeedConfig .Builder configBuilder = DatafeedConfig .LENIENT_PARSER .apply (parser , null );
226+ ElasticsearchException e = expectThrows (ElasticsearchException .class , () -> configBuilder .build ());
227+ assertEquals (
228+ "Datafeed [farequote-datafeed] aggregations are not parsable: [size] must be greater than 0. Found [0] in [airline]" ,
229+ e .getMessage ());
230+ }
231+
232+ try (XContentParser parser = XContentFactory .xContent (XContentType .JSON )
233+ .createParser (NamedXContentRegistry .EMPTY , DeprecationHandler .THROW_UNSUPPORTED_OPERATION , ANACHRONISTIC_AGG_DATAFEED )) {
234+
235+ XContentParseException e = expectThrows (XContentParseException .class ,
236+ () -> DatafeedConfig .STRICT_PARSER .apply (parser , null ).build ());
237+ assertEquals ("[8:25] [datafeed_config] failed to parse field [aggregations]" , e .getMessage ());
238+ }
239+ }
240+
166241 public void testFutureMetadataParse () throws IOException {
167242 XContentParser parser = XContentFactory .xContent (XContentType .JSON )
168243 .createParser (NamedXContentRegistry .EMPTY , DeprecationHandler .THROW_UNSUPPORTED_OPERATION , FUTURE_DATAFEED );
@@ -274,7 +349,7 @@ public void testBuild_GivenScriptFieldsAndAggregations() {
274349 datafeed .setTypes (Collections .singletonList ("my_type" ));
275350 datafeed .setScriptFields (Collections .singletonList (new SearchSourceBuilder .ScriptField (randomAlphaOfLength (10 ),
276351 mockScript (randomAlphaOfLength (10 )), randomBoolean ())));
277- datafeed .setAggregations (new AggregatorFactories .Builder ().addAggregator (AggregationBuilders .avg ("foo" )));
352+ datafeed .setParsedAggregations (new AggregatorFactories .Builder ().addAggregator (AggregationBuilders .avg ("foo" )));
278353
279354 ElasticsearchException e = expectThrows (ElasticsearchException .class , datafeed ::build );
280355
@@ -295,7 +370,7 @@ public void testHasAggregations_NonEmpty() {
295370 builder .setIndices (Collections .singletonList ("myIndex" ));
296371 builder .setTypes (Collections .singletonList ("myType" ));
297372 MaxAggregationBuilder maxTime = AggregationBuilders .max ("time" ).field ("time" );
298- builder .setAggregations (new AggregatorFactories .Builder ().addAggregator (
373+ builder .setParsedAggregations (new AggregatorFactories .Builder ().addAggregator (
299374 AggregationBuilders .dateHistogram ("time" ).interval (300000 ).subAggregation (maxTime ).field ("time" )));
300375 DatafeedConfig datafeedConfig = builder .build ();
301376
@@ -306,7 +381,7 @@ public void testBuild_GivenEmptyAggregations() {
306381 DatafeedConfig .Builder builder = new DatafeedConfig .Builder ("datafeed1" , "job1" );
307382 builder .setIndices (Collections .singletonList ("myIndex" ));
308383 builder .setTypes (Collections .singletonList ("myType" ));
309- builder .setAggregations (new AggregatorFactories .Builder ());
384+ builder .setParsedAggregations (new AggregatorFactories .Builder ());
310385
311386 ElasticsearchException e = expectThrows (ElasticsearchException .class , builder ::build );
312387
@@ -318,13 +393,13 @@ public void testBuild_GivenHistogramWithDefaultInterval() {
318393 builder .setIndices (Collections .singletonList ("myIndex" ));
319394 builder .setTypes (Collections .singletonList ("myType" ));
320395 MaxAggregationBuilder maxTime = AggregationBuilders .max ("time" ).field ("time" );
321- builder .setAggregations (new AggregatorFactories .Builder ().addAggregator (
396+ builder .setParsedAggregations (new AggregatorFactories .Builder ().addAggregator (
322397 AggregationBuilders .histogram ("time" ).subAggregation (maxTime ).field ("time" ))
323398 );
324399
325400 ElasticsearchException e = expectThrows (ElasticsearchException .class , builder ::build );
326401
327- assertThat (e .getMessage (), equalTo ( "Aggregation interval must be greater than 0 " ));
402+ assertThat (e .getMessage (), containsString ( "[ interval] must be >0 for histogram aggregation [time] " ));
328403 }
329404
330405 public void testBuild_GivenDateHistogramWithInvalidTimeZone () {
@@ -341,7 +416,7 @@ public void testBuild_GivenDateHistogramWithDefaultInterval() {
341416 ElasticsearchException e = expectThrows (ElasticsearchException .class ,
342417 () -> createDatafeedWithDateHistogram ((String ) null ));
343418
344- assertThat (e .getMessage (), equalTo ("Aggregation interval must be greater than 0" ));
419+ assertThat (e .getMessage (), containsString ("Aggregation interval must be greater than 0" ));
345420 }
346421
347422 public void testBuild_GivenValidDateHistogram () {
@@ -402,9 +477,8 @@ public void testValidateAggregations_GivenMulitpleHistogramAggs() {
402477 TermsAggregationBuilder toplevelTerms = AggregationBuilders .terms ("top_level" );
403478 toplevelTerms .subAggregation (dateHistogram );
404479
405- DatafeedConfig .Builder builder = new DatafeedConfig .Builder ("foo" , "bar" );
406- builder .setAggregations (new AggregatorFactories .Builder ().addAggregator (toplevelTerms ));
407- ElasticsearchException e = expectThrows (ElasticsearchException .class , builder ::validateAggregations );
480+ ElasticsearchException e = expectThrows (ElasticsearchException .class ,
481+ () -> DatafeedConfig .validateAggregations (new AggregatorFactories .Builder ().addAggregator (toplevelTerms )));
408482
409483 assertEquals ("Aggregations can only have 1 date_histogram or histogram aggregation" , e .getMessage ());
410484 }
@@ -520,7 +594,9 @@ private static DatafeedConfig createDatafeedWithDateHistogram(DateHistogramAggre
520594 DatafeedConfig .Builder builder = new DatafeedConfig .Builder ("datafeed1" , "job1" );
521595 builder .setIndices (Collections .singletonList ("myIndex" ));
522596 builder .setTypes (Collections .singletonList ("myType" ));
523- builder .setAggregations (new AggregatorFactories .Builder ().addAggregator (dateHistogram ));
597+ AggregatorFactories .Builder aggs = new AggregatorFactories .Builder ().addAggregator (dateHistogram );
598+ DatafeedConfig .validateAggregations (aggs );
599+ builder .setParsedAggregations (aggs );
524600 return builder .build ();
525601 }
526602
@@ -556,11 +632,11 @@ protected DatafeedConfig mutateInstance(DatafeedConfig instance) throws IOExcept
556632 break ;
557633 case 6 :
558634 BoolQueryBuilder query = new BoolQueryBuilder ();
559- if (instance .getQuery () != null ) {
560- query .must (instance .getQuery ());
635+ if (instance .getParsedQuery () != null ) {
636+ query .must (instance .getParsedQuery ());
561637 }
562638 query .filter (new TermQueryBuilder (randomAlphaOfLengthBetween (1 , 10 ), randomAlphaOfLengthBetween (1 , 10 )));
563- builder .setQuery (query );
639+ builder .setParsedQuery (query );
564640 break ;
565641 case 7 :
566642 if (instance .hasAggregations ()) {
@@ -571,7 +647,7 @@ protected DatafeedConfig mutateInstance(DatafeedConfig instance) throws IOExcept
571647 aggBuilder
572648 .addAggregator (new DateHistogramAggregationBuilder (timeField ).field (timeField ).interval (between (10000 , 3600000 ))
573649 .subAggregation (new MaxAggregationBuilder (timeField ).field (timeField )));
574- builder .setAggregations (aggBuilder );
650+ builder .setParsedAggregations (aggBuilder );
575651 if (instance .getScriptFields ().isEmpty () == false ) {
576652 builder .setScriptFields (Collections .emptyList ());
577653 }
0 commit comments