Skip to content

Commit df2624c

Browse files
committed
Refactor REST get view to actually return the view
1 parent 287c6e4 commit df2624c

File tree

4 files changed

+86
-51
lines changed

4 files changed

+86
-51
lines changed

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,25 @@ private static void loadView(RestClient client, String viewName, String viewFile
618618
request.setJsonEntity("{\"query\":\"" + viewQuery.replace("\"", "\\\"").replace("\n", " ") + "\"}");
619619
Response response = client.performRequest(request);
620620
logger.info("View creation response: {}", response.getStatusLine());
621+
getView(client, viewName, logger);
622+
}
623+
624+
private static boolean getView(RestClient client, String viewName, Logger logger) throws IOException {
625+
Request request = new Request("GET", "/_query/view/" + viewName);
626+
try {
627+
Response response = client.performRequest(request);
628+
logger.info("View response status: {}", response.getStatusLine());
629+
logger.info("View response body info: {}", response.getEntity());
630+
logger.info("View response body: {}", response.getEntity().getContent());
631+
} catch (ResponseException e) {
632+
logger.info("View error: {}", e.getMessage());
633+
int code = e.getResponse().getStatusLine().getStatusCode();
634+
if (code == 400 || code == 404) {
635+
return false;
636+
}
637+
throw e;
638+
}
639+
return true;
621640
}
622641

623642
private static boolean clusterHasViewSupport(RestClient client, Logger logger) throws IOException {

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/GetViewAction.java

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@
66
*/
77
package org.elasticsearch.xpack.esql.view;
88

9+
import org.elasticsearch.action.ActionRequest;
910
import org.elasticsearch.action.ActionRequestValidationException;
11+
import org.elasticsearch.action.ActionResponse;
1012
import org.elasticsearch.action.ActionType;
11-
import org.elasticsearch.action.support.master.AcknowledgedResponse;
12-
import org.elasticsearch.action.support.master.MasterNodeRequest;
13+
import org.elasticsearch.action.support.TransportAction;
1314
import org.elasticsearch.common.io.stream.StreamInput;
1415
import org.elasticsearch.common.io.stream.StreamOutput;
15-
import org.elasticsearch.core.TimeValue;
16+
import org.elasticsearch.xcontent.ToXContentObject;
17+
import org.elasticsearch.xcontent.XContentBuilder;
1618

1719
import java.io.IOException;
1820
import java.util.Objects;
1921

20-
public class GetViewAction extends ActionType<AcknowledgedResponse> {
22+
public class GetViewAction extends ActionType<GetViewAction.Response> {
2123

2224
public static final GetViewAction INSTANCE = new GetViewAction();
2325
public static final String NAME = "cluster:admin/xpack/esql/view/get";
@@ -26,17 +28,15 @@ private GetViewAction() {
2628
super(NAME);
2729
}
2830

29-
public static class Request extends MasterNodeRequest<GetViewAction.Request> {
30-
private final String name;
31+
public static class Request extends ActionRequest {
32+
private String name;
3133

32-
public Request(TimeValue masterNodeTimeout, String name) {
33-
super(masterNodeTimeout);
34+
public Request(String name) {
3435
this.name = Objects.requireNonNull(name, "name cannot be null");
3536
}
3637

3738
public Request(StreamInput in) throws IOException {
3839
super(in);
39-
name = in.readString();
4040
}
4141

4242
@Override
@@ -67,4 +67,49 @@ public int hashCode() {
6767
return name.hashCode();
6868
}
6969
}
70+
71+
public static class Response extends ActionResponse implements ToXContentObject {
72+
73+
private final View view;
74+
75+
public Response(final View view) {
76+
this.view = view;
77+
}
78+
79+
public View getView() {
80+
return view;
81+
}
82+
83+
@Override
84+
public void writeTo(StreamOutput out) throws IOException {
85+
TransportAction.localOnly();
86+
}
87+
88+
@Override
89+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
90+
view.toXContent(builder, params);
91+
return builder;
92+
}
93+
94+
@Override
95+
public boolean equals(Object o) {
96+
if (this == o) {
97+
return true;
98+
}
99+
if (o == null || getClass() != o.getClass()) {
100+
return false;
101+
}
102+
return view.equals(((Response) o).view);
103+
}
104+
105+
@Override
106+
public int hashCode() {
107+
return view.hashCode();
108+
}
109+
110+
@Override
111+
public String toString() {
112+
return "GetViewAction.Response{view=" + view.toString() + '}';
113+
}
114+
}
70115
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/RestGetViewAction.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.elasticsearch.client.internal.node.NodeClient;
1111
import org.elasticsearch.rest.BaseRestHandler;
1212
import org.elasticsearch.rest.RestRequest;
13-
import org.elasticsearch.rest.RestUtils;
1413
import org.elasticsearch.rest.Scope;
1514
import org.elasticsearch.rest.ServerlessScope;
1615
import org.elasticsearch.rest.action.RestToXContentListener;
@@ -33,8 +32,8 @@ public String getName() {
3332
}
3433

3534
@Override
36-
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
37-
GetViewAction.Request req = new GetViewAction.Request(RestUtils.getMasterNodeTimeout(request), request.param("name"));
38-
return channel -> client.execute(GetViewAction.INSTANCE, req, new RestToXContentListener<>(channel));
35+
protected RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
36+
GetViewAction.Request req = new GetViewAction.Request(request.param("name"));
37+
return channel -> client.execute(TransportGetViewAction.TYPE, req, new RestToXContentListener<>(channel));
3938
}
4039
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/TransportGetViewAction.java

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,60 +7,32 @@
77
package org.elasticsearch.xpack.esql.view;
88

99
import org.elasticsearch.action.ActionListener;
10+
import org.elasticsearch.action.ActionType;
11+
import org.elasticsearch.action.admin.cluster.remote.RemoteInfoResponse;
1012
import org.elasticsearch.action.support.ActionFilters;
11-
import org.elasticsearch.action.support.master.AcknowledgedResponse;
12-
import org.elasticsearch.action.support.master.AcknowledgedTransportMasterNodeAction;
13-
import org.elasticsearch.cluster.ClusterState;
14-
import org.elasticsearch.cluster.block.ClusterBlockException;
15-
import org.elasticsearch.cluster.block.ClusterBlockLevel;
16-
import org.elasticsearch.cluster.service.ClusterService;
13+
import org.elasticsearch.action.support.HandledTransportAction;
1714
import org.elasticsearch.common.util.concurrent.EsExecutors;
1815
import org.elasticsearch.injection.guice.Inject;
1916
import org.elasticsearch.tasks.Task;
20-
import org.elasticsearch.threadpool.ThreadPool;
2117
import org.elasticsearch.transport.TransportService;
22-
import org.elasticsearch.xpack.core.ml.action.InferModelAction;
2318

24-
public class TransportGetViewAction extends AcknowledgedTransportMasterNodeAction<GetViewAction.Request> {
19+
public class TransportGetViewAction extends HandledTransportAction<GetViewAction.Request, GetViewAction.Response> {
20+
public static final ActionType<RemoteInfoResponse> TYPE = new ActionType<>(GetViewAction.NAME);
2521
private final ViewService viewService;
2622

2723
@Inject
28-
public TransportGetViewAction(
29-
TransportService transportService,
30-
ClusterService clusterService,
31-
ThreadPool threadPool,
32-
ActionFilters actionFilters,
33-
ViewService viewService
34-
) {
35-
super(
36-
GetViewAction.NAME,
37-
transportService,
38-
clusterService,
39-
threadPool,
40-
actionFilters,
41-
GetViewAction.Request::new,
42-
EsExecutors.DIRECT_EXECUTOR_SERVICE
43-
);
24+
public TransportGetViewAction(TransportService transportService, ActionFilters actionFilters, ViewService viewService) {
25+
super(GetViewAction.NAME, transportService, actionFilters, GetViewAction.Request::new, EsExecutors.DIRECT_EXECUTOR_SERVICE);
4426
this.viewService = viewService;
4527
}
4628

4729
@Override
48-
protected void masterOperation(
49-
Task task,
50-
GetViewAction.Request request,
51-
ClusterState state,
52-
ActionListener<AcknowledgedResponse> listener
53-
) {
30+
protected void doExecute(Task task, GetViewAction.Request request, ActionListener<GetViewAction.Response> listener) {
5431
View view = viewService.get(request.name());
5532
if (view == null) {
56-
listener.onResponse(AcknowledgedResponse.FALSE);
33+
listener.onFailure(new IllegalArgumentException("View [" + request.name() + "] does not exist"));
5734
} else {
58-
listener.onResponse(AcknowledgedResponse.TRUE);
35+
listener.onResponse(new GetViewAction.Response(view));
5936
}
6037
}
61-
62-
@Override
63-
protected ClusterBlockException checkBlock(GetViewAction.Request request, ClusterState state) {
64-
return state.blocks().globalBlockedException(ClusterBlockLevel.METADATA_READ);
65-
}
6638
}

0 commit comments

Comments
 (0)