Skip to content

Commit 1780ced

Browse files
authored
ML: changing JobResultsProvider.getForecastRequestStats to support > 1 index (#37157)
* ML: changing JobResultsProvider.getForecastRequestStats to support more than one index * moving to use idsQuery()
1 parent 9602d79 commit 1780ced

File tree

3 files changed

+16
-48
lines changed

3 files changed

+16
-48
lines changed

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeAutodetectIntegTestCase.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package org.elasticsearch.xpack.ml.integration;
77

88
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
9-
import org.elasticsearch.action.get.GetResponse;
109
import org.elasticsearch.action.search.SearchResponse;
1110
import org.elasticsearch.action.support.master.AcknowledgedResponse;
1211
import org.elasticsearch.client.Client;
@@ -348,17 +347,19 @@ protected void waitForecastToFinish(String jobId, String forecastId) throws Exce
348347
}
349348

350349
protected ForecastRequestStats getForecastStats(String jobId, String forecastId) {
351-
GetResponse getResponse = client().prepareGet()
352-
.setIndex(AnomalyDetectorsIndex.jobResultsAliasedName(jobId))
353-
.setId(ForecastRequestStats.documentId(jobId, forecastId))
354-
.execute().actionGet();
350+
SearchResponse searchResponse = client().prepareSearch(AnomalyDetectorsIndex.jobResultsAliasedName(jobId))
351+
.setQuery(QueryBuilders.idsQuery().addIds(ForecastRequestStats.documentId(jobId, forecastId)))
352+
.get();
355353

356-
if (getResponse.isExists() == false) {
354+
if (searchResponse.getHits().getHits().length == 0) {
357355
return null;
358356
}
357+
358+
assertThat(searchResponse.getHits().getHits().length, equalTo(1));
359+
359360
try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(
360361
NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION,
361-
getResponse.getSourceAsBytesRef().streamInput())) {
362+
searchResponse.getHits().getHits()[0].getSourceRef().streamInput())) {
362363
return ForecastRequestStats.STRICT_PARSER.apply(parser, null);
363364
} catch (IOException e) {
364365
throw new IllegalStateException(e);
@@ -398,7 +399,6 @@ protected long countForecastDocs(String jobId, String forecastId) {
398399

399400
protected List<Forecast> getForecasts(String jobId, ForecastRequestStats forecastRequestStats) {
400401
List<Forecast> forecasts = new ArrayList<>();
401-
402402
SearchResponse searchResponse = client().prepareSearch(AnomalyDetectorsIndex.jobResultsIndexPrefix() + "*")
403403
.setSize((int) forecastRequestStats.getRecordCount())
404404
.setQuery(QueryBuilders.boolQuery()

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -490,20 +490,6 @@ private <T, U> T parseSearchHit(SearchHit hit, BiFunction<XContentParser, U, T>
490490
}
491491
}
492492

493-
private <T, U> T parseGetHit(GetResponse getResponse, BiFunction<XContentParser, U, T> objectParser,
494-
Consumer<Exception> errorHandler) {
495-
BytesReference source = getResponse.getSourceAsBytesRef();
496-
497-
try (InputStream stream = source.streamInput();
498-
XContentParser parser = XContentFactory.xContent(XContentType.JSON)
499-
.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)) {
500-
return objectParser.apply(parser, null);
501-
} catch (IOException e) {
502-
errorHandler.accept(new ElasticsearchParseException("failed to parse " + getResponse.getType(), e));
503-
return null;
504-
}
505-
}
506-
507493
/**
508494
* Search for buckets with the parameters in the {@link BucketsQueryBuilder}
509495
* Uses the internal client, so runs as the _xpack user
@@ -957,19 +943,6 @@ private <U, T> void searchSingleResult(String jobId, String resultDescription, S
957943
), client::search);
958944
}
959945

960-
private <U, T> void getResult(String jobId, String resultDescription, GetRequest get, BiFunction<XContentParser, U, T> objectParser,
961-
Consumer<Result<T>> handler, Consumer<Exception> errorHandler, Supplier<T> notFoundSupplier) {
962-
963-
executeAsyncWithOrigin(client.threadPool().getThreadContext(), ML_ORIGIN, get, ActionListener.<GetResponse>wrap(getDocResponse -> {
964-
if (getDocResponse.isExists()) {
965-
handler.accept(new Result<>(getDocResponse.getIndex(), parseGetHit(getDocResponse, objectParser, errorHandler)));
966-
} else {
967-
LOGGER.trace("No {} for job with id {}", resultDescription, jobId);
968-
handler.accept(new Result<>(null, notFoundSupplier.get()));
969-
}
970-
}, errorHandler), client::get);
971-
}
972-
973946
private SearchRequestBuilder createLatestModelSizeStatsSearch(String indexName) {
974947
return client.prepareSearch(indexName)
975948
.setSize(1)
@@ -1115,11 +1088,14 @@ public void scheduledEvents(ScheduledEventsQueryBuilder query, ActionListener<Qu
11151088
public void getForecastRequestStats(String jobId, String forecastId, Consumer<ForecastRequestStats> handler,
11161089
Consumer<Exception> errorHandler) {
11171090
String indexName = AnomalyDetectorsIndex.jobResultsAliasedName(jobId);
1118-
GetRequest getRequest = new GetRequest(indexName, ElasticsearchMappings.DOC_TYPE,
1119-
ForecastRequestStats.documentId(jobId, forecastId));
1120-
1121-
getResult(jobId, ForecastRequestStats.RESULTS_FIELD.getPreferredName(), getRequest, ForecastRequestStats.LENIENT_PARSER,
1122-
result -> handler.accept(result.result), errorHandler, () -> null);
1091+
SearchRequestBuilder forecastSearch = client.prepareSearch(indexName)
1092+
.setQuery(QueryBuilders.idsQuery().addIds(ForecastRequestStats.documentId(jobId, forecastId)));
1093+
1094+
searchSingleResult(jobId,
1095+
ForecastRequestStats.RESULTS_FIELD.getPreferredName(),
1096+
forecastSearch,
1097+
ForecastRequestStats.LENIENT_PARSER,result -> handler.accept(result.result),
1098+
errorHandler, () -> null);
11231099
}
11241100

11251101
public void getForecastStats(String jobId, Consumer<ForecastStats> handler, Consumer<Exception> errorHandler) {

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.elasticsearch.action.ActionListener;
1212
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
1313
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse;
14-
import org.elasticsearch.action.get.GetResponse;
1514
import org.elasticsearch.action.search.MultiSearchRequest;
1615
import org.elasticsearch.action.search.MultiSearchResponse;
1716
import org.elasticsearch.action.search.SearchRequest;
@@ -834,13 +833,6 @@ private JobResultsProvider createProvider(Client client) {
834833
return new JobResultsProvider(client, Settings.EMPTY);
835834
}
836835

837-
private static GetResponse createGetResponse(boolean exists, Map<String, Object> source) throws IOException {
838-
GetResponse getResponse = mock(GetResponse.class);
839-
when(getResponse.isExists()).thenReturn(exists);
840-
when(getResponse.getSourceAsBytesRef()).thenReturn(BytesReference.bytes(XContentFactory.jsonBuilder().map(source)));
841-
return getResponse;
842-
}
843-
844836
private static SearchResponse createSearchResponse(List<Map<String, Object>> source) throws IOException {
845837
SearchResponse response = mock(SearchResponse.class);
846838
List<SearchHit> list = new ArrayList<>();

0 commit comments

Comments
 (0)