From c6d8eea8535e6404c01f405ba730098e6b89a5d7 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Tue, 4 May 2021 11:22:32 +0100 Subject: [PATCH] Add NEST support for EQL Get Search API (#5665) * Add initial request and response * Generate code for EQL get status * Add test, update naming and headers * Add initial types * Generate code * Add tests --- .../RequestParameters.Eql.cs | 2 +- .../ElasticLowLevelClient.Eql.cs | 4 +- src/Nest/Descriptors.Eql.cs | 25 ++++++++++ src/Nest/ElasticClient.Eql.cs | 28 +++++++++++ src/Nest/Requests.Eql.cs | 46 +++++++++++++++++++ .../Eql/{Search => }/EqlSearchResponse.cs | 0 src/Nest/XPack/Eql/Get/EqlGetRequest.cs | 29 ++++++++++++ src/Nest/XPack/Eql/Get/EqlGetResponse.cs | 28 +++++++++++ .../_Generated/ApiUrlsLookup.generated.cs | 1 + tests/Tests.Configuration/tests.default.yaml | 4 +- .../XPack/Eql/EqlSearchApiCoordinatedTests.cs | 45 ++++++++++++++++++ tests/Tests/XPack/Eql/Get/EqlGetUrlTests.cs | 37 +++++++++++++++ 12 files changed, 244 insertions(+), 5 deletions(-) rename src/Nest/XPack/Eql/{Search => }/EqlSearchResponse.cs (100%) create mode 100644 src/Nest/XPack/Eql/Get/EqlGetRequest.cs create mode 100644 src/Nest/XPack/Eql/Get/EqlGetResponse.cs create mode 100644 tests/Tests/XPack/Eql/Get/EqlGetUrlTests.cs diff --git a/src/Elasticsearch.Net/Api/RequestParameters/RequestParameters.Eql.cs b/src/Elasticsearch.Net/Api/RequestParameters/RequestParameters.Eql.cs index e4ee61e45ff..00f6df1945f 100644 --- a/src/Elasticsearch.Net/Api/RequestParameters/RequestParameters.Eql.cs +++ b/src/Elasticsearch.Net/Api/RequestParameters/RequestParameters.Eql.cs @@ -50,7 +50,7 @@ public class DeleteRequestParameters : RequestParametersRequest options for Get https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html - public class GetRequestParameters : RequestParameters + public class EqlGetRequestParameters : RequestParameters { public override HttpMethod DefaultHttpMethod => HttpMethod.GET; public override bool SupportsBody => false; diff --git a/src/Elasticsearch.Net/ElasticLowLevelClient.Eql.cs b/src/Elasticsearch.Net/ElasticLowLevelClient.Eql.cs index 55443e7bf5e..3a37712944e 100644 --- a/src/Elasticsearch.Net/ElasticLowLevelClient.Eql.cs +++ b/src/Elasticsearch.Net/ElasticLowLevelClient.Eql.cs @@ -75,13 +75,13 @@ public Task DeleteAsync(string id, DeleteRequestParameters ///GET on /_eql/search/{id} https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html ///The async search ID ///Request specific configuration such as querystring parameters & request specific connection settings. - public TResponse Get(string id, GetRequestParameters requestParameters = null) + public TResponse Get(string id, EqlGetRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new() => DoRequest(GET, Url($"_eql/search/{id:id}"), null, RequestParams(requestParameters)); ///GET on /_eql/search/{id} https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html ///The async search ID ///Request specific configuration such as querystring parameters & request specific connection settings. [MapsApi("eql.get", "id")] - public Task GetAsync(string id, GetRequestParameters requestParameters = null, CancellationToken ctx = default) + public Task GetAsync(string id, EqlGetRequestParameters requestParameters = null, CancellationToken ctx = default) where TResponse : class, IElasticsearchResponse, new() => DoRequestAsync(GET, Url($"_eql/search/{id:id}"), ctx, null, RequestParams(requestParameters)); ///GET on /_eql/search/status/{id} https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html ///The async search ID diff --git a/src/Nest/Descriptors.Eql.cs b/src/Nest/Descriptors.Eql.cs index f179dcb9869..7d1efc74f53 100644 --- a/src/Nest/Descriptors.Eql.cs +++ b/src/Nest/Descriptors.Eql.cs @@ -48,6 +48,31 @@ // ReSharper disable RedundantNameQualifier namespace Nest { + ///Descriptor for Get https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html + public partial class EqlGetDescriptor : RequestDescriptorBase, IEqlGetRequest + { + internal override ApiUrls ApiUrls => ApiUrlsLookups.EqlGet; + ////_eql/search/{id} + ///this parameter is required + public EqlGetDescriptor(Id id): base(r => r.Required("id", id)) + { + } + + ///Used for serialization purposes, making sure we have a parameterless constructor + [SerializationConstructor] + protected EqlGetDescriptor(): base() + { + } + + // values part of the url path + Id IEqlGetRequest.Id => Self.RouteValues.Get("id"); + // Request parameters + ///Update the time interval in which the results (partial or final) for this search will be available + public EqlGetDescriptor KeepAlive(Time keepalive) => Qs("keep_alive", keepalive); + ///Specify the time that the request should block waiting for the final response + public EqlGetDescriptor WaitForCompletionTimeout(Time waitforcompletiontimeout) => Qs("wait_for_completion_timeout", waitforcompletiontimeout); + } + ///Descriptor for SearchStatus https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html public partial class EqlSearchStatusDescriptor : RequestDescriptorBase, IEqlSearchStatusRequest { diff --git a/src/Nest/ElasticClient.Eql.cs b/src/Nest/ElasticClient.Eql.cs index e18fb769e93..c911ad93ae4 100644 --- a/src/Nest/ElasticClient.Eql.cs +++ b/src/Nest/ElasticClient.Eql.cs @@ -54,6 +54,34 @@ internal EqlNamespace(ElasticClient client): base(client) { } + /// + /// GET request to the eql.get API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html + /// + public EqlGetResponse Get(Id id, Func selector = null) + where TDocument : class => Get(selector.InvokeOrDefault(new EqlGetDescriptor(id: id))); + /// + /// GET request to the eql.get API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html + /// + public Task> GetAsync(Id id, Func selector = null, CancellationToken ct = default) + where TDocument : class => GetAsync(selector.InvokeOrDefault(new EqlGetDescriptor(id: id)), ct); + /// + /// GET request to the eql.get API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html + /// + public EqlGetResponse Get(IEqlGetRequest request) + where TDocument : class => DoRequest>(request, request.RequestParameters); + /// + /// GET request to the eql.get API, read more about this API online: + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html + /// + public Task> GetAsync(IEqlGetRequest request, CancellationToken ct = default) + where TDocument : class => DoRequestAsync>(request, request.RequestParameters, ct); /// /// GET request to the eql.get_status API, read more about this API online: /// diff --git a/src/Nest/Requests.Eql.cs b/src/Nest/Requests.Eql.cs index 8a27c46cb6a..ac80de19778 100644 --- a/src/Nest/Requests.Eql.cs +++ b/src/Nest/Requests.Eql.cs @@ -49,6 +49,52 @@ // ReSharper disable RedundantNameQualifier namespace Nest { + [InterfaceDataContract] + public partial interface IEqlGetRequest : IRequest + { + [IgnoreDataMember] + Id Id + { + get; + } + } + + ///Request for Get https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-search-api.html + public partial class EqlGetRequest : PlainRequestBase, IEqlGetRequest + { + protected IEqlGetRequest Self => this; + internal override ApiUrls ApiUrls => ApiUrlsLookups.EqlGet; + ////_eql/search/{id} + ///this parameter is required + public EqlGetRequest(Id id): base(r => r.Required("id", id)) + { + } + + ///Used for serialization purposes, making sure we have a parameterless constructor + [SerializationConstructor] + protected EqlGetRequest(): base() + { + } + + // values part of the url path + [IgnoreDataMember] + Id IEqlGetRequest.Id => Self.RouteValues.Get("id"); + // Request parameters + ///Update the time interval in which the results (partial or final) for this search will be available + public Time KeepAlive + { + get => Q