5
5
*/
6
6
package org .elasticsearch .xpack .core .ml .datafeed ;
7
7
8
+ import org .apache .logging .log4j .LogManager ;
9
+ import org .apache .logging .log4j .Logger ;
8
10
import org .elasticsearch .ElasticsearchException ;
9
11
import org .elasticsearch .Version ;
10
12
import org .elasticsearch .cluster .AbstractDiffable ;
18
20
import org .elasticsearch .common .xcontent .ObjectParser ;
19
21
import org .elasticsearch .common .xcontent .ToXContentObject ;
20
22
import org .elasticsearch .common .xcontent .XContentBuilder ;
21
- import org .elasticsearch .common .xcontent .XContentParseException ;
22
23
import org .elasticsearch .common .xcontent .XContentParser ;
23
- import org .elasticsearch .index .query .AbstractQueryBuilder ;
24
+ import org .elasticsearch .index .query .MatchAllQueryBuilder ;
24
25
import org .elasticsearch .index .query .QueryBuilder ;
25
- import org .elasticsearch .index .query .QueryBuilders ;
26
26
import org .elasticsearch .search .aggregations .AggregationBuilder ;
27
27
import org .elasticsearch .search .aggregations .AggregatorFactories ;
28
28
import org .elasticsearch .search .aggregations .metrics .MaxAggregationBuilder ;
@@ -71,19 +71,12 @@ public class DatafeedConfig extends AbstractDiffable<DatafeedConfig> implements
71
71
(objectMap , id , warnings ) -> {
72
72
try {
73
73
return QUERY_TRANSFORMER .fromMap (objectMap , warnings );
74
- } catch (IOException | XContentParseException exception ) {
74
+ } catch (Exception exception ) {
75
75
// Certain thrown exceptions wrap up the real Illegal argument making it hard to determine cause for the user
76
76
if (exception .getCause () instanceof IllegalArgumentException ) {
77
- throw ExceptionsHelper .badRequestException (
78
- Messages .getMessage (Messages .DATAFEED_CONFIG_QUERY_BAD_FORMAT ,
79
- id ,
80
- exception .getCause ().getMessage ()),
81
- exception .getCause ());
82
- } else {
83
- throw ExceptionsHelper .badRequestException (
84
- Messages .getMessage (Messages .DATAFEED_CONFIG_QUERY_BAD_FORMAT , exception , id ),
85
- exception );
77
+ exception = (Exception )exception .getCause ();
86
78
}
79
+ throw ExceptionsHelper .badRequestException (Messages .getMessage (Messages .DATAFEED_CONFIG_QUERY_BAD_FORMAT , id ), exception );
87
80
}
88
81
};
89
82
@@ -92,22 +85,17 @@ public class DatafeedConfig extends AbstractDiffable<DatafeedConfig> implements
92
85
(objectMap , id , warnings ) -> {
93
86
try {
94
87
return AGG_TRANSFORMER .fromMap (objectMap , warnings );
95
- } catch (IOException | XContentParseException exception ) {
88
+ } catch (Exception exception ) {
96
89
// Certain thrown exceptions wrap up the real Illegal argument making it hard to determine cause for the user
97
90
if (exception .getCause () instanceof IllegalArgumentException ) {
98
- throw ExceptionsHelper .badRequestException (
99
- Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT ,
100
- id ,
101
- exception .getCause ().getMessage ()),
102
- exception .getCause ());
103
- } else {
104
- throw ExceptionsHelper .badRequestException (
105
- Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT , exception .getMessage (), id ),
106
- exception );
91
+ exception = (Exception )exception .getCause ();
107
92
}
93
+ throw ExceptionsHelper .badRequestException (Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT , id ), exception );
108
94
}
109
95
};
110
96
97
+ private static final Logger logger = LogManager .getLogger (DatafeedConfig .class );
98
+
111
99
// Used for QueryPage
112
100
public static final ParseField RESULTS_FIELD = new ParseField ("datafeeds" );
113
101
public static String TYPE = "datafeed" ;
@@ -164,15 +152,11 @@ private static ObjectParser<Builder, Void> createParser(boolean ignoreUnknownFie
164
152
builder .setQueryDelay (TimeValue .parseTimeValue (val , QUERY_DELAY .getPreferredName ())), QUERY_DELAY );
165
153
parser .declareString ((builder , val ) ->
166
154
builder .setFrequency (TimeValue .parseTimeValue (val , FREQUENCY .getPreferredName ())), FREQUENCY );
167
- if (ignoreUnknownFields ) {
168
- parser .declareObject (Builder ::setQuery , (p , c ) -> p .mapOrdered (), QUERY );
169
- parser .declareObject (Builder ::setAggregations , (p , c ) -> p .mapOrdered (), AGGREGATIONS );
170
- parser .declareObject (Builder ::setAggregations , (p , c ) -> p .mapOrdered (), AGGS );
171
- } else {
172
- parser .declareObject (Builder ::setParsedQuery , (p , c ) -> AbstractQueryBuilder .parseInnerQueryBuilder (p ), QUERY );
173
- parser .declareObject (Builder ::setParsedAggregations , (p , c ) -> AggregatorFactories .parseAggregators (p ), AGGREGATIONS );
174
- parser .declareObject (Builder ::setParsedAggregations , (p , c ) -> AggregatorFactories .parseAggregators (p ), AGGS );
175
- }
155
+ parser .declareObject ((builder , val ) -> builder .setQuery (val , ignoreUnknownFields ), (p , c ) -> p .mapOrdered (), QUERY );
156
+ parser .declareObject ((builder , val ) -> builder .setAggregationsSafe (val , ignoreUnknownFields ), (p , c ) -> p .mapOrdered (),
157
+ AGGREGATIONS );
158
+ parser .declareObject ((builder , val ) -> builder .setAggregationsSafe (val , ignoreUnknownFields ), (p , c ) -> p .mapOrdered (),
159
+ AGGS );
176
160
parser .declareObject (Builder ::setScriptFields , (p , c ) -> {
177
161
List <SearchSourceBuilder .ScriptField > parsedScriptFields = new ArrayList <>();
178
162
while (p .nextToken () != XContentParser .Token .END_OBJECT ) {
@@ -582,19 +566,15 @@ public static class Builder {
582
566
private TimeValue queryDelay ;
583
567
private TimeValue frequency ;
584
568
private List <String > indices = Collections .emptyList ();
585
- private Map <String , Object > query ;
569
+ private Map <String , Object > query = Collections . singletonMap ( MatchAllQueryBuilder . NAME , Collections . emptyMap ()) ;
586
570
private Map <String , Object > aggregations ;
587
571
private List <SearchSourceBuilder .ScriptField > scriptFields ;
588
572
private Integer scrollSize = DEFAULT_SCROLL_SIZE ;
589
573
private ChunkingConfig chunkingConfig ;
590
574
private Map <String , String > headers = Collections .emptyMap ();
591
575
private DelayedDataCheckConfig delayedDataCheckConfig = DelayedDataCheckConfig .defaultDelayedDataCheckConfig ();
592
576
593
- public Builder () {
594
- try {
595
- this .query = QUERY_TRANSFORMER .toMap (QueryBuilders .matchAllQuery ());
596
- } catch (IOException ex ) { /*Should never happen*/ }
597
- }
577
+ public Builder () { }
598
578
599
579
public Builder (String id , String jobId ) {
600
580
this ();
@@ -647,48 +627,74 @@ public void setFrequency(TimeValue frequency) {
647
627
this .frequency = frequency ;
648
628
}
649
629
650
- public void setParsedQuery (QueryBuilder query ) {
630
+ public void setQuery (Map <String , Object > query ) {
631
+ setQuery (query , true );
632
+ }
633
+
634
+ public void setQuery (Map <String , Object > query , boolean lenient ) {
635
+ this .query = ExceptionsHelper .requireNonNull (query , QUERY .getPreferredName ());
651
636
try {
652
- setQuery (QUERY_TRANSFORMER .toMap (ExceptionsHelper .requireNonNull (query , QUERY .getPreferredName ())));
653
- } catch (IOException | XContentParseException exception ) {
654
- if (exception .getCause () instanceof IllegalArgumentException ) {
655
- // Certain thrown exceptions wrap up the real Illegal argument making it hard to determine cause for the user
656
- throw ExceptionsHelper .badRequestException (
657
- Messages .getMessage (Messages .DATAFEED_CONFIG_QUERY_BAD_FORMAT ,
658
- id ,
659
- exception .getCause ().getMessage ()),
660
- exception .getCause ());
637
+ QUERY_TRANSFORMER .fromMap (query );
638
+ } catch (Exception ex ) {
639
+ String msg = Messages .getMessage (Messages .DATAFEED_CONFIG_QUERY_BAD_FORMAT , id );
640
+
641
+ if (ex .getCause () instanceof IllegalArgumentException ) {
642
+ ex = (Exception )ex .getCause ();
643
+ }
644
+
645
+ if (lenient ) {
646
+ logger .warn (msg , ex );
661
647
} else {
662
- throw ExceptionsHelper .badRequestException (
663
- Messages .getMessage (Messages .DATAFEED_CONFIG_QUERY_BAD_FORMAT , id , exception .getMessage ()), exception );
648
+ throw ExceptionsHelper .badRequestException (msg , ex );
664
649
}
665
650
}
666
651
}
667
652
668
- public void setQuery (Map <String , Object > query ) {
669
- this .query = ExceptionsHelper .requireNonNull (query , QUERY .getPreferredName ());
670
- }
671
-
653
+ // Kept for easier testing
672
654
public void setParsedAggregations (AggregatorFactories .Builder aggregations ) {
673
655
try {
674
656
setAggregations (AGG_TRANSFORMER .toMap (aggregations ));
675
- } catch (IOException | XContentParseException exception ) {
657
+ } catch (Exception exception ) {
676
658
// Certain thrown exceptions wrap up the real Illegal argument making it hard to determine cause for the user
677
659
if (exception .getCause () instanceof IllegalArgumentException ) {
678
- throw ExceptionsHelper .badRequestException (
679
- Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT ,
680
- id ,
681
- exception .getCause ().getMessage ()),
682
- exception .getCause ());
683
- } else {
684
- throw ExceptionsHelper .badRequestException (
685
- Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT , id , exception .getMessage ()), exception );
660
+ exception = (Exception )exception .getCause ();
686
661
}
662
+ throw ExceptionsHelper .badRequestException (
663
+ Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT , id ), exception );
687
664
}
688
665
}
689
666
667
+ private void setAggregationsSafe (Map <String , Object > aggregations , boolean lenient ) {
668
+ if (this .aggregations != null ) {
669
+ throw ExceptionsHelper .badRequestException ("Found two aggregation definitions: [aggs] and [aggregations]" );
670
+ }
671
+ setAggregations (aggregations , lenient );
672
+ }
673
+
690
674
void setAggregations (Map <String , Object > aggregations ) {
675
+ setAggregations (aggregations , true );
676
+ }
677
+
678
+ void setAggregations (Map <String , Object > aggregations , boolean lenient ) {
691
679
this .aggregations = aggregations ;
680
+ try {
681
+ if (aggregations != null && aggregations .isEmpty ()) {
682
+ throw new Exception ("[aggregations] are empty" );
683
+ }
684
+ AGG_TRANSFORMER .fromMap (aggregations );
685
+ } catch (Exception ex ) {
686
+ String msg = Messages .getMessage (Messages .DATAFEED_CONFIG_AGG_BAD_FORMAT , id );
687
+
688
+ if (ex .getCause () instanceof IllegalArgumentException ) {
689
+ ex = (Exception )ex .getCause ();
690
+ }
691
+
692
+ if (lenient ) {
693
+ logger .warn (msg , ex );
694
+ } else {
695
+ throw ExceptionsHelper .badRequestException (msg , ex );
696
+ }
697
+ }
692
698
}
693
699
694
700
public void setScriptFields (List <SearchSourceBuilder .ScriptField > scriptFields ) {
0 commit comments