Skip to content

Commit 853eb9e

Browse files
committed
HLRC: Adding ml get filters api (#35502)
* HLRC: Adding ml get filters api * refactoring setId name
1 parent da117fa commit 853eb9e

File tree

12 files changed

+573
-5
lines changed

12 files changed

+573
-5
lines changed

client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.elasticsearch.client.ml.GetCategoriesRequest;
4040
import org.elasticsearch.client.ml.GetDatafeedRequest;
4141
import org.elasticsearch.client.ml.GetDatafeedStatsRequest;
42+
import org.elasticsearch.client.ml.GetFiltersRequest;
4243
import org.elasticsearch.client.ml.GetInfluencersRequest;
4344
import org.elasticsearch.client.ml.GetJobRequest;
4445
import org.elasticsearch.client.ml.GetJobStatsRequest;
@@ -55,6 +56,7 @@
5556
import org.elasticsearch.client.ml.StopDatafeedRequest;
5657
import org.elasticsearch.client.ml.UpdateDatafeedRequest;
5758
import org.elasticsearch.client.ml.UpdateJobRequest;
59+
import org.elasticsearch.client.ml.job.util.PageParams;
5860
import org.elasticsearch.common.Strings;
5961
import org.elasticsearch.common.bytes.BytesReference;
6062

@@ -476,4 +478,22 @@ static Request putFilter(PutFilterRequest putFilterRequest) throws IOException {
476478
request.setEntity(createEntity(putFilterRequest, REQUEST_BODY_CONTENT_TYPE));
477479
return request;
478480
}
481+
482+
static Request getFilter(GetFiltersRequest getFiltersRequest) {
483+
String endpoint = new EndpointBuilder()
484+
.addPathPartAsIs("_xpack")
485+
.addPathPartAsIs("ml")
486+
.addPathPartAsIs("filters")
487+
.addPathPart(getFiltersRequest.getFilterId())
488+
.build();
489+
Request request = new Request(HttpGet.METHOD_NAME, endpoint);
490+
RequestConverters.Params params = new RequestConverters.Params(request);
491+
if (getFiltersRequest.getSize() != null) {
492+
params.putParam(PageParams.SIZE.getPreferredName(), getFiltersRequest.getSize().toString());
493+
}
494+
if (getFiltersRequest.getFrom() != null) {
495+
params.putParam(PageParams.FROM.getPreferredName(), getFiltersRequest.getFrom().toString());
496+
}
497+
return request;
498+
}
479499
}

client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.elasticsearch.client.ml.GetDatafeedResponse;
4242
import org.elasticsearch.client.ml.GetDatafeedStatsRequest;
4343
import org.elasticsearch.client.ml.GetDatafeedStatsResponse;
44+
import org.elasticsearch.client.ml.GetFiltersRequest;
45+
import org.elasticsearch.client.ml.GetFiltersResponse;
4446
import org.elasticsearch.client.ml.GetInfluencersRequest;
4547
import org.elasticsearch.client.ml.GetInfluencersResponse;
4648
import org.elasticsearch.client.ml.GetJobRequest;
@@ -1207,4 +1209,41 @@ public void putFilterAsync(PutFilterRequest request, RequestOptions options, Act
12071209
Collections.emptySet());
12081210
}
12091211

1212+
/**
1213+
* Gets Machine Learning Filters
1214+
* <p>
1215+
* For additional info
1216+
* see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-get-filter.html">ML GET Filter documentation</a>
1217+
*
1218+
* @param request The request
1219+
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
1220+
* @return GetFilterResponse with enclosed {@link org.elasticsearch.client.ml.job.config.MlFilter} objects
1221+
* @throws IOException when there is a serialization issue sending the request or receiving the response
1222+
*/
1223+
public GetFiltersResponse getFilter(GetFiltersRequest request, RequestOptions options) throws IOException {
1224+
return restHighLevelClient.performRequestAndParseEntity(request,
1225+
MLRequestConverters::getFilter,
1226+
options,
1227+
GetFiltersResponse::fromXContent,
1228+
Collections.emptySet());
1229+
}
1230+
1231+
/**
1232+
* Gets Machine Learning Filters asynchronously and notifies listener on completion
1233+
* <p>
1234+
* For additional info
1235+
* see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-get-filter.html">ML GET Filter documentation</a>
1236+
*
1237+
* @param request The request
1238+
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
1239+
* @param listener Listener to be notified upon request completion
1240+
*/
1241+
public void getFilterAsync(GetFiltersRequest request, RequestOptions options, ActionListener<GetFiltersResponse> listener) {
1242+
restHighLevelClient.performRequestAsyncAndParseEntity(request,
1243+
MLRequestConverters::getFilter,
1244+
options,
1245+
GetFiltersResponse::fromXContent,
1246+
listener,
1247+
Collections.emptySet());
1248+
}
12101249
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.elasticsearch.client.ml;
20+
21+
import org.elasticsearch.action.ActionRequest;
22+
import org.elasticsearch.action.ActionRequestValidationException;
23+
import org.elasticsearch.client.ml.job.config.MlFilter;
24+
import org.elasticsearch.client.ml.job.util.PageParams;
25+
import org.elasticsearch.common.xcontent.ObjectParser;
26+
import org.elasticsearch.common.xcontent.ToXContentObject;
27+
import org.elasticsearch.common.xcontent.XContentBuilder;
28+
29+
import java.io.IOException;
30+
import java.util.Objects;
31+
32+
/**
33+
* A request to retrieve {@link MlFilter}s
34+
*/
35+
public class GetFiltersRequest extends ActionRequest implements ToXContentObject {
36+
37+
public static final ObjectParser<GetFiltersRequest, Void> PARSER =
38+
new ObjectParser<>("get_filters_request", GetFiltersRequest::new);
39+
40+
static {
41+
PARSER.declareString(GetFiltersRequest::setFilterId, MlFilter.ID);
42+
PARSER.declareInt(GetFiltersRequest::setFrom, PageParams.FROM);
43+
PARSER.declareInt(GetFiltersRequest::setSize, PageParams.SIZE);
44+
}
45+
46+
private String filterId;
47+
private Integer from;
48+
private Integer size;
49+
50+
public String getFilterId() {
51+
return filterId;
52+
}
53+
54+
public Integer getFrom() {
55+
return from;
56+
}
57+
58+
public Integer getSize() {
59+
return size;
60+
}
61+
62+
/**
63+
* Sets the filter id
64+
* @param filterId the filter id
65+
*/
66+
public void setFilterId(String filterId) {
67+
this.filterId = filterId;
68+
}
69+
70+
/**
71+
* Sets the number of filters to skip.
72+
* @param from set the `from` parameter
73+
*/
74+
public void setFrom(Integer from) {
75+
this.from = from;
76+
}
77+
78+
/**
79+
* Sets the number of filters to return.
80+
* @param size set the `size` parameter
81+
*/
82+
public void setSize(Integer size) {
83+
this.size = size;
84+
}
85+
86+
@Override
87+
public ActionRequestValidationException validate() {
88+
return null;
89+
}
90+
91+
@Override
92+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
93+
builder.startObject();
94+
if (filterId != null) {
95+
builder.field(MlFilter.ID.getPreferredName(), filterId);
96+
}
97+
if (from != null) {
98+
builder.field(PageParams.FROM.getPreferredName(), from);
99+
}
100+
if (size != null) {
101+
builder.field(PageParams.SIZE.getPreferredName(), size);
102+
}
103+
builder.endObject();
104+
return builder;
105+
}
106+
107+
@Override
108+
public boolean equals(Object obj) {
109+
if (obj == null) {
110+
return false;
111+
}
112+
if (getClass() != obj.getClass()) {
113+
return false;
114+
}
115+
GetFiltersRequest request = (GetFiltersRequest) obj;
116+
return Objects.equals(filterId, request.filterId)
117+
&& Objects.equals(from, request.from)
118+
&& Objects.equals(size, request.size);
119+
}
120+
121+
@Override
122+
public int hashCode() {
123+
return Objects.hash(filterId, from, size);
124+
}
125+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.elasticsearch.client.ml;
20+
21+
import org.elasticsearch.client.ml.job.config.MlFilter;
22+
import org.elasticsearch.common.ParseField;
23+
import org.elasticsearch.common.Strings;
24+
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
25+
import org.elasticsearch.common.xcontent.XContentParser;
26+
27+
import java.io.IOException;
28+
import java.util.List;
29+
import java.util.Objects;
30+
import java.util.stream.Collectors;
31+
32+
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
33+
34+
/**
35+
* Contains a {@link List} of the found {@link MlFilter} objects and the total count found
36+
*/
37+
public class GetFiltersResponse extends AbstractResultResponse<MlFilter> {
38+
39+
public static final ParseField RESULTS_FIELD = new ParseField("filters");
40+
41+
@SuppressWarnings("unchecked")
42+
public static final ConstructingObjectParser<GetFiltersResponse, Void> PARSER =
43+
new ConstructingObjectParser<>("get_filters_response", true,
44+
a -> new GetFiltersResponse((List<MlFilter.Builder>) a[0], (long) a[1]));
45+
46+
static {
47+
PARSER.declareObjectArray(constructorArg(), MlFilter.PARSER, RESULTS_FIELD);
48+
PARSER.declareLong(constructorArg(), AbstractResultResponse.COUNT);
49+
}
50+
51+
GetFiltersResponse(List<MlFilter.Builder> filters, long count) {
52+
super(RESULTS_FIELD, filters.stream().map(MlFilter.Builder::build).collect(Collectors.toList()), count);
53+
}
54+
55+
/**
56+
* The collection of {@link MlFilter} objects found in the query
57+
*/
58+
public List<MlFilter> filters() {
59+
return results;
60+
}
61+
62+
public static GetFiltersResponse fromXContent(XContentParser parser) throws IOException {
63+
return PARSER.parse(parser, null);
64+
}
65+
66+
@Override
67+
public int hashCode() {
68+
return Objects.hash(results, count);
69+
}
70+
71+
@Override
72+
public boolean equals(Object obj) {
73+
if (this == obj) {
74+
return true;
75+
}
76+
77+
if (obj == null || getClass() != obj.getClass()) {
78+
return false;
79+
}
80+
81+
GetFiltersResponse other = (GetFiltersResponse) obj;
82+
return Objects.equals(results, other.results) && count == other.count;
83+
}
84+
85+
@Override
86+
public final String toString() {
87+
return Strings.toString(this);
88+
}
89+
}

client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.elasticsearch.client.ml.GetCategoriesRequest;
3636
import org.elasticsearch.client.ml.GetDatafeedRequest;
3737
import org.elasticsearch.client.ml.GetDatafeedStatsRequest;
38+
import org.elasticsearch.client.ml.GetFiltersRequest;
3839
import org.elasticsearch.client.ml.GetInfluencersRequest;
3940
import org.elasticsearch.client.ml.GetJobRequest;
4041
import org.elasticsearch.client.ml.GetJobStatsRequest;
@@ -77,6 +78,8 @@
7778
import java.util.Map;
7879

7980
import static org.hamcrest.Matchers.equalTo;
81+
import static org.hamcrest.Matchers.is;
82+
import static org.hamcrest.core.IsNull.nullValue;
8083

8184
public class MLRequestConvertersTests extends ESTestCase {
8285

@@ -515,7 +518,7 @@ public void testDeleteCalendar() {
515518
}
516519

517520
public void testPutFilter() throws IOException {
518-
MlFilter filter = MlFilterTests.createRandom("foo");
521+
MlFilter filter = MlFilterTests.createRandomBuilder("foo").build();
519522
PutFilterRequest putFilterRequest = new PutFilterRequest(filter);
520523

521524
Request request = MLRequestConverters.putFilter(putFilterRequest);
@@ -528,6 +531,25 @@ public void testPutFilter() throws IOException {
528531
}
529532
}
530533

534+
public void testGetFilter() throws IOException {
535+
String id = randomAlphaOfLength(10);
536+
GetFiltersRequest getFiltersRequest = new GetFiltersRequest();
537+
538+
getFiltersRequest.setFilterId(id);
539+
540+
Request request = MLRequestConverters.getFilter(getFiltersRequest);
541+
assertEquals(HttpGet.METHOD_NAME, request.getMethod());
542+
assertEquals("/_xpack/ml/filters/" + id, request.getEndpoint());
543+
assertThat(request.getParameters().get(PageParams.FROM.getPreferredName()), is(nullValue()));
544+
assertThat(request.getParameters().get(PageParams.SIZE.getPreferredName()), is(nullValue()));
545+
546+
getFiltersRequest.setFrom(1);
547+
getFiltersRequest.setSize(10);
548+
request = MLRequestConverters.getFilter(getFiltersRequest);
549+
assertThat(request.getParameters().get(PageParams.FROM.getPreferredName()), equalTo("1"));
550+
assertThat(request.getParameters().get(PageParams.SIZE.getPreferredName()), equalTo("10"));
551+
}
552+
531553
private static Job createValidJob(String jobId) {
532554
AnalysisConfig.Builder analysisConfig = AnalysisConfig.builder(Collections.singletonList(
533555
Detector.builder().setFunction("count").build()));

0 commit comments

Comments
 (0)