From 570b57af22387958bb0b2cdad0408094ca318ae8 Mon Sep 17 00:00:00 2001 From: Benjamin Trent Date: Thu, 25 Oct 2018 15:30:35 -0500 Subject: [PATCH 1/4] HLRC: Adding Update datafeed API --- .../client/MLRequestConverters.java | 14 +++ .../client/MachineLearningClient.java | 41 ++++++++ .../client/ml/UpdateDatafeedRequest.java | 80 +++++++++++++++ .../client/ml/datafeed/DatafeedUpdate.java | 5 + .../client/MachineLearningIT.java | 30 ++++++ .../MlClientDocumentationIT.java | 97 +++++++++++++++++++ .../client/ml/UpdateDatafeedRequestTests.java | 43 ++++++++ .../ml/datafeed/DatafeedUpdateTests.java | 8 +- .../high-level/ml/update-datafeed.asciidoc | 95 ++++++++++++++++++ .../high-level/supported-apis.asciidoc | 2 + 10 files changed, 413 insertions(+), 2 deletions(-) create mode 100644 client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java create mode 100644 client/rest-high-level/src/test/java/org/elasticsearch/client/ml/UpdateDatafeedRequestTests.java create mode 100644 docs/java-rest/high-level/ml/update-datafeed.asciidoc diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java index 6a242b65a7312..d9d216c52d990 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java @@ -52,6 +52,7 @@ import org.elasticsearch.client.ml.PutJobRequest; import org.elasticsearch.client.ml.StartDatafeedRequest; import org.elasticsearch.client.ml.StopDatafeedRequest; +import org.elasticsearch.client.ml.UpdateDatafeedRequest; import org.elasticsearch.client.ml.UpdateJobRequest; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; @@ -209,6 +210,19 @@ static Request putDatafeed(PutDatafeedRequest putDatafeedRequest) throws IOExcep return request; } + static Request updateDatafeed(UpdateDatafeedRequest updateDatafeedRequest) throws IOException { + String endpoint = new EndpointBuilder() + .addPathPart("").addPathPartAsIs("_xpack") + .addPathPartAsIs("ml") + .addPathPartAsIs("datafeeds") + .addPathPart(updateDatafeedRequest.getDatafeedUpdate().getId()) + .addPathPartAsIs("_update") + .build(); + Request request = new Request(HttpPost.METHOD_NAME, endpoint); + request.setEntity(createEntity(updateDatafeedRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; + } + static Request getDatafeed(GetDatafeedRequest getDatafeedRequest) { String endpoint = new EndpointBuilder() .addPathPartAsIs("_xpack") diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java index 8c442d8ffa646..a7c15716e00e1 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java @@ -67,6 +67,7 @@ import org.elasticsearch.client.ml.StartDatafeedResponse; import org.elasticsearch.client.ml.StopDatafeedRequest; import org.elasticsearch.client.ml.StopDatafeedResponse; +import org.elasticsearch.client.ml.UpdateDatafeedRequest; import org.elasticsearch.client.ml.UpdateJobRequest; import org.elasticsearch.client.ml.job.stats.JobStats; @@ -494,6 +495,46 @@ public void putDatafeedAsync(PutDatafeedRequest request, RequestOptions options, Collections.emptySet()); } + /** + * Updated a Machine Learning Datafeed + *

+ * For additional info + * see + * ML Update datafeed documentation + * + * @param request The UpdateDatafeedRequest containing the {@link org.elasticsearch.client.ml.datafeed.DatafeedUpdate} settings + * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @return PutDatafeedResponse with enclosed, updated {@link org.elasticsearch.client.ml.datafeed.DatafeedConfig} object + * @throws IOException when there is a serialization issue sending the request or receiving the response + */ + public PutDatafeedResponse updateDatafeed(UpdateDatafeedRequest request, RequestOptions options) throws IOException { + return restHighLevelClient.performRequestAndParseEntity(request, + MLRequestConverters::updateDatafeed, + options, + PutDatafeedResponse::fromXContent, + Collections.emptySet()); + } + + /** + * Updates a Machine Learning Datafeed asynchronously and notifies listener on completion + *

+ * For additional info + * see + * ML Update datafeed documentation + * + * @param request The request containing the {@link org.elasticsearch.client.ml.datafeed.DatafeedUpdate} settings + * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @param listener Listener to be notified upon request completion + */ + public void updateDatafeedAsync(UpdateDatafeedRequest request, RequestOptions options, ActionListener listener) { + restHighLevelClient.performRequestAsyncAndParseEntity(request, + MLRequestConverters::updateDatafeed, + options, + PutDatafeedResponse::fromXContent, + listener, + Collections.emptySet()); + } + /** * Gets one or more Machine Learning datafeed configuration info. * diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java new file mode 100644 index 0000000000000..3c0cd76ece0ee --- /dev/null +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java @@ -0,0 +1,80 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.elasticsearch.client.ml; + +import org.elasticsearch.action.ActionRequest; +import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.client.ml.datafeed.DatafeedUpdate; +import org.elasticsearch.common.Strings; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Objects; + +/** + * Updates a {@link org.elasticsearch.client.ml.datafeed.DatafeedConfig} with the passed {@link DatafeedUpdate} + * settings + */ +public class UpdateDatafeedRequest extends ActionRequest implements ToXContentObject { + + private final DatafeedUpdate update; + + public UpdateDatafeedRequest(DatafeedUpdate update) { + this.update = update; + } + + public DatafeedUpdate getDatafeedUpdate() { + return update; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + return update.toXContent(builder, params); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + UpdateDatafeedRequest that = (UpdateDatafeedRequest) o; + return Objects.equals(update, that.update); + } + + @Override + public int hashCode() { + return Objects.hash(update); + } + + @Override + public final String toString() { + return Strings.toString(this); + } + + @Override + public ActionRequestValidationException validate() { + return null; + } +} diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java index 1e59ea067ca7b..119f70fc79756 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdate.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -292,6 +293,10 @@ public Builder setIndices(List indices) { return this; } + public Builder setIndices(String... indices) { + return setIndices(Arrays.asList(indices)); + } + public Builder setTypes(List types) { this.types = types; return this; diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java index cac9f533501b5..89d21ad2e047b 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java @@ -58,18 +58,21 @@ import org.elasticsearch.client.ml.PutCalendarResponse; import org.elasticsearch.client.ml.PutDatafeedRequest; import org.elasticsearch.client.ml.PutDatafeedResponse; +import org.elasticsearch.client.ml.PutDatafeedResponseTests; import org.elasticsearch.client.ml.PutJobRequest; import org.elasticsearch.client.ml.PutJobResponse; import org.elasticsearch.client.ml.StartDatafeedRequest; import org.elasticsearch.client.ml.StartDatafeedResponse; import org.elasticsearch.client.ml.StopDatafeedRequest; import org.elasticsearch.client.ml.StopDatafeedResponse; +import org.elasticsearch.client.ml.UpdateDatafeedRequest; import org.elasticsearch.client.ml.UpdateJobRequest; import org.elasticsearch.client.ml.calendars.Calendar; import org.elasticsearch.client.ml.calendars.CalendarTests; import org.elasticsearch.client.ml.datafeed.DatafeedConfig; import org.elasticsearch.client.ml.datafeed.DatafeedState; import org.elasticsearch.client.ml.datafeed.DatafeedStats; +import org.elasticsearch.client.ml.datafeed.DatafeedUpdate; import org.elasticsearch.client.ml.job.config.AnalysisConfig; import org.elasticsearch.client.ml.job.config.DataDescription; import org.elasticsearch.client.ml.job.config.Detector; @@ -357,6 +360,33 @@ public void testPutDatafeed() throws Exception { assertThat(createdDatafeed.getIndices(), equalTo(datafeedConfig.getIndices())); } + public void testUpdateDatafeed() throws Exception { + String jobId = randomValidJobId(); + Job job = buildJob(jobId); + MachineLearningClient machineLearningClient = highLevelClient().machineLearning(); + execute(new PutJobRequest(job), machineLearningClient::putJob, machineLearningClient::putJobAsync); + + String datafeedId = "datafeed-" + jobId; + DatafeedConfig datafeedConfig = DatafeedConfig.builder(datafeedId, jobId).setIndices("some_data_index").build(); + + PutDatafeedResponse response = machineLearningClient.putDatafeed(new PutDatafeedRequest(datafeedConfig), RequestOptions.DEFAULT); + + DatafeedConfig createdDatafeed = response.getResponse(); + assertThat(createdDatafeed.getId(), equalTo(datafeedId)); + assertThat(createdDatafeed.getIndices(), equalTo(datafeedConfig.getIndices())); + + DatafeedUpdate datafeedUpdate = DatafeedUpdate.builder(datafeedId).setIndices("some_other_data_index").setScrollSize(10).build(); + + response = execute(new UpdateDatafeedRequest(datafeedUpdate), + machineLearningClient::updateDatafeed, + machineLearningClient::updateDatafeedAsync); + + DatafeedConfig updatedDatafeed= response.getResponse(); + assertThat(datafeedUpdate.getId(), equalTo(updatedDatafeed.getId())); + assertThat(datafeedUpdate.getIndices(), equalTo(updatedDatafeed.getIndices())); + assertThat(datafeedUpdate.getScrollSize(), equalTo(updatedDatafeed.getScrollSize())); + } + public void testGetDatafeed() throws Exception { String jobId1 = "test-get-datafeed-job-1"; String jobId2 = "test-get-datafeed-job-2"; diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java index e8383b9ba7441..555c06ca7eb43 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java @@ -80,11 +80,13 @@ import org.elasticsearch.client.ml.StartDatafeedResponse; import org.elasticsearch.client.ml.StopDatafeedRequest; import org.elasticsearch.client.ml.StopDatafeedResponse; +import org.elasticsearch.client.ml.UpdateDatafeedRequest; import org.elasticsearch.client.ml.UpdateJobRequest; import org.elasticsearch.client.ml.calendars.Calendar; import org.elasticsearch.client.ml.datafeed.ChunkingConfig; import org.elasticsearch.client.ml.datafeed.DatafeedConfig; import org.elasticsearch.client.ml.datafeed.DatafeedStats; +import org.elasticsearch.client.ml.datafeed.DatafeedUpdate; import org.elasticsearch.client.ml.job.config.AnalysisConfig; import org.elasticsearch.client.ml.job.config.AnalysisLimits; import org.elasticsearch.client.ml.job.config.DataDescription; @@ -630,6 +632,101 @@ public void onFailure(Exception e) { } } + public void testUpdateDatafeed() throws Exception { + RestHighLevelClient client = highLevelClient(); + + Job job = MachineLearningIT.buildJob("update-datafeed-job"); + client.machineLearning().putJob(new PutJobRequest(job), RequestOptions.DEFAULT); + String datafeedId = job.getId() + "-feed"; + DatafeedConfig datafeed = DatafeedConfig.builder(datafeedId, job.getId()).setIndices("foo").build(); + client.machineLearning().putDatafeed(new PutDatafeedRequest(datafeed), RequestOptions.DEFAULT); + + { + // tag::update-datafeed-config + DatafeedUpdate.Builder datafeedUpdateBuilder = new DatafeedUpdate.Builder(datafeedId); // <1> + // end::update-datafeed-config + + AggregatorFactories.Builder aggs = AggregatorFactories.builder(); + + // tag::update-datafeed-config-set-aggregations + datafeedUpdateBuilder.setAggregations(aggs); // <1> + // end::update-datafeed-config-set-aggregations + + // tag::update-datafeed-config-set-indices + datafeedUpdateBuilder.setIndices("index_1", "index_2"); // <1> + // end::update-datafeed-config-set-indices + + // Clearing aggregation to avoid complex validation rules + datafeedUpdateBuilder.setAggregations((String) null); + + // tag::update-datafeed-config-set-chunking-config + datafeedUpdateBuilder.setChunkingConfig(ChunkingConfig.newAuto()); // <1> + // end::update-datafeed-config-set-chunking-config + + // tag::update-datafeed-config-set-frequency + datafeedUpdateBuilder.setFrequency(TimeValue.timeValueSeconds(30)); // <1> + // end::update-datafeed-config-set-frequency + + // tag::update-datafeed-config-set-query + datafeedUpdateBuilder.setQuery(QueryBuilders.matchAllQuery()); // <1> + // end::update-datafeed-config-set-query + + // tag::update-datafeed-config-set-query-delay + datafeedUpdateBuilder.setQueryDelay(TimeValue.timeValueMinutes(1)); // <1> + // end::update-datafeed-config-set-query-delay + + List scriptFields = Collections.emptyList(); + // tag::update-datafeed-config-set-script-fields + datafeedUpdateBuilder.setScriptFields(scriptFields); // <1> + // end::update-datafeed-config-set-script-fields + + // tag::update-datafeed-config-set-scroll-size + datafeedUpdateBuilder.setScrollSize(1000); // <1> + // end::update-datafeed-config-set-scroll-size + + // tag::update-datafeed-request + UpdateDatafeedRequest request = new UpdateDatafeedRequest(datafeedUpdateBuilder.build()); // <1> + // end::update-datafeed-request + + // tag::update-datafeed-execute + PutDatafeedResponse response = client.machineLearning().updateDatafeed(request, RequestOptions.DEFAULT); + // end::update-datafeed-execute + + // tag::update-datafeed-response + DatafeedConfig updatedDatafeed = response.getResponse(); // <1> + // end::update-datafeed-response + assertThat(updatedDatafeed.getId(), equalTo(datafeedId)); + } + { + DatafeedUpdate datafeedUpdate = new DatafeedUpdate.Builder(datafeedId).setIndices("index_1", "index_2").build(); + + UpdateDatafeedRequest request = new UpdateDatafeedRequest(datafeedUpdate); + // tag::update-datafeed-execute-listener + ActionListener listener = new ActionListener() { + @Override + public void onResponse(PutDatafeedResponse response) { + // <1> + } + + @Override + public void onFailure(Exception e) { + // <2> + } + }; + // end::update-datafeed-execute-listener + + // Replace the empty listener by a blocking listener in test + final CountDownLatch latch = new CountDownLatch(1); + listener = new LatchedActionListener<>(listener, latch); + + // tag::update-datafeed-execute-async + client.machineLearning().updateDatafeedAsync(request, RequestOptions.DEFAULT, listener); // <1> + // end::update-datafeed-execute-async + + assertTrue(latch.await(30L, TimeUnit.SECONDS)); + } + } + public void testGetDatafeed() throws Exception { RestHighLevelClient client = highLevelClient(); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/UpdateDatafeedRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/UpdateDatafeedRequestTests.java new file mode 100644 index 0000000000000..9c0d87661a973 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/UpdateDatafeedRequestTests.java @@ -0,0 +1,43 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.elasticsearch.client.ml; + +import org.elasticsearch.client.ml.datafeed.DatafeedUpdate; +import org.elasticsearch.client.ml.datafeed.DatafeedUpdateTests; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.test.AbstractXContentTestCase; + + +public class UpdateDatafeedRequestTests extends AbstractXContentTestCase { + + @Override + protected UpdateDatafeedRequest createTestInstance() { + return new UpdateDatafeedRequest(DatafeedUpdateTests.createRandom()); + } + + @Override + protected UpdateDatafeedRequest doParseInstance(XContentParser parser) { + return new UpdateDatafeedRequest(DatafeedUpdate.PARSER.apply(parser, null).build()); + } + + @Override + protected boolean supportsUnknownFields() { + return false; + } +} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java index 1c3723fd0a631..1f1675a330e1b 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ml/datafeed/DatafeedUpdateTests.java @@ -32,8 +32,7 @@ public class DatafeedUpdateTests extends AbstractXContentTestCase { - @Override - protected DatafeedUpdate createTestInstance() { + public static DatafeedUpdate createRandom() { DatafeedUpdate.Builder builder = new DatafeedUpdate.Builder(DatafeedConfigTests.randomValidDatafeedId()); if (randomBoolean()) { builder.setJobId(randomAlphaOfLength(10)); @@ -87,6 +86,11 @@ protected DatafeedUpdate createTestInstance() { return builder.build(); } + @Override + protected DatafeedUpdate createTestInstance() { + return createRandom(); + } + @Override protected DatafeedUpdate doParseInstance(XContentParser parser) { return DatafeedUpdate.PARSER.apply(parser, null).build(); diff --git a/docs/java-rest/high-level/ml/update-datafeed.asciidoc b/docs/java-rest/high-level/ml/update-datafeed.asciidoc new file mode 100644 index 0000000000000..ddca23072aba7 --- /dev/null +++ b/docs/java-rest/high-level/ml/update-datafeed.asciidoc @@ -0,0 +1,95 @@ +-- +:api: update-datafeed +:request: UpdateDatafeedRequest +:response: PutDatafeedResponse +-- +[id="{upid}-{api}"] +=== Update Datafeed API + +The Update Datafeed API can be used to update a {ml} datafeed +in the cluster. The API accepts a +{request}+ object +as a request and returns a +{response}+. + +[id="{upid}-{api}-request"] +==== Update Datafeed Request + +A +{request}+ requires the following argument: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-request] +-------------------------------------------------- +<1> The updated configuration of the {ml} datafeed + +[id="{upid}-{api}-config"] +==== Updated Datafeed Configuration + +The `DatafeedUpdate` object contains the updated +settings for the {ml} datafeed configuration. + +A `DatafeedUpdate` requires the following argument(s): + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config] +-------------------------------------------------- +<1> The datafeed ID + +==== Optional Arguments +The following arguments are optional: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-indices] +-------------------------------------------------- +<1> The indices that contain the data to retrieve and feed into the job + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-chunking-config] +-------------------------------------------------- +<1> Specifies how data searches are split into time chunks. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-frequency] +-------------------------------------------------- +<1> The interval at which scheduled queries are made while the datafeed runs in real time. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-query] +-------------------------------------------------- +<1> A query to filter the search results by. Defaults to the `match_all` query. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-query-delay] +-------------------------------------------------- +<1> The time interval behind real time that data is queried. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-script-fields] +-------------------------------------------------- +<1> Allows the use of script fields. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-config-set-scroll-size] +-------------------------------------------------- +<1> The `size` parameter used in the searches. + +include::../execution.asciidoc[] + +[id="{upid}-{api}-response"] +==== Response + +The returned +{response}+ returns the full representation of +the updated {ml} datafeed if it has been successfully updated. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-response] +-------------------------------------------------- +<1> The updated datafeed diff --git a/docs/java-rest/high-level/supported-apis.asciidoc b/docs/java-rest/high-level/supported-apis.asciidoc index c8d16954abe2a..e1c84d56ea688 100644 --- a/docs/java-rest/high-level/supported-apis.asciidoc +++ b/docs/java-rest/high-level/supported-apis.asciidoc @@ -240,6 +240,7 @@ The Java High Level REST Client supports the following Machine Learning APIs: * <<{upid}-update-job>> * <<{upid}-get-job-stats>> * <<{upid}-put-datafeed>> +* <<{upid}-update-datafeed>> * <<{upid}-get-datafeed>> * <<{upid}-delete-datafeed>> * <<{upid}-preview-datafeed>> @@ -266,6 +267,7 @@ include::ml/close-job.asciidoc[] include::ml/update-job.asciidoc[] include::ml/flush-job.asciidoc[] include::ml/put-datafeed.asciidoc[] +include::ml/update-datafeed.asciidoc[] include::ml/get-datafeed.asciidoc[] include::ml/delete-datafeed.asciidoc[] include::ml/preview-datafeed.asciidoc[] From 7377587940478005eb51fa1a6c07c1cbfa4de000 Mon Sep 17 00:00:00 2001 From: Benjamin Trent Date: Fri, 26 Oct 2018 10:08:58 -0500 Subject: [PATCH 2/4] Addressing unused import --- .../test/java/org/elasticsearch/client/MachineLearningIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java index 89d21ad2e047b..9e3afd93e60b5 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java @@ -58,7 +58,6 @@ import org.elasticsearch.client.ml.PutCalendarResponse; import org.elasticsearch.client.ml.PutDatafeedRequest; import org.elasticsearch.client.ml.PutDatafeedResponse; -import org.elasticsearch.client.ml.PutDatafeedResponseTests; import org.elasticsearch.client.ml.PutJobRequest; import org.elasticsearch.client.ml.PutJobResponse; import org.elasticsearch.client.ml.StartDatafeedRequest; From 33f089c48c1057aebd98b6169d5c9f1ce00beab0 Mon Sep 17 00:00:00 2001 From: Benjamin Trent Date: Fri, 26 Oct 2018 11:10:38 -0500 Subject: [PATCH 3/4] Adjusting docs and fixing minor comments --- .../client/MLRequestConverters.java | 2 +- .../client/MachineLearningClient.java | 2 +- .../client/ml/UpdateDatafeedRequest.java | 2 +- .../client/MachineLearningIT.java | 2 +- .../MlClientDocumentationIT.java | 48 ++++---------- .../high-level/ml/update-datafeed.asciidoc | 65 ++++--------------- 6 files changed, 30 insertions(+), 91 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java index d9d216c52d990..69b1c4a91e087 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java @@ -212,7 +212,7 @@ static Request putDatafeed(PutDatafeedRequest putDatafeedRequest) throws IOExcep static Request updateDatafeed(UpdateDatafeedRequest updateDatafeedRequest) throws IOException { String endpoint = new EndpointBuilder() - .addPathPart("").addPathPartAsIs("_xpack") + .addPathPartAsIs("_xpack") .addPathPartAsIs("ml") .addPathPartAsIs("datafeeds") .addPathPart(updateDatafeedRequest.getDatafeedUpdate().getId()) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java index a7c15716e00e1..0b7647b7d579f 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java @@ -496,7 +496,7 @@ public void putDatafeedAsync(PutDatafeedRequest request, RequestOptions options, } /** - * Updated a Machine Learning Datafeed + * Updates a Machine Learning Datafeed *

* For additional info * see diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java index 3c0cd76ece0ee..84fd171b21c93 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java @@ -29,7 +29,7 @@ import java.util.Objects; /** - * Updates a {@link org.elasticsearch.client.ml.datafeed.DatafeedConfig} with the passed {@link DatafeedUpdate} + * Requests an updates to a {@link org.elasticsearch.client.ml.datafeed.DatafeedConfig} with the passed {@link DatafeedUpdate} * settings */ public class UpdateDatafeedRequest extends ActionRequest implements ToXContentObject { diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java index 9e3afd93e60b5..951e6209d6b8c 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java @@ -380,7 +380,7 @@ public void testUpdateDatafeed() throws Exception { machineLearningClient::updateDatafeed, machineLearningClient::updateDatafeedAsync); - DatafeedConfig updatedDatafeed= response.getResponse(); + DatafeedConfig updatedDatafeed = response.getResponse(); assertThat(datafeedUpdate.getId(), equalTo(updatedDatafeed.getId())); assertThat(datafeedUpdate.getIndices(), equalTo(updatedDatafeed.getIndices())); assertThat(datafeedUpdate.getScrollSize(), equalTo(updatedDatafeed.getScrollSize())); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java index 555c06ca7eb43..cf6a9622c0c72 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java @@ -642,48 +642,24 @@ public void testUpdateDatafeed() throws Exception { client.machineLearning().putDatafeed(new PutDatafeedRequest(datafeed), RequestOptions.DEFAULT); { + AggregatorFactories.Builder aggs = AggregatorFactories.builder(); + List scriptFields = Collections.emptyList(); // tag::update-datafeed-config - DatafeedUpdate.Builder datafeedUpdateBuilder = new DatafeedUpdate.Builder(datafeedId); // <1> + DatafeedUpdate.Builder datafeedUpdateBuilder = new DatafeedUpdate.Builder(datafeedId) // <1> + .setAggregations(aggs) // <2> + .setIndices("index_1", "index_2") // <3> + .setChunkingConfig(ChunkingConfig.newAuto()) // <4> + .setFrequency(TimeValue.timeValueSeconds(30)) // <5> + .setQuery(QueryBuilders.matchAllQuery()) // <6> + .setQueryDelay(TimeValue.timeValueMinutes(1)) // <7> + .setScriptFields(scriptFields) // <8> + .setScrollSize(1000) // <9> + .setJobId("update-datafeed-job"); // <10> // end::update-datafeed-config - AggregatorFactories.Builder aggs = AggregatorFactories.builder(); - - // tag::update-datafeed-config-set-aggregations - datafeedUpdateBuilder.setAggregations(aggs); // <1> - // end::update-datafeed-config-set-aggregations - - // tag::update-datafeed-config-set-indices - datafeedUpdateBuilder.setIndices("index_1", "index_2"); // <1> - // end::update-datafeed-config-set-indices - // Clearing aggregation to avoid complex validation rules datafeedUpdateBuilder.setAggregations((String) null); - // tag::update-datafeed-config-set-chunking-config - datafeedUpdateBuilder.setChunkingConfig(ChunkingConfig.newAuto()); // <1> - // end::update-datafeed-config-set-chunking-config - - // tag::update-datafeed-config-set-frequency - datafeedUpdateBuilder.setFrequency(TimeValue.timeValueSeconds(30)); // <1> - // end::update-datafeed-config-set-frequency - - // tag::update-datafeed-config-set-query - datafeedUpdateBuilder.setQuery(QueryBuilders.matchAllQuery()); // <1> - // end::update-datafeed-config-set-query - - // tag::update-datafeed-config-set-query-delay - datafeedUpdateBuilder.setQueryDelay(TimeValue.timeValueMinutes(1)); // <1> - // end::update-datafeed-config-set-query-delay - - List scriptFields = Collections.emptyList(); - // tag::update-datafeed-config-set-script-fields - datafeedUpdateBuilder.setScriptFields(scriptFields); // <1> - // end::update-datafeed-config-set-script-fields - - // tag::update-datafeed-config-set-scroll-size - datafeedUpdateBuilder.setScrollSize(1000); // <1> - // end::update-datafeed-config-set-scroll-size - // tag::update-datafeed-request UpdateDatafeedRequest request = new UpdateDatafeedRequest(datafeedUpdateBuilder.build()); // <1> // end::update-datafeed-request diff --git a/docs/java-rest/high-level/ml/update-datafeed.asciidoc b/docs/java-rest/high-level/ml/update-datafeed.asciidoc index ddca23072aba7..86e3a4de336ec 100644 --- a/docs/java-rest/high-level/ml/update-datafeed.asciidoc +++ b/docs/java-rest/high-level/ml/update-datafeed.asciidoc @@ -22,63 +22,26 @@ include-tagged::{doc-tests-file}[{api}-request] <1> The updated configuration of the {ml} datafeed [id="{upid}-{api}-config"] -==== Updated Datafeed Configuration +==== Updated Datafeed Arguments -The `DatafeedUpdate` object contains the updated -settings for the {ml} datafeed configuration. - -A `DatafeedUpdate` requires the following argument(s): +A `DatafeedUpdate` requires an existing non-null `datafeedId` and +allows updating various settings. ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests-file}[{api}-config] -------------------------------------------------- -<1> The datafeed ID - -==== Optional Arguments -The following arguments are optional: - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-indices] --------------------------------------------------- -<1> The indices that contain the data to retrieve and feed into the job - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-chunking-config] --------------------------------------------------- -<1> Specifies how data searches are split into time chunks. - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-frequency] --------------------------------------------------- -<1> The interval at which scheduled queries are made while the datafeed runs in real time. - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-query] --------------------------------------------------- -<1> A query to filter the search results by. Defaults to the `match_all` query. - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-query-delay] --------------------------------------------------- -<1> The time interval behind real time that data is queried. - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-script-fields] --------------------------------------------------- -<1> Allows the use of script fields. - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-config-set-scroll-size] --------------------------------------------------- -<1> The `size` parameter used in the searches. +<1> Mandatory, non-null `datafeedId` referencing an existing {ml} datafeed +<2> Optional, set the datafeed Aggregations for data gathering +<3> Optional, the indices that contain the data to retrieve and feed into the job +<4> Optional, specifies how data searches are split into time chunks. +<5> Optional, the interval at which scheduled queries are made while the datafeed runs in real time. +<6> Optional, a query to filter the search results by. Defaults to the `match_all` query. +<7> Optional, the time interval behind real time that data is queried. +<8> Optional, allows the use of script fields. +<9> Optional, the `size` parameter used in the searches. +<10> Optional, the `jobId` that references the job that the datafeed should be associated with +after the update. include::../execution.asciidoc[] From f78f32d4251f3e756fa71497165ea42b2156ea0e Mon Sep 17 00:00:00 2001 From: Benjamin Trent Date: Fri, 26 Oct 2018 12:39:49 -0500 Subject: [PATCH 4/4] fixing comment --- .../java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java index 84fd171b21c93..e434c5f9a5728 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateDatafeedRequest.java @@ -29,7 +29,7 @@ import java.util.Objects; /** - * Requests an updates to a {@link org.elasticsearch.client.ml.datafeed.DatafeedConfig} with the passed {@link DatafeedUpdate} + * Requests an update to a {@link org.elasticsearch.client.ml.datafeed.DatafeedConfig} with the passed {@link DatafeedUpdate} * settings */ public class UpdateDatafeedRequest extends ActionRequest implements ToXContentObject {