[Ml Data Frame] Return bad_request on preview when config is invalid (#42447)

This commit is contained in:
David Kyle 2019-05-28 09:15:03 +01:00
parent c21745c8ab
commit aea600fe7d
2 changed files with 51 additions and 8 deletions

View File

@ -31,6 +31,7 @@ import org.elasticsearch.xpack.core.dataframe.action.PreviewDataFrameTransformAc
import org.elasticsearch.xpack.core.dataframe.transforms.DataFrameIndexerTransformStats;
import org.elasticsearch.xpack.core.dataframe.transforms.DataFrameTransformConfig;
import org.elasticsearch.xpack.core.dataframe.transforms.SourceConfig;
import org.elasticsearch.xpack.dataframe.transforms.pivot.AggregationResultUtils;
import org.elasticsearch.xpack.dataframe.transforms.pivot.Pivot;
import java.util.List;
@ -102,14 +103,21 @@ public class TransportPreviewDataFrameTransformAction extends
pivot.buildSearchRequest(source, null, NUMBER_OF_PREVIEW_BUCKETS),
ActionListener.wrap(
r -> {
final CompositeAggregation agg = r.getAggregations().get(COMPOSITE_AGGREGATION_NAME);
DataFrameIndexerTransformStats stats = DataFrameIndexerTransformStats.withDefaultTransformId();
// remove all internal fields
List<Map<String, Object>> results = pivot.extractResults(agg, deducedMappings, stats)
.peek(record -> {
record.keySet().removeIf(k -> k.startsWith("_"));
}).collect(Collectors.toList());
listener.onResponse(results);
try {
final CompositeAggregation agg = r.getAggregations().get(COMPOSITE_AGGREGATION_NAME);
DataFrameIndexerTransformStats stats = DataFrameIndexerTransformStats.withDefaultTransformId();
// remove all internal fields
List<Map<String, Object>> results = pivot.extractResults(agg, deducedMappings, stats)
.peek(record -> {
record.keySet().removeIf(k -> k.startsWith("_"));
}).collect(Collectors.toList());
listener.onResponse(results);
} catch (AggregationResultUtils.AggregationExtractionException extractionException) {
listener.onFailure(
new ElasticsearchStatusException(extractionException.getMessage(), RestStatus.BAD_REQUEST));
}
},
listener::onFailure
));

View File

@ -127,3 +127,38 @@ setup:
"aggs": {"avg_response": {"avg": {"field": "responsetime"}}}
}
}
---
"Test preview returns bad request with invalid agg":
- do:
catch: bad_request
data_frame.preview_data_frame_transform:
body: >
{
"source": { "index": "airline-data" },
"pivot": {
"group_by": {
"time": {"date_histogram": {"fixed_interval": "1h", "field": "time", "format": "yyyy-MM-DD HH"}}},
"aggs": {
"avg_response": {"avg": {"field": "responsetime"}},
"time.min": {"min": {"field": "time"}}
}
}
}
- do:
catch: /mixed object types of nested and non-nested fields \[time.min\]/
data_frame.preview_data_frame_transform:
body: >
{
"source": { "index": "airline-data" },
"pivot": {
"group_by": {
"time": {"date_histogram": {"fixed_interval": "1h", "field": "time", "format": "yyyy-MM-DD HH"}}},
"aggs": {
"avg_response": {"avg": {"field": "responsetime"}},
"time.min": {"min": {"field": "time"}}
}
}
}