Skip to content

Commit

Permalink
[HLRC][ML] Add delete expired data API (#35906)
Browse files Browse the repository at this point in the history
Relates to #29827
  • Loading branch information
edsavage committed Nov 26, 2018
1 parent fb28149 commit 13c76ef
Show file tree
Hide file tree
Showing 12 changed files with 586 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.elasticsearch.client.ml.DeleteCalendarJobRequest;
import org.elasticsearch.client.ml.DeleteCalendarRequest;
import org.elasticsearch.client.ml.DeleteDatafeedRequest;
import org.elasticsearch.client.ml.DeleteExpiredDataRequest;
import org.elasticsearch.client.ml.DeleteFilterRequest;
import org.elasticsearch.client.ml.DeleteForecastRequest;
import org.elasticsearch.client.ml.DeleteJobRequest;
Expand Down Expand Up @@ -155,6 +156,17 @@ static Request closeJob(CloseJobRequest closeJobRequest) throws IOException {
return request;
}

static Request deleteExpiredData(DeleteExpiredDataRequest deleteExpiredDataRequest) {
String endpoint = new EndpointBuilder()
.addPathPartAsIs("_xpack")
.addPathPartAsIs("ml")
.addPathPartAsIs("_delete_expired_data")
.build();
Request request = new Request(HttpDelete.METHOD_NAME, endpoint);

return request;
}

static Request deleteJob(DeleteJobRequest deleteJobRequest) {
String endpoint = new EndpointBuilder()
.addPathPartAsIs("_xpack")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import org.elasticsearch.client.ml.DeleteCalendarJobRequest;
import org.elasticsearch.client.ml.DeleteCalendarRequest;
import org.elasticsearch.client.ml.DeleteDatafeedRequest;
import org.elasticsearch.client.ml.DeleteExpiredDataRequest;
import org.elasticsearch.client.ml.DeleteExpiredDataResponse;
import org.elasticsearch.client.ml.DeleteFilterRequest;
import org.elasticsearch.client.ml.DeleteForecastRequest;
import org.elasticsearch.client.ml.DeleteJobRequest;
Expand Down Expand Up @@ -227,6 +229,48 @@ public void getJobStatsAsync(GetJobStatsRequest request, RequestOptions options,
Collections.emptySet());
}

/**
* Deletes expired data from Machine Learning Jobs
* <p>
* For additional info
* see <a href="http://www.elastic.co/guide/en/elasticsearch/reference/current/ml-delete-expired-data.html">ML Delete Expired Data
* documentation</a>
*
* @param request The request to delete expired ML data
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
* @return The action response which contains the acknowledgement or the task id depending on whether the action was set to wait for
* completion
* @throws IOException when there is a serialization issue sending the request or receiving the response
*/
public DeleteExpiredDataResponse deleteExpiredData(DeleteExpiredDataRequest request, RequestOptions options) throws IOException {
return restHighLevelClient.performRequestAndParseEntity(request,
MLRequestConverters::deleteExpiredData,
options,
DeleteExpiredDataResponse::fromXContent,
Collections.emptySet());
}

/**
* Deletes expired data from Machine Learning Jobs asynchronously and notifies the listener on completion
* <p>
* For additional info
* see <a href="http://www.elastic.co/guide/en/elasticsearch/reference/current/ml-delete-expired-data.html">ML Delete Expired Data
* documentation</a>
*
* @param request The request to delete expired ML data
* @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 deleteExpiredDataAsync(DeleteExpiredDataRequest request, RequestOptions options,
ActionListener<DeleteExpiredDataResponse> listener) {
restHighLevelClient.performRequestAsyncAndParseEntity(request,
MLRequestConverters::deleteExpiredData,
options,
DeleteExpiredDataResponse::fromXContent,
listener,
Collections.emptySet());
}

/**
* Deletes the given Machine Learning Job
* <p>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* 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;

/**
* Request to delete expired model snapshots and forecasts
*/
public class DeleteExpiredDataRequest extends ActionRequest {

/**
* Create a new request to delete expired data
*/
public DeleteExpiredDataRequest() {
}

@Override
public ActionRequestValidationException validate() {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* 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.ParseField;
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
import org.elasticsearch.common.xcontent.ToXContent;
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;


/**
* A response acknowledging the deletion of expired data
*/
public class DeleteExpiredDataResponse extends ActionResponse implements ToXContentObject {

private static final ParseField DELETED = new ParseField("deleted");

public DeleteExpiredDataResponse(boolean deleted) {
this.deleted = deleted;
}

public static final ConstructingObjectParser<DeleteExpiredDataResponse, Void> PARSER =
new ConstructingObjectParser<>("delete_expired_data_response", true,
a -> new DeleteExpiredDataResponse((Boolean) a[0]));

static {
PARSER.declareBoolean(ConstructingObjectParser.constructorArg(), DELETED);
}

public static DeleteExpiredDataResponse fromXContent(XContentParser parser) throws IOException {
return PARSER.parse(parser, null);
}

private final Boolean deleted;

public Boolean getDeleted() {
return deleted;
}

@Override
public int hashCode() {
return Objects.hash(deleted);
}

@Override
public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException {
builder.startObject();
if (deleted != null) {
builder.field(DELETED.getPreferredName(), deleted);
}
builder.endObject();
return builder;
}

@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
DeleteExpiredDataResponse response = (DeleteExpiredDataResponse) obj;
return Objects.equals(deleted, response.deleted);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.elasticsearch.client.ml.DeleteCalendarJobRequest;
import org.elasticsearch.client.ml.DeleteCalendarRequest;
import org.elasticsearch.client.ml.DeleteDatafeedRequest;
import org.elasticsearch.client.ml.DeleteExpiredDataRequest;
import org.elasticsearch.client.ml.DeleteFilterRequest;
import org.elasticsearch.client.ml.DeleteForecastRequest;
import org.elasticsearch.client.ml.DeleteJobRequest;
Expand Down Expand Up @@ -183,6 +184,14 @@ public void testCloseJob() throws Exception {
requestEntityToString(request));
}

public void testDeleteExpiredData() {
DeleteExpiredDataRequest deleteExpiredDataRequest = new DeleteExpiredDataRequest();

Request request = MLRequestConverters.deleteExpiredData(deleteExpiredDataRequest);
assertEquals(HttpDelete.METHOD_NAME, request.getMethod());
assertEquals("/_xpack/ml/_delete_expired_data", request.getEndpoint());
}

public void testDeleteJob() {
String jobId = randomAlphaOfLength(10);
DeleteJobRequest deleteJobRequest = new DeleteJobRequest(jobId);
Expand Down
Loading

0 comments on commit 13c76ef

Please sign in to comment.