Skip to content

Commit 578c05e

Browse files
authored
[Ml Data Frame] Return bad_request on preview when config is invalid (#42447)
1 parent 7209f97 commit 578c05e

File tree

2 files changed

+59
-8
lines changed

2 files changed

+59
-8
lines changed

x-pack/plugin/data-frame/src/main/java/org/elasticsearch/xpack/dataframe/action/TransportPreviewDataFrameTransformAction.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.elasticsearch.xpack.core.dataframe.transforms.DataFrameIndexerTransformStats;
3232
import org.elasticsearch.xpack.core.dataframe.transforms.DataFrameTransformConfig;
3333
import org.elasticsearch.xpack.core.dataframe.transforms.SourceConfig;
34+
import org.elasticsearch.xpack.dataframe.transforms.pivot.AggregationResultUtils;
3435
import org.elasticsearch.xpack.dataframe.transforms.pivot.Pivot;
3536

3637
import java.util.List;
@@ -102,14 +103,21 @@ private void getPreview(Pivot pivot, SourceConfig source, ActionListener<List<Ma
102103
pivot.buildSearchRequest(source, null, NUMBER_OF_PREVIEW_BUCKETS),
103104
ActionListener.wrap(
104105
r -> {
105-
final CompositeAggregation agg = r.getAggregations().get(COMPOSITE_AGGREGATION_NAME);
106-
DataFrameIndexerTransformStats stats = DataFrameIndexerTransformStats.withDefaultTransformId();
107-
// remove all internal fields
108-
List<Map<String, Object>> results = pivot.extractResults(agg, deducedMappings, stats)
109-
.peek(record -> {
110-
record.keySet().removeIf(k -> k.startsWith("_"));
111-
}).collect(Collectors.toList());
112-
listener.onResponse(results);
106+
107+
try {
108+
final CompositeAggregation agg = r.getAggregations().get(COMPOSITE_AGGREGATION_NAME);
109+
DataFrameIndexerTransformStats stats = DataFrameIndexerTransformStats.withDefaultTransformId();
110+
// remove all internal fields
111+
List<Map<String, Object>> results = pivot.extractResults(agg, deducedMappings, stats)
112+
.peek(record -> {
113+
record.keySet().removeIf(k -> k.startsWith("_"));
114+
}).collect(Collectors.toList());
115+
116+
listener.onResponse(results);
117+
} catch (AggregationResultUtils.AggregationExtractionException extractionException) {
118+
listener.onFailure(
119+
new ElasticsearchStatusException(extractionException.getMessage(), RestStatus.BAD_REQUEST));
120+
}
113121
},
114122
listener::onFailure
115123
));

x-pack/plugin/src/test/resources/rest-api-spec/test/data_frame/preview_transforms.yml

+43
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,46 @@ setup:
127127
"aggs": {"avg_response": {"avg": {"field": "responsetime"}}}
128128
}
129129
}
130+
131+
---
132+
"Test preview returns bad request with invalid agg":
133+
- skip:
134+
reason: date histo interval is deprecated
135+
features: "warnings"
136+
137+
- do:
138+
warnings:
139+
- "[interval] on [date_histogram] is deprecated, use [fixed_interval] or [calendar_interval] in the future."
140+
catch: bad_request
141+
data_frame.preview_data_frame_transform:
142+
body: >
143+
{
144+
"source": { "index": "airline-data" },
145+
"pivot": {
146+
"group_by": {
147+
"time": {"date_histogram": {"interval": "1h", "field": "time", "format": "yyyy-MM-DD HH"}}},
148+
"aggs": {
149+
"avg_response": {"avg": {"field": "responsetime"}},
150+
"time.min": {"min": {"field": "time"}}
151+
}
152+
}
153+
}
154+
155+
- do:
156+
warnings:
157+
- "[interval] on [date_histogram] is deprecated, use [fixed_interval] or [calendar_interval] in the future."
158+
catch: /mixed object types of nested and non-nested fields \[time.min\]/
159+
data_frame.preview_data_frame_transform:
160+
body: >
161+
{
162+
"source": { "index": "airline-data" },
163+
"pivot": {
164+
"group_by": {
165+
"time": {"date_histogram": {"interval": "1h", "field": "time", "format": "yyyy-MM-DD HH"}}},
166+
"aggs": {
167+
"avg_response": {"avg": {"field": "responsetime"}},
168+
"time.min": {"min": {"field": "time"}}
169+
}
170+
}
171+
}
172+

0 commit comments

Comments
 (0)