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 1030464be4f..d65aa0dbb2c 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
@@ -45,6 +45,7 @@ import org.elasticsearch.client.ml.GetOverallBucketsRequest;
import org.elasticsearch.client.ml.GetRecordsRequest;
import org.elasticsearch.client.ml.OpenJobRequest;
import org.elasticsearch.client.ml.PostDataRequest;
+import org.elasticsearch.client.ml.PreviewDatafeedRequest;
import org.elasticsearch.client.ml.PutCalendarRequest;
import org.elasticsearch.client.ml.PutDatafeedRequest;
import org.elasticsearch.client.ml.PutJobRequest;
@@ -259,6 +260,17 @@ final class MLRequestConverters {
return request;
}
+ static Request previewDatafeed(PreviewDatafeedRequest previewDatafeedRequest) {
+ String endpoint = new EndpointBuilder()
+ .addPathPartAsIs("_xpack")
+ .addPathPartAsIs("ml")
+ .addPathPartAsIs("datafeeds")
+ .addPathPart(previewDatafeedRequest.getDatafeedId())
+ .addPathPartAsIs("_preview")
+ .build();
+ return new Request(HttpGet.METHOD_NAME, endpoint);
+ }
+
static Request deleteForecast(DeleteForecastRequest deleteForecastRequest) {
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 43bc18fad0d..3b1fd2bfd2d 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
@@ -52,6 +52,8 @@ import org.elasticsearch.client.ml.OpenJobRequest;
import org.elasticsearch.client.ml.OpenJobResponse;
import org.elasticsearch.client.ml.PostDataRequest;
import org.elasticsearch.client.ml.PostDataResponse;
+import org.elasticsearch.client.ml.PreviewDatafeedRequest;
+import org.elasticsearch.client.ml.PreviewDatafeedResponse;
import org.elasticsearch.client.ml.PutCalendarRequest;
import org.elasticsearch.client.ml.PutCalendarResponse;
import org.elasticsearch.client.ml.PutDatafeedRequest;
@@ -649,6 +651,49 @@ public final class MachineLearningClient {
Collections.emptySet());
}
+ /**
+ * Previews the given Machine Learning Datafeed
+ *
+ * For additional info
+ * see
+ * ML Preview Datafeed documentation
+ *
+ * @param request The request to preview the datafeed
+ * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
+ * @return {@link PreviewDatafeedResponse} object containing a {@link org.elasticsearch.common.bytes.BytesReference} of the data in
+ * JSON format
+ * @throws IOException when there is a serialization issue sending the request or receiving the response
+ */
+ public PreviewDatafeedResponse previewDatafeed(PreviewDatafeedRequest request, RequestOptions options) throws IOException {
+ return restHighLevelClient.performRequestAndParseEntity(request,
+ MLRequestConverters::previewDatafeed,
+ options,
+ PreviewDatafeedResponse::fromXContent,
+ Collections.emptySet());
+ }
+
+ /**
+ * Previews the given Machine Learning Datafeed asynchronously and notifies the listener on completion
+ *
+ * For additional info
+ * see
+ * ML Preview Datafeed documentation
+ *
+ * @param request The request to preview the datafeed
+ * @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 previewDatafeedAsync(PreviewDatafeedRequest request,
+ RequestOptions options,
+ ActionListener listener) {
+ restHighLevelClient.performRequestAsyncAndParseEntity(request,
+ MLRequestConverters::previewDatafeed,
+ options,
+ PreviewDatafeedResponse::fromXContent,
+ listener,
+ Collections.emptySet());
+ }
+
/**
* Updates a Machine Learning {@link org.elasticsearch.client.ml.job.config.Job}
*
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PreviewDatafeedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PreviewDatafeedRequest.java
new file mode 100644
index 00000000000..a21e96b4642
--- /dev/null
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PreviewDatafeedRequest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.DatafeedConfig;
+import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.xcontent.ConstructingObjectParser;
+import org.elasticsearch.common.xcontent.ToXContentObject;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentParser;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * Request to preview a MachineLearning Datafeed
+ */
+public class PreviewDatafeedRequest extends ActionRequest implements ToXContentObject {
+
+ public static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>(
+ "open_datafeed_request", true, a -> new PreviewDatafeedRequest((String) a[0]));
+
+ static {
+ PARSER.declareString(ConstructingObjectParser.constructorArg(), DatafeedConfig.ID);
+ }
+
+ public static PreviewDatafeedRequest fromXContent(XContentParser parser) throws IOException {
+ return PARSER.parse(parser, null);
+ }
+
+ private final String datafeedId;
+
+ /**
+ * Create a new request with the desired datafeedId
+ *
+ * @param datafeedId unique datafeedId, must not be null
+ */
+ public PreviewDatafeedRequest(String datafeedId) {
+ this.datafeedId = Objects.requireNonNull(datafeedId, "[datafeed_id] must not be null");
+ }
+
+ public String getDatafeedId() {
+ return datafeedId;
+ }
+
+ @Override
+ public ActionRequestValidationException validate() {
+ return null;
+ }
+
+ @Override
+ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
+ builder.startObject();
+ builder.field(DatafeedConfig.ID.getPreferredName(), datafeedId);
+ builder.endObject();
+ return builder;
+ }
+
+ @Override
+ public String toString() {
+ return Strings.toString(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(datafeedId);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+
+ if (other == null || getClass() != other.getClass()) {
+ return false;
+ }
+
+ PreviewDatafeedRequest that = (PreviewDatafeedRequest) other;
+ return Objects.equals(datafeedId, that.datafeedId);
+ }
+}
diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PreviewDatafeedResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PreviewDatafeedResponse.java
new file mode 100644
index 00000000000..ca96f153c60
--- /dev/null
+++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PreviewDatafeedResponse.java
@@ -0,0 +1,113 @@
+/*
+ * 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.ActionResponse;
+import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.bytes.BytesReference;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.xcontent.DeprecationHandler;
+import org.elasticsearch.common.xcontent.NamedXContentRegistry;
+import org.elasticsearch.common.xcontent.ToXContentObject;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.elasticsearch.common.xcontent.XContentParser;
+import org.elasticsearch.common.xcontent.XContentType;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * Response containing a datafeed preview in JSON format
+ */
+public class PreviewDatafeedResponse extends ActionResponse implements ToXContentObject {
+
+ private BytesReference preview;
+
+ public static PreviewDatafeedResponse fromXContent(XContentParser parser) throws IOException {
+ try (XContentBuilder builder = XContentFactory.jsonBuilder()) {
+ parser.nextToken();
+ builder.copyCurrentStructure(parser);
+ return new PreviewDatafeedResponse(BytesReference.bytes(builder));
+ }
+ }
+
+ public PreviewDatafeedResponse(BytesReference preview) {
+ this.preview = preview;
+ }
+
+ public BytesReference getPreview() {
+ return preview;
+ }
+
+ /**
+ * Parses the preview to a list of {@link Map} objects
+ * @return List of previewed data
+ * @throws IOException If there is a parsing issue with the {@link BytesReference}
+ * @throws java.lang.ClassCastException If casting the raw {@link Object} entries to a {@link Map} fails
+ */
+ @SuppressWarnings("unchecked")
+ public List