[ML] Refactor common utils out of ML plugin to XPack.Core (#39976) (#40009)

* [ML] Refactor common utils out of ML plugin to XPack.Core

* implementing GET filters with abstract transport

* removing added rest param

* adjusting how defaults can be supplied
This commit is contained in:
Benjamin Trent 2019-03-13 17:08:43 -05:00 committed by GitHub
parent 8c6ff5de31
commit 2016e23285
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
82 changed files with 741 additions and 841 deletions

View File

@ -0,0 +1,98 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.xpack.core.action.util.PageParams;
import java.io.IOException;
import java.util.Objects;
public abstract class AbstractGetResourcesRequest extends ActionRequest {
private String resourceId;
private PageParams pageParams = PageParams.defaultParams();
private boolean allowNoResources = false;
public AbstractGetResourcesRequest() {
}
// Allow child classes to provide their own defaults if necessary
protected AbstractGetResourcesRequest(String resourceId, PageParams pageParams, boolean allowNoResources) {
this.resourceId = resourceId;
this.pageParams = pageParams;
this.allowNoResources = allowNoResources;
}
public final void setResourceId(String resourceId) {
this.resourceId = resourceId;
}
public final String getResourceId() {
return resourceId;
}
public final void setPageParams(PageParams pageParams) {
this.pageParams = pageParams;
}
public final PageParams getPageParams() {
return pageParams;
}
public final void setAllowNoResources(boolean allowNoResources) {
this.allowNoResources = allowNoResources;
}
public final boolean isAllowNoResources() {
return this.allowNoResources;
}
@Override
public ActionRequestValidationException validate() {
return null;
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
resourceId = in.readOptionalString();
pageParams = in.readOptionalWriteable(PageParams::new);
allowNoResources = in.readBoolean();
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeOptionalString(resourceId);
out.writeOptionalWriteable(pageParams);
out.writeBoolean(allowNoResources);
}
@Override
public int hashCode() {
return Objects.hash(resourceId, pageParams, allowNoResources);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj instanceof AbstractGetResourcesRequest == false) {
return false;
}
AbstractGetResourcesRequest other = (AbstractGetResourcesRequest) obj;
return Objects.equals(resourceId, other.resourceId) &&
Objects.equals(pageParams, other.pageParams) &&
allowNoResources == other.allowNoResources;
}
public abstract String getResourceIdField();
}

View File

@ -0,0 +1,84 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.action;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.common.xcontent.StatusToXContentObject;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import java.io.IOException;
import java.util.Objects;
public abstract class AbstractGetResourcesResponse<T extends ToXContent & Writeable> extends ActionResponse
implements StatusToXContentObject {
private QueryPage<T> resources;
protected AbstractGetResourcesResponse() {}
protected AbstractGetResourcesResponse(QueryPage<T> resources) {
this.resources = Objects.requireNonNull(resources);
}
public QueryPage<T> getResources() {
return resources;
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
resources = new QueryPage<>(in, getReader());
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
resources.writeTo(out);
}
@Override
public RestStatus status() {
return RestStatus.OK;
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
resources.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(resources);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj instanceof AbstractGetResourcesResponse == false) {
return false;
}
AbstractGetResourcesResponse other = (AbstractGetResourcesResponse) obj;
return Objects.equals(resources, other.resources);
}
@Override
public final String toString() {
return Strings.toString(this);
}
protected abstract Reader<T> getReader();
}

View File

@ -0,0 +1,193 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.action;
import org.elasticsearch.ResourceNotFoundException;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.HandledTransportAction;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.common.regex.Regex;
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.action.util.ExpandedIdsMatcher;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Supplier;
import static org.elasticsearch.xpack.core.ClientHelper.executeAsyncWithOrigin;
/**
* Abstract transport class for collecting common logic in gathering Resource objects from indices
* @param <Resource> The type of the Resource being gathered
* @param <Request> The type of the Request
* @param <Response> The type of the Response
*/
public abstract class AbstractTransportGetResourcesAction<Resource extends ToXContent & Writeable,
Request extends AbstractGetResourcesRequest, Response extends AbstractGetResourcesResponse<Resource>>
extends HandledTransportAction<Request, Response> {
private static final String ALL = "_all";
private final Client client;
private final NamedXContentRegistry xContentRegistry;
protected AbstractTransportGetResourcesAction(String actionName, TransportService transportService, ActionFilters actionFilters,
Supplier<Request> request, Client client, NamedXContentRegistry xContentRegistry) {
super(actionName, transportService, actionFilters, request);
this.client = Objects.requireNonNull(client);
this.xContentRegistry = Objects.requireNonNull(xContentRegistry);
}
protected void searchResources(AbstractGetResourcesRequest request, ActionListener<QueryPage<Resource>> listener) {
String[] tokens = Strings.tokenizeToStringArray(request.getResourceId(), ",");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.sort(request.getResourceIdField())
.query(buildQuery(tokens, request.getResourceIdField()));
if (request.getPageParams() != null) {
sourceBuilder.from(request.getPageParams().getFrom())
.size(request.getPageParams().getSize());
}
IndicesOptions indicesOptions = SearchRequest.DEFAULT_INDICES_OPTIONS;
SearchRequest searchRequest = new SearchRequest(getIndices())
.indicesOptions(IndicesOptions.fromOptions(true,
indicesOptions.allowNoIndices(),
indicesOptions.expandWildcardsOpen(),
indicesOptions.expandWildcardsClosed(),
indicesOptions))
.source(sourceBuilder);
executeAsyncWithOrigin(client.threadPool().getThreadContext(),
executionOrigin(),
searchRequest,
new ActionListener<SearchResponse>() {
@Override
public void onResponse(SearchResponse response) {
List<Resource> docs = new ArrayList<>();
Set<String> foundResourceIds = new HashSet<>();
for (SearchHit hit : response.getHits().getHits()) {
BytesReference docSource = hit.getSourceRef();
try (InputStream stream = docSource.streamInput();
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(
xContentRegistry, LoggingDeprecationHandler.INSTANCE, stream)) {
Resource resource = parse(parser);
docs.add(resource);
foundResourceIds.add(extractIdFromResource(resource));
} catch (IOException e) {
this.onFailure(e);
}
}
ExpandedIdsMatcher requiredMatches = new ExpandedIdsMatcher(tokens, request.isAllowNoResources());
requiredMatches.filterMatchedIds(foundResourceIds);
if (requiredMatches.hasUnmatchedIds()) {
listener.onFailure(notFoundException(requiredMatches.unmatchedIdsString()));
} else {
listener.onResponse(new QueryPage<>(docs, docs.size(), getResultsField()));
}
}
@Override
public void onFailure(Exception e) {
listener.onFailure(e);
}
},
client::search);
}
private QueryBuilder buildQuery(String[] tokens, String resourceIdField) {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// If the resourceId is not _all or *, we should see if it is a comma delimited string with wild-cards
// e.g. id1,id2*,id3
if (Strings.isAllOrWildcard(tokens) == false) {
BoolQueryBuilder shouldQueries = new BoolQueryBuilder();
List<String> terms = new ArrayList<>();
for (String token : tokens) {
if (Regex.isSimpleMatchPattern(token)) {
shouldQueries.should(QueryBuilders.wildcardQuery(resourceIdField, token));
} else {
terms.add(token);
}
}
if (terms.isEmpty() == false) {
shouldQueries.should(QueryBuilders.termsQuery(resourceIdField, terms));
}
if (shouldQueries.should().isEmpty() == false) {
boolQuery.filter(shouldQueries);
}
}
QueryBuilder additionalQuery = additionalQuery();
if (additionalQuery != null) {
boolQuery.filter(additionalQuery);
}
return boolQuery.hasClauses() ? boolQuery : QueryBuilders.matchAllQuery();
}
@Nullable
protected QueryBuilder additionalQuery() {
return null;
}
/**
* @return The results field parse field so that the response is properly formatted
*/
protected abstract ParseField getResultsField();
/**
* @return The indices needed to query
*/
protected abstract String[] getIndices();
/**
* @param parser Constructed XContentParser from search response hits to relay to a parser for the Resource
* @return parsed Resource typed object
*/
protected abstract Resource parse(XContentParser parser) throws IOException;
/**
* @param resourceId Resource ID or expression that was not found in the search results
* @return The exception to throw in the event that an ID or expression is not found
*/
protected abstract ResourceNotFoundException notFoundException(String resourceId);
/**
* @return The appropriate origin under which to execute the search requests
*/
protected abstract String executionOrigin();
/**
* @param resource A parsed Resource object
* @return The ID of the resource
*/
protected abstract String extractIdFromResource(Resource resource);
}

View File

@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.ml.job.persistence;
package org.elasticsearch.xpack.core.action.util;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.regex.Regex;
@ -38,7 +38,7 @@ public final class ExpandedIdsMatcher {
* @param expression Expression containing zero or more ','s
* @return Array of tokens
*/
public static String [] tokenizeExpression(String expression) {
public static String[] tokenizeExpression(String expression) {
return Strings.tokenizeToStringArray(expression, ",");
}
@ -50,10 +50,10 @@ public final class ExpandedIdsMatcher {
*
* @param tokens List of expressions that may be wildcards or full Ids
* @param allowNoMatchForWildcards If true then it is not required for wildcard
* expressions to match an Id meaning they are
* not returned in the list of required matches
* expressions to match an Id meaning they are
* not returned in the list of required matches
*/
public ExpandedIdsMatcher(String [] tokens, boolean allowNoMatchForWildcards) {
public ExpandedIdsMatcher(String[] tokens, boolean allowNoMatchForWildcards) {
requiredMatches = new LinkedList<>();
if (Strings.isAllOrWildcard(tokens)) {

View File

@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.ml.action.util;
package org.elasticsearch.xpack.core.action.util;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.io.stream.StreamInput;
@ -16,6 +16,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import java.io.IOException;
import java.util.Objects;
/**
* Helper class collecting options for pagination in a search
*/
public class PageParams implements ToXContentObject, Writeable {
public static final ParseField PAGE = new ParseField("page");

View File

@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.ml.action.util;
package org.elasticsearch.xpack.core.action.util;
import org.elasticsearch.ResourceNotFoundException;
import org.elasticsearch.common.ParseField;
@ -13,7 +13,6 @@ import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
import java.io.IOException;
import java.util.List;
@ -38,7 +37,7 @@ public final class QueryPage<T extends ToXContent & Writeable> implements ToXCon
public QueryPage(List<T> results, long count, ParseField resultsField) {
this.results = results;
this.count = count;
this.resultsField = ExceptionsHelper.requireNonNull(resultsField, DEFAULT_RESULTS_FIELD.getPreferredName());
this.resultsField = Objects.requireNonNull(resultsField);
}
public QueryPage(StreamInput in, Reader<T> hitReader) throws IOException {

View File

@ -9,18 +9,17 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.results.Bucket;
import org.elasticsearch.xpack.core.ml.job.results.Result;
@ -291,61 +290,22 @@ public class GetBucketsAction extends Action<GetBucketsAction.Response> {
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<Bucket> buckets;
public static class Response extends AbstractGetResourcesResponse<Bucket> implements ToXContentObject {
public Response() {
}
public Response(QueryPage<Bucket> buckets) {
this.buckets = buckets;
super(buckets);
}
public QueryPage<Bucket> getBuckets() {
return buckets;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
buckets = new QueryPage<>(in, Bucket::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
buckets.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
buckets.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(buckets);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(buckets, other.buckets);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<Bucket> getReader() {
return Bucket::new;
}
}

View File

@ -9,7 +9,6 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.ValidateActions;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
@ -19,8 +18,9 @@ import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import org.elasticsearch.xpack.core.ml.calendars.ScheduledEvent;
import org.elasticsearch.xpack.core.ml.job.config.Job;
@ -194,50 +194,18 @@ public class GetCalendarEventsAction extends Action<GetCalendarEventsAction.Resp
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<ScheduledEvent> scheduledEvents;
public static class Response extends AbstractGetResourcesResponse<ScheduledEvent> implements ToXContentObject {
public Response() {
}
public Response(QueryPage<ScheduledEvent> scheduledEvents) {
this.scheduledEvents = scheduledEvents;
super(scheduledEvents);
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
scheduledEvents = new QueryPage<>(in, ScheduledEvent::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
scheduledEvents.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
return scheduledEvents.toXContent(builder, params);
}
@Override
public int hashCode() {
return Objects.hash(scheduledEvents);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(scheduledEvents, other.scheduledEvents);
protected Reader<ScheduledEvent> getReader() {
return ScheduledEvent::new;
}
}

View File

@ -9,9 +9,7 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ObjectParser;
@ -20,8 +18,9 @@ import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import java.io.IOException;
@ -149,66 +148,26 @@ public class GetCalendarsAction extends Action<GetCalendarsAction.Response> {
}
}
public static class Response extends ActionResponse implements StatusToXContentObject {
private QueryPage<Calendar> calendars;
public static class Response extends AbstractGetResourcesResponse<Calendar> implements StatusToXContentObject {
public Response(QueryPage<Calendar> calendars) {
this.calendars = calendars;
super(calendars);
}
public Response() {
}
public QueryPage<Calendar> getCalendars() {
return calendars;
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
calendars = new QueryPage<>(in, Calendar::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
calendars.writeTo(out);
}
@Override
public RestStatus status() {
return RestStatus.OK;
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
calendars.doXContentBody(builder, params);
builder.endObject();
return builder;
public QueryPage<Calendar> getCalendars() {
return getResources();
}
@Override
public int hashCode() {
return Objects.hash(calendars);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(calendars, other.calendars);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<Calendar> getReader() {
return Calendar::new;
}
}
}

View File

@ -9,7 +9,6 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.io.stream.StreamInput;
@ -18,8 +17,9 @@ import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.results.CategoryDefinition;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -164,54 +164,22 @@ public class GetCategoriesAction extends Action<GetCategoriesAction.Response> {
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<CategoryDefinition> result;
public static class Response extends AbstractGetResourcesResponse<CategoryDefinition> implements ToXContentObject {
public Response(QueryPage<CategoryDefinition> result) {
this.result = result;
super(result);
}
public Response() {
}
public QueryPage<CategoryDefinition> getResult() {
return result;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
result = new QueryPage<>(in, CategoryDefinition::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
result.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
result.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Response response = (Response) o;
return Objects.equals(result, response.result);
}
@Override
public int hashCode() {
return Objects.hash(result);
protected Reader<CategoryDefinition> getReader() {
return CategoryDefinition::new;
}
}

View File

@ -8,17 +8,15 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.Version;
import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.support.master.MasterNodeReadOperationRequestBuilder;
import org.elasticsearch.action.support.master.MasterNodeReadRequest;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -121,60 +119,20 @@ public class GetDatafeedsAction extends Action<GetDatafeedsAction.Response> {
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<DatafeedConfig> datafeeds;
public static class Response extends AbstractGetResourcesResponse<DatafeedConfig> implements ToXContentObject {
public Response(QueryPage<DatafeedConfig> datafeeds) {
this.datafeeds = datafeeds;
super(datafeeds);
}
public Response() {}
public QueryPage<DatafeedConfig> getResponse() {
return datafeeds;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
datafeeds = new QueryPage<>(in, DatafeedConfig::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
datafeeds.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
datafeeds.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(datafeeds);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(datafeeds, other.datafeeds);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<DatafeedConfig> getReader() {
return DatafeedConfig::new;
}
}

View File

@ -8,20 +8,19 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.Version;
import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.support.master.MasterNodeReadOperationRequestBuilder;
import org.elasticsearch.action.support.master.MasterNodeReadRequest;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -124,7 +123,7 @@ public class GetDatafeedsStatsAction extends Action<GetDatafeedsStatsAction.Resp
}
}
public static class Response extends ActionResponse implements ToXContentObject {
public static class Response extends AbstractGetResourcesResponse<Response.DatafeedStats> implements ToXContentObject {
public static class DatafeedStats implements ToXContentObject, Writeable {
@ -223,58 +222,19 @@ public class GetDatafeedsStatsAction extends Action<GetDatafeedsStatsAction.Resp
}
}
private QueryPage<DatafeedStats> datafeedsStats;
public Response(QueryPage<DatafeedStats> datafeedsStats) {
this.datafeedsStats = datafeedsStats;
super(datafeedsStats);
}
public Response() {}
public QueryPage<DatafeedStats> getResponse() {
return datafeedsStats;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
datafeedsStats = new QueryPage<>(in, DatafeedStats::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
datafeedsStats.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
datafeedsStats.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(datafeedsStats);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(datafeedsStats, other.datafeedsStats);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<DatafeedStats> getReader() {
return DatafeedStats::new;
}
}

View File

@ -6,23 +6,17 @@
package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.StatusToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesRequest;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
import java.io.IOException;
import java.util.Objects;
import static org.elasticsearch.action.ValidateActions.addValidationError;
@ -41,34 +35,25 @@ public class GetFiltersAction extends Action<GetFiltersAction.Response> {
return new Response();
}
public static class Request extends ActionRequest {
private String filterId;
private PageParams pageParams;
public static class Request extends AbstractGetResourcesRequest {
public Request() {
// Put our own defaults for backwards compatibility
super(null, null, true);
}
public void setFilterId(String filterId) {
this.filterId = filterId;
setResourceId(filterId);
}
public String getFilterId() {
return filterId;
}
public PageParams getPageParams() {
return pageParams;
}
public void setPageParams(PageParams pageParams) {
this.pageParams = pageParams;
return getResourceId();
}
@Override
public ActionRequestValidationException validate() {
ActionRequestValidationException validationException = null;
if (pageParams != null && filterId != null) {
if (getPageParams() != null && getResourceId() != null) {
validationException = addValidationError("Params [" + PageParams.FROM.getPreferredName() +
", " + PageParams.SIZE.getPreferredName() + "] are incompatible with ["
+ MlFilter.ID.getPreferredName() + "]", validationException);
@ -77,32 +62,8 @@ public class GetFiltersAction extends Action<GetFiltersAction.Response> {
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
filterId = in.readOptionalString();
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeOptionalString(filterId);
}
@Override
public int hashCode() {
return Objects.hash(filterId);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Request other = (Request) obj;
return Objects.equals(filterId, other.filterId);
public String getResourceIdField() {
return MlFilter.ID.getPreferredName();
}
}
@ -113,31 +74,17 @@ public class GetFiltersAction extends Action<GetFiltersAction.Response> {
}
}
public static class Response extends ActionResponse implements StatusToXContentObject {
private QueryPage<MlFilter> filters;
public static class Response extends AbstractGetResourcesResponse<MlFilter> implements StatusToXContentObject {
public Response(QueryPage<MlFilter> filters) {
this.filters = filters;
super(filters);
}
public Response() {
}
public QueryPage<MlFilter> getFilters() {
return filters;
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
filters = new QueryPage<>(in, MlFilter::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
filters.writeTo(out);
return getResources();
}
@Override
@ -146,33 +93,8 @@ public class GetFiltersAction extends Action<GetFiltersAction.Response> {
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
filters.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(filters);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(filters, other.filters);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<MlFilter> getReader() {
return MlFilter::new;
}
}

View File

@ -9,18 +9,17 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.results.Influencer;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -226,61 +225,22 @@ extends Action<GetInfluencersAction.Response> {
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<Influencer> influencers;
public static class Response extends AbstractGetResourcesResponse<Influencer> implements ToXContentObject {
public Response() {
}
public Response(QueryPage<Influencer> influencers) {
this.influencers = influencers;
super(influencers);
}
@Override
protected Reader<Influencer> getReader() {
return Influencer::new;
}
public QueryPage<Influencer> getInfluencers() {
return influencers;
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
influencers = new QueryPage<>(in, Influencer::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
influencers.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
influencers.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(influencers);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(influencers, other.influencers);
}
@Override
public final String toString() {
return Strings.toString(this);
return getResources();
}
}

View File

@ -8,17 +8,15 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.Version;
import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.support.master.MasterNodeReadOperationRequestBuilder;
import org.elasticsearch.action.support.master.MasterNodeReadRequest;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -119,60 +117,21 @@ public class GetJobsAction extends Action<GetJobsAction.Response> {
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<Job> jobs;
public static class Response extends AbstractGetResourcesResponse<Job> implements ToXContentObject {
public Response(QueryPage<Job> jobs) {
this.jobs = jobs;
super(jobs);
}
public Response() {}
public QueryPage<Job> getResponse() {
return jobs;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
jobs = new QueryPage<>(in, Job::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
jobs.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
jobs.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(jobs);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(jobs, other.jobs);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<Job> getReader() {
return Job::new;
}
}

View File

@ -25,7 +25,7 @@ import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.config.JobState;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.DataCounts;

View File

@ -9,19 +9,18 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -216,61 +215,22 @@ public class GetModelSnapshotsAction extends Action<GetModelSnapshotsAction.Resp
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<ModelSnapshot> page;
public static class Response extends AbstractGetResourcesResponse<ModelSnapshot> implements ToXContentObject {
public Response(QueryPage<ModelSnapshot> page) {
this.page = page;
super(page);
}
public Response() {
}
public QueryPage<ModelSnapshot> getPage() {
return page;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
page = new QueryPage<>(in, ModelSnapshot::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
page.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
page.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(page);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(page, other.page);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<ModelSnapshot> getReader() {
return ModelSnapshot::new;
}
}

View File

@ -10,10 +10,8 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.time.DateMathParser;
@ -23,7 +21,8 @@ import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.mapper.DateFieldMapper;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
import org.elasticsearch.xpack.core.ml.job.results.OverallBucket;
@ -281,62 +280,23 @@ public class GetOverallBucketsAction extends Action<GetOverallBucketsAction.Resp
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<OverallBucket> overallBuckets;
public static class Response extends AbstractGetResourcesResponse<OverallBucket> implements ToXContentObject {
public Response() {
overallBuckets = new QueryPage<>(Collections.emptyList(), 0, OverallBucket.RESULTS_FIELD);
super(new QueryPage<>(Collections.emptyList(), 0, OverallBucket.RESULTS_FIELD));
}
public Response(QueryPage<OverallBucket> overallBuckets) {
this.overallBuckets = overallBuckets;
super(overallBuckets);
}
public QueryPage<OverallBucket> getOverallBuckets() {
return overallBuckets;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
overallBuckets = new QueryPage<>(in, OverallBucket::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
overallBuckets.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
overallBuckets.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(overallBuckets);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(overallBuckets, other.overallBuckets);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<OverallBucket> getReader() {
return OverallBucket::new;
}
}

View File

@ -9,18 +9,17 @@ import org.elasticsearch.action.Action;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.results.AnomalyRecord;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@ -225,61 +224,22 @@ public class GetRecordsAction extends Action<GetRecordsAction.Response> {
}
}
public static class Response extends ActionResponse implements ToXContentObject {
private QueryPage<AnomalyRecord> records;
public static class Response extends AbstractGetResourcesResponse<AnomalyRecord> implements ToXContentObject {
public Response() {
}
public Response(QueryPage<AnomalyRecord> records) {
this.records = records;
super(records);
}
public QueryPage<AnomalyRecord> getRecords() {
return records;
return getResources();
}
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
records = new QueryPage<>(in, AnomalyRecord::new);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
records.writeTo(out);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
records.doXContentBody(builder, params);
builder.endObject();
return builder;
}
@Override
public int hashCode() {
return Objects.hash(records);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Response other = (Response) obj;
return Objects.equals(records, other.records);
}
@Override
public final String toString() {
return Strings.toString(this);
protected Reader<AnomalyRecord> getReader() {
return AnomalyRecord::new;
}
}

View File

@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.ml.job.persistence;
package org.elasticsearch.xpack.core.action.util;
import org.elasticsearch.test.ESTestCase;
@ -17,7 +17,7 @@ import static org.hamcrest.Matchers.isOneOf;
public class ExpandedIdsMatcherTests extends ESTestCase {
public void testMatchingJobIds() {
public void testMatchingResourceIds() {
ExpandedIdsMatcher requiredMatches = new ExpandedIdsMatcher(new String[] {"*"}, false);
assertThat(requiredMatches.unmatchedIds(), hasSize(1));
assertTrue(requiredMatches.hasUnmatchedIds());
@ -76,8 +76,7 @@ public class ExpandedIdsMatcherTests extends ESTestCase {
assertThat(requiredMatches.unmatchedIds().get(1), isOneOf("bar", "wild*"));
}
public void testMatchingJobIds_allowNoJobs() {
// wildcard all with allow no jobs
public void testMatchingResourceIds_allowNoMatch() {
ExpandedIdsMatcher requiredMatches = new ExpandedIdsMatcher(new String[] {"*"}, true);
assertThat(requiredMatches.unmatchedIds(), empty());
assertFalse(requiredMatches.hasUnmatchedIds());

View File

@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.ml.action.util;
package org.elasticsearch.xpack.core.action.util;
import org.elasticsearch.common.io.stream.Writeable.Reader;
import org.elasticsearch.common.xcontent.XContentParser;

View File

@ -0,0 +1,108 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.action.util;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.common.io.stream.Writeable.Reader;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.test.AbstractWireSerializingTestCase;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class QueryPageTests extends AbstractWireSerializingTestCase<QueryPage<QueryPageTests.QueryPageTester>> {
static class QueryPageTester implements ToXContentObject, Writeable {
private final String someString;
private final long someLong;
QueryPageTester(String someString, long someLong) {
this.someString = someString;
this.someLong = someLong;
}
QueryPageTester(StreamInput in) throws IOException {
this.someString = in.readString();
this.someLong = in.readLong();
}
@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeString(someString);
out.writeLong(someLong);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
builder.field("some_string", someString);
builder.field("some_long", someLong);
builder.endObject();
return builder;
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (other == null || getClass() != other.getClass()) {
return false;
}
QueryPageTester that = (QueryPageTester) other;
return Objects.equals(that.someString, someString) && that.someLong == someLong;
}
@Override
public int hashCode() {
return Objects.hash(someString, someLong);
}
}
@Override
protected QueryPage<QueryPageTests.QueryPageTester> createTestInstance() {
int hitCount = randomIntBetween(0, 10);
ArrayList<QueryPageTests.QueryPageTester> hits = new ArrayList<>();
for (int i = 0; i < hitCount; i++) {
hits.add(new QueryPageTests.QueryPageTester(randomAlphaOfLength(10), randomLong()));
}
return new QueryPage<>(hits, hitCount, new ParseField("test"));
}
@Override
protected Reader<QueryPage<QueryPageTests.QueryPageTester>> instanceReader() {
return (in) -> new QueryPage<>(in, QueryPageTests.QueryPageTester::new);
}
@Override
protected QueryPage<QueryPageTests.QueryPageTester> mutateInstance(QueryPage<QueryPageTests.QueryPageTester> instance)
throws IOException {
ParseField resultsField = instance.getResultsField();
List<QueryPageTests.QueryPageTester> page = instance.results();
long count = instance.count();
switch (between(0, 1)) {
case 0:
page = new ArrayList<>(page);
page.add(new QueryPageTests.QueryPageTester(randomAlphaOfLength(10), randomLong()));
break;
case 1:
count += between(1, 20);
break;
default:
throw new AssertionError("Illegal randomisation branch");
}
return new QueryPage<>(page, count, resultsField);
}
}

View File

@ -8,7 +8,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetBucketActionRequestTests extends AbstractStreamableXContentTestCase<Request> {

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.results.AnomalyRecord;
import org.elasticsearch.xpack.core.ml.job.results.Bucket;
import org.elasticsearch.xpack.core.ml.job.results.BucketInfluencer;

View File

@ -9,7 +9,7 @@ import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.GetCalendarEventsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetCalendarEventsActionRequestTests extends AbstractStreamableXContentTestCase<GetCalendarEventsAction.Request> {

View File

@ -8,7 +8,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.GetCalendarsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetCalendarsActionRequestTests extends AbstractStreamableXContentTestCase<GetCalendarsAction.Request> {

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetCategoriesRequestTests extends AbstractStreamableXContentTestCase<GetCategoriesAction.Request> {

View File

@ -6,7 +6,7 @@
package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.results.CategoryDefinition;
import java.util.Collections;

View File

@ -15,7 +15,7 @@ import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetDatafeedsStatsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;

View File

@ -10,7 +10,7 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.search.SearchModule;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetDatafeedsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfigTests;

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetFiltersActionRequestTests extends AbstractStreamableTestCase<GetFiltersAction.Request> {

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
import org.elasticsearch.xpack.core.ml.job.config.MlFilterTests;

View File

@ -8,7 +8,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.GetInfluencersAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetInfluencersActionRequestTests extends AbstractStreamableXContentTestCase<Request> {

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetInfluencersAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.results.Influencer;
import java.util.ArrayList;

View File

@ -12,7 +12,7 @@ import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.test.AbstractWireSerializingTestCase;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.config.JobState;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.DataCounts;

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetJobsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.config.JobTests;

View File

@ -8,7 +8,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetModelSnapshotsActionRequestTests extends AbstractStreamableXContentTestCase<Request> {

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshotTests;

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetOverallBucketsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.results.OverallBucket;
import java.util.ArrayList;

View File

@ -8,7 +8,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.test.AbstractStreamableXContentTestCase;
import org.elasticsearch.xpack.core.ml.action.GetRecordsAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
public class GetRecordsActionRequestTests extends AbstractStreamableXContentTestCase<Request> {

View File

@ -7,7 +7,7 @@ package org.elasticsearch.xpack.core.ml.action;
import org.elasticsearch.test.AbstractStreamableTestCase;
import org.elasticsearch.xpack.core.ml.action.GetRecordsAction.Response;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.results.AnomalyRecord;
import java.util.ArrayList;

View File

@ -1,55 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.core.ml.action.util;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.io.stream.Writeable.Reader;
import org.elasticsearch.test.AbstractWireSerializingTestCase;
import org.elasticsearch.xpack.core.ml.job.results.Influencer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class QueryPageTests extends AbstractWireSerializingTestCase<QueryPage<Influencer>> {
@Override
protected QueryPage<Influencer> createTestInstance() {
int hitCount = randomIntBetween(0, 10);
ArrayList<Influencer> hits = new ArrayList<>();
for (int i = 0; i < hitCount; i++) {
hits.add(new Influencer(randomAlphaOfLengthBetween(1, 20), randomAlphaOfLengthBetween(1, 20),
randomAlphaOfLengthBetween(1, 20), new Date(), randomNonNegativeLong()));
}
return new QueryPage<>(hits, hitCount, new ParseField("test"));
}
@Override
protected Reader<QueryPage<Influencer>> instanceReader() {
return (in) -> new QueryPage<>(in, Influencer::new);
}
@Override
protected QueryPage<Influencer> mutateInstance(QueryPage<Influencer> instance) throws IOException {
ParseField resultsField = instance.getResultsField();
List<Influencer> page = instance.results();
long count = instance.count();
switch (between(0, 1)) {
case 0:
page = new ArrayList<>(page);
page.add(new Influencer(randomAlphaOfLengthBetween(10, 20), randomAlphaOfLengthBetween(10, 20),
randomAlphaOfLengthBetween(10, 20), new Date(randomNonNegativeLong()), randomNonNegativeLong()));
break;
case 1:
count += between(1, 20);
break;
default:
throw new AssertionError("Illegal randomisation branch");
}
return new QueryPage<>(page, count, resultsField);
}
}

View File

@ -18,7 +18,7 @@ import org.elasticsearch.search.aggregations.AggregatorFactories;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.MaxAggregationBuilder;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DelayedDataCheckConfig;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;

View File

@ -9,7 +9,7 @@ import org.elasticsearch.common.Strings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.xpack.core.ml.action.FlushJobAction;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;
import org.elasticsearch.xpack.core.ml.job.config.Detector;

View File

@ -44,7 +44,7 @@ import org.elasticsearch.xpack.core.ml.action.RevertModelSnapshotAction;
import org.elasticsearch.xpack.core.ml.action.StartDatafeedAction;
import org.elasticsearch.xpack.core.ml.action.StopDatafeedAction;
import org.elasticsearch.xpack.core.ml.action.UpdateJobAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import org.elasticsearch.xpack.core.ml.calendars.ScheduledEvent;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;

View File

@ -8,7 +8,7 @@ package org.elasticsearch.xpack.ml.integration;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction;
import org.elasticsearch.xpack.core.ml.action.GetOverallBucketsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;
import org.elasticsearch.xpack.core.ml.job.config.Detector;

View File

@ -52,7 +52,7 @@ import org.elasticsearch.xpack.core.ml.MlTasks;
import org.elasticsearch.xpack.core.ml.action.DeleteJobAction;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction;
import org.elasticsearch.xpack.core.ml.action.KillProcessAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.config.JobState;
import org.elasticsearch.xpack.core.ml.job.config.JobTaskState;

View File

@ -13,7 +13,7 @@ import org.elasticsearch.tasks.Task;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.action.GetCalendarEventsAction;
import org.elasticsearch.xpack.core.ml.action.GetCalendarsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.ScheduledEvent;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;

View File

@ -12,8 +12,8 @@ import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.action.GetCalendarsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import org.elasticsearch.xpack.ml.job.persistence.CalendarQueryBuilder;
import org.elasticsearch.xpack.ml.job.persistence.JobResultsProvider;

View File

@ -20,7 +20,7 @@ import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.MlMetadata;
import org.elasticsearch.xpack.core.ml.action.GetDatafeedsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.ml.datafeed.persistence.DatafeedConfigProvider;

View File

@ -20,7 +20,7 @@ import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.MlTasks;
import org.elasticsearch.xpack.core.ml.action.GetDatafeedsStatsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
import org.elasticsearch.xpack.ml.datafeed.persistence.DatafeedConfigProvider;

View File

@ -5,139 +5,80 @@
*/
package org.elasticsearch.xpack.ml.action;
import org.elasticsearch.ResourceNotFoundException;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.get.GetAction;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.HandledTransportAction;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.action.AbstractTransportGetResourcesAction;
import org.elasticsearch.xpack.core.ml.MlMetaIndex;
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
import org.elasticsearch.xpack.ml.utils.MlIndicesUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.elasticsearch.xpack.core.ClientHelper.ML_ORIGIN;
import static org.elasticsearch.xpack.core.ClientHelper.executeAsyncWithOrigin;
public class TransportGetFiltersAction extends HandledTransportAction<GetFiltersAction.Request, GetFiltersAction.Response> {
private final Client client;
public class TransportGetFiltersAction extends AbstractTransportGetResourcesAction<MlFilter,
GetFiltersAction.Request,
GetFiltersAction.Response> {
@Inject
public TransportGetFiltersAction(TransportService transportService, ActionFilters actionFilters, Client client) {
super(GetFiltersAction.NAME, transportService, actionFilters, GetFiltersAction.Request::new);
this.client = client;
public TransportGetFiltersAction(TransportService transportService,
ActionFilters actionFilters,
Client client,
NamedXContentRegistry xContentRegistry) {
super(GetFiltersAction.NAME, transportService, actionFilters, GetFiltersAction.Request::new, client, xContentRegistry);
}
@Override
protected void doExecute(Task task, GetFiltersAction.Request request, ActionListener<GetFiltersAction.Response> listener) {
final String filterId = request.getFilterId();
if (!Strings.isNullOrEmpty(filterId)) {
getFilter(filterId, listener);
} else {
PageParams pageParams = request.getPageParams();
if (pageParams == null) {
pageParams = PageParams.defaultParams();
}
getFilters(pageParams, listener);
}
request.setAllowNoResources(true);
searchResources(request, ActionListener.wrap(
filters -> listener.onResponse(new GetFiltersAction.Response(filters)),
listener::onFailure
));
}
private void getFilter(String filterId, ActionListener<GetFiltersAction.Response> listener) {
GetRequest getRequest = new GetRequest(MlMetaIndex.INDEX_NAME, MlFilter.documentId(filterId));
executeAsyncWithOrigin(client, ML_ORIGIN, GetAction.INSTANCE, getRequest, new ActionListener<GetResponse>() {
@Override
public void onResponse(GetResponse getDocResponse) {
try {
QueryPage<MlFilter> responseBody;
if (getDocResponse.isExists()) {
BytesReference docSource = getDocResponse.getSourceAsBytesRef();
try (InputStream stream = docSource.streamInput();
XContentParser parser = XContentFactory.xContent(XContentType.JSON)
.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)) {
MlFilter filter = MlFilter.LENIENT_PARSER.apply(parser, null).build();
responseBody = new QueryPage<>(Collections.singletonList(filter), 1, MlFilter.RESULTS_FIELD);
GetFiltersAction.Response filterResponse = new GetFiltersAction.Response(responseBody);
listener.onResponse(filterResponse);
}
} else {
this.onFailure(QueryPage.emptyQueryPage(MlFilter.RESULTS_FIELD));
}
} catch (Exception e) {
this.onFailure(e);
}
}
@Override
public void onFailure(Exception e) {
listener.onFailure(e);
}
});
@Override
protected ParseField getResultsField() {
return MlFilter.RESULTS_FIELD;
}
private void getFilters(PageParams pageParams, ActionListener<GetFiltersAction.Response> listener) {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.from(pageParams.getFrom())
.size(pageParams.getSize())
.query(QueryBuilders.termQuery(MlFilter.TYPE.getPreferredName(), MlFilter.FILTER_TYPE));
@Override
protected String[] getIndices() {
return new String[]{MlMetaIndex.INDEX_NAME};
}
SearchRequest searchRequest = new SearchRequest(MlMetaIndex.INDEX_NAME)
.indicesOptions(MlIndicesUtils.addIgnoreUnavailable(SearchRequest.DEFAULT_INDICES_OPTIONS))
.source(sourceBuilder);
@Override
protected MlFilter parse(XContentParser parser) throws IOException {
return MlFilter.LENIENT_PARSER.parse(parser, null).build();
}
executeAsyncWithOrigin(client.threadPool().getThreadContext(), ML_ORIGIN, searchRequest, new ActionListener<SearchResponse>() {
@Override
public void onResponse(SearchResponse response) {
List<MlFilter> docs = new ArrayList<>();
for (SearchHit hit : response.getHits().getHits()) {
BytesReference docSource = hit.getSourceRef();
try (InputStream stream = docSource.streamInput();
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(
NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)) {
docs.add(MlFilter.LENIENT_PARSER.apply(parser, null).build());
} catch (IOException e) {
this.onFailure(e);
}
}
@Override
protected ResourceNotFoundException notFoundException(String resourceId) {
return new ResourceNotFoundException("Unable to find filter [" + resourceId +"]");
}
GetFiltersAction.Response filterResponse = new GetFiltersAction.Response(new QueryPage<>(docs, docs.size(),
MlFilter.RESULTS_FIELD));
listener.onResponse(filterResponse);
}
@Override
protected String executionOrigin() {
return ML_ORIGIN;
}
@Override
protected String extractIdFromResource(MlFilter mlFilter) {
return mlFilter.getId();
}
@Override
public void onFailure(Exception e) {
listener.onFailure(e);
}
},
client::search);
@Override
protected QueryBuilder additionalQuery() {
return QueryBuilders.termQuery(MlFilter.TYPE.getPreferredName(), MlFilter.FILTER_TYPE);
}
}

View File

@ -24,7 +24,7 @@ import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.MlTasks;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction.Response.JobStats;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.config.JobState;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.DataCounts;

View File

@ -12,7 +12,7 @@ import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
import org.elasticsearch.xpack.ml.job.JobManager;
import org.elasticsearch.xpack.ml.job.persistence.JobResultsProvider;

View File

@ -25,7 +25,7 @@ import org.elasticsearch.tasks.Task;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.ml.action.GetOverallBucketsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
import org.elasticsearch.xpack.core.ml.job.results.Bucket;

View File

@ -11,7 +11,7 @@ import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedJobValidator;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;

View File

@ -15,7 +15,7 @@ import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggre
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.datafeed.extractor.ExtractorUtils;
import org.elasticsearch.xpack.core.ml.job.results.Bucket;
import org.elasticsearch.xpack.core.ml.utils.Intervals;

View File

@ -51,7 +51,7 @@ import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
import org.elasticsearch.xpack.core.ml.utils.ToXContentParams;
import org.elasticsearch.xpack.ml.job.persistence.ExpandedIdsMatcher;
import org.elasticsearch.xpack.core.action.util.ExpandedIdsMatcher;
import java.io.IOException;
import java.io.InputStream;

View File

@ -36,7 +36,7 @@ import org.elasticsearch.xpack.core.ml.MlTasks;
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
import org.elasticsearch.xpack.core.ml.action.RevertModelSnapshotAction;
import org.elasticsearch.xpack.core.ml.action.UpdateJobAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisLimits;
import org.elasticsearch.xpack.core.ml.job.config.CategorizationAnalyzerConfig;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;

View File

@ -9,7 +9,7 @@ import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import java.util.ArrayList;

View File

@ -54,6 +54,7 @@ import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.xpack.core.action.util.ExpandedIdsMatcher;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedJobValidator;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;

View File

@ -76,7 +76,7 @@ import org.elasticsearch.xpack.core.ml.action.GetBucketsAction;
import org.elasticsearch.xpack.core.ml.action.GetCategoriesAction;
import org.elasticsearch.xpack.core.ml.action.GetInfluencersAction;
import org.elasticsearch.xpack.core.ml.action.GetRecordsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import org.elasticsearch.xpack.core.ml.calendars.ScheduledEvent;
import org.elasticsearch.xpack.core.ml.job.config.Job;

View File

@ -37,7 +37,7 @@ import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.xpack.core.ml.MlMetadata;
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.ScheduledEvent;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.config.JobState;

View File

@ -16,7 +16,7 @@ import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestToXContentListener;
import org.elasticsearch.xpack.ml.MachineLearning;
import org.elasticsearch.xpack.core.ml.action.GetCalendarEventsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import org.elasticsearch.xpack.core.ml.job.config.Job;

View File

@ -17,7 +17,7 @@ import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestStatusToXContentListener;
import org.elasticsearch.xpack.ml.MachineLearning;
import org.elasticsearch.xpack.core.ml.action.GetCalendarsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import java.io.IOException;

View File

@ -16,7 +16,7 @@ import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestStatusToXContentListener;
import org.elasticsearch.xpack.ml.MachineLearning;
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
import java.io.IOException;

View File

@ -16,7 +16,7 @@ import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestToXContentListener;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.ml.MachineLearning;

View File

@ -17,7 +17,7 @@ import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestToXContentListener;
import org.elasticsearch.xpack.ml.MachineLearning;
import org.elasticsearch.xpack.core.ml.action.GetBucketsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.results.Result;

View File

@ -17,7 +17,7 @@ import org.elasticsearch.rest.action.RestToXContentListener;
import org.elasticsearch.xpack.ml.MachineLearning;
import org.elasticsearch.xpack.core.ml.action.GetCategoriesAction;
import org.elasticsearch.xpack.core.ml.action.GetCategoriesAction.Request;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import java.io.IOException;

View File

@ -16,7 +16,7 @@ import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestToXContentListener;
import org.elasticsearch.xpack.ml.MachineLearning;
import org.elasticsearch.xpack.core.ml.action.GetInfluencersAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import java.io.IOException;

View File

@ -15,7 +15,7 @@ import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestToXContentListener;
import org.elasticsearch.xpack.core.ml.action.GetRecordsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.ml.MachineLearning;

View File

@ -33,7 +33,7 @@ import org.elasticsearch.xpack.core.ml.MachineLearningFeatureSetUsage;
import org.elasticsearch.xpack.core.ml.MachineLearningField;
import org.elasticsearch.xpack.core.ml.action.GetDatafeedsStatsAction;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;

View File

@ -13,7 +13,7 @@ import org.elasticsearch.common.util.concurrent.ThreadContext;
import org.elasticsearch.mock.orig.Mockito;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;
import org.elasticsearch.xpack.core.ml.job.config.Job;

View File

@ -15,7 +15,7 @@ import org.elasticsearch.index.reindex.ReindexPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.xpack.core.ml.action.DeleteJobAction;
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;
import org.elasticsearch.xpack.core.ml.job.config.Detector;

View File

@ -20,7 +20,7 @@ import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.xpack.core.ml.MlMetaIndex;
import org.elasticsearch.xpack.core.ml.MlMetadata;
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.calendars.Calendar;
import org.elasticsearch.xpack.core.ml.calendars.ScheduledEvent;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;

View File

@ -36,7 +36,7 @@ import org.elasticsearch.xpack.core.ml.action.PutDatafeedAction;
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
import org.elasticsearch.xpack.core.ml.action.StartDatafeedAction;
import org.elasticsearch.xpack.core.ml.action.StopDatafeedAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
import org.elasticsearch.xpack.core.ml.job.config.Job;

View File

@ -45,7 +45,7 @@ import org.elasticsearch.xpack.core.ml.MachineLearningField;
import org.elasticsearch.xpack.core.ml.MlMetadata;
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
import org.elasticsearch.xpack.core.ml.action.UpdateJobAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.AnalysisConfig;
import org.elasticsearch.xpack.core.ml.job.config.DataDescription;
import org.elasticsearch.xpack.core.ml.job.config.DetectionRule;

View File

@ -39,7 +39,7 @@ import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndexFields;

View File

@ -9,8 +9,8 @@ import org.elasticsearch.common.ParseField;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.xpack.core.ml.action.GetModelSnapshotsAction;
import org.elasticsearch.xpack.ml.action.TransportGetModelSnapshotsAction;
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.PageParams;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.Quantiles;

View File

@ -36,7 +36,7 @@ import org.elasticsearch.xpack.core.ml.action.GetDatafeedsStatsAction;
import org.elasticsearch.xpack.core.ml.action.GetJobsAction;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction;
import org.elasticsearch.xpack.core.ml.action.StopDatafeedAction;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.client.MachineLearningClient;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;

View File

@ -14,7 +14,7 @@ import org.elasticsearch.xpack.core.XPackSettings;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction.Request;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction.Response;
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction.Response.JobStats;
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
import org.elasticsearch.xpack.core.action.util.QueryPage;
import org.elasticsearch.xpack.core.ml.client.MachineLearningClient;
import org.elasticsearch.xpack.core.ml.job.config.Job;
import org.elasticsearch.xpack.core.monitoring.MonitoredSystem;

View File

@ -88,6 +88,41 @@ setup:
- match: { count: 1 }
---
"Test get filters API with expression ID":
- do:
ml.get_filters:
filter_id: "filter-foo,filter-foo2"
- match: { count: 2 }
- match:
filters.0:
filter_id: "filter-foo"
items: ["abc", "xyz"]
- match:
filters.1:
filter_id: "filter-foo2"
description: "This filter has a description"
items: ["123", "lmnop"]
- do:
ml.get_filters:
filter_id: "filter-foo*"
- match: { count: 2 }
- match:
filters.0:
filter_id: "filter-foo"
items: ["abc", "xyz"]
- match:
filters.1:
filter_id: "filter-foo2"
description: "This filter has a description"
items: ["123", "lmnop"]
---
"Test invalid param combinations":