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

View File

@ -127,3 +127,38 @@ setup:
"aggs": {"avg_response": {"avg": {"field": "responsetime"}}} "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"}}
}
}
}