Skip to content

Commit 1b4325a

Browse files
committed
Merge pull request #1939 from elastic/feature/render-search-template
fix #1924 add support for render template
2 parents 1bedb1a + b42b5b2 commit 1b4325a

File tree

7 files changed

+204
-0
lines changed

7 files changed

+204
-0
lines changed

src/Nest/Nest.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,9 @@
10841084
<Compile Include="Search\SearchTemplate\DeleteSearchTemplate\DeleteSearchTemplateResponse.cs" />
10851085
<Compile Include="Search\SearchTemplate\DeleteSearchTemplate\ElasticClient-DeleteSearchTemplate.cs" />
10861086
<Compile Include="Search\SearchTemplate\ElasticClient-SearchTemplate.cs" />
1087+
<Compile Include="Search\SearchTemplate\RenderSearchTemplate\ElasticClient-RenderSearchTemplate.cs" />
1088+
<Compile Include="Search\SearchTemplate\RenderSearchTemplate\RenderSearchTemplateRequest.cs" />
1089+
<Compile Include="Search\SearchTemplate\RenderSearchTemplate\RenderSearchTemplateResponse.cs" />
10871090
<Compile Include="Search\SearchTemplate\GetSearchTemplate\ElasticClient-GetSearchTemplate.cs" />
10881091
<Compile Include="Search\SearchTemplate\GetSearchTemplate\GetSearchTemplateRequest.cs" />
10891092
<Compile Include="Search\SearchTemplate\GetSearchTemplate\GetSearchTemplateResponse.cs" />
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Elasticsearch.Net;
4+
5+
namespace Nest
6+
{
7+
public partial interface IElasticClient
8+
{
9+
/// <inheritdoc/>
10+
IRenderSearchTemplateResponse RenderSearchTemplate(Func<RenderSearchTemplateDescriptor, IRenderSearchTemplateRequest> selector);
11+
12+
/// <inheritdoc/>
13+
IRenderSearchTemplateResponse RenderSearchTemplate(IRenderSearchTemplateRequest request);
14+
15+
/// <inheritdoc/>
16+
Task<IRenderSearchTemplateResponse> RenderSearchTemplateAsync(Func<RenderSearchTemplateDescriptor, IRenderSearchTemplateRequest> selector);
17+
18+
/// <inheritdoc/>
19+
Task<IRenderSearchTemplateResponse> RenderSearchTemplateAsync(IRenderSearchTemplateRequest request);
20+
}
21+
public partial class ElasticClient
22+
{
23+
public IRenderSearchTemplateResponse RenderSearchTemplate(Func<RenderSearchTemplateDescriptor, IRenderSearchTemplateRequest> selector) =>
24+
this.RenderSearchTemplate(selector.InvokeOrDefault(new RenderSearchTemplateDescriptor()));
25+
26+
public IRenderSearchTemplateResponse RenderSearchTemplate(IRenderSearchTemplateRequest request) =>
27+
this.Dispatcher.Dispatch<IRenderSearchTemplateRequest, RenderSearchTemplateRequestParameters, RenderSearchTemplateResponse>(
28+
request,
29+
(p, d) => this.LowLevelDispatch.RenderSearchTemplateDispatch<RenderSearchTemplateResponse>(p, d)
30+
);
31+
32+
public Task<IRenderSearchTemplateResponse> RenderSearchTemplateAsync(Func<RenderSearchTemplateDescriptor, IRenderSearchTemplateRequest> selector) =>
33+
this.RenderSearchTemplateAsync(selector.InvokeOrDefault(new RenderSearchTemplateDescriptor()));
34+
35+
public Task<IRenderSearchTemplateResponse> RenderSearchTemplateAsync(IRenderSearchTemplateRequest request) =>
36+
this.Dispatcher.DispatchAsync<IRenderSearchTemplateRequest, RenderSearchTemplateRequestParameters, RenderSearchTemplateResponse, IRenderSearchTemplateResponse>(
37+
request,
38+
(p, d) => this.LowLevelDispatch.RenderSearchTemplateDispatchAsync<RenderSearchTemplateResponse>(p, d)
39+
);
40+
}
41+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
5+
namespace Nest
6+
{
7+
public partial interface IRenderSearchTemplateRequest
8+
{
9+
[JsonProperty("inline")]
10+
string Inline { get; set; }
11+
12+
[JsonProperty("file")]
13+
string File { get; set; }
14+
15+
[JsonProperty("params")]
16+
[JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))]
17+
Dictionary<string, object> Params { get; set; }
18+
19+
}
20+
21+
public partial class RenderSearchTemplateRequest
22+
{
23+
public string Inline { get; set; }
24+
public string File { get; set; }
25+
public Dictionary<string, object> Params { get; set; }
26+
}
27+
28+
29+
public partial class RenderSearchTemplateDescriptor
30+
{
31+
string IRenderSearchTemplateRequest.Inline { get; set; }
32+
string IRenderSearchTemplateRequest.File { get; set; }
33+
Dictionary<string, object> IRenderSearchTemplateRequest.Params { get; set; }
34+
35+
public RenderSearchTemplateDescriptor Inline(string inline) => Assign(a => a.Inline = inline);
36+
37+
public RenderSearchTemplateDescriptor File(string file) => Assign(a => a.File = file);
38+
39+
public RenderSearchTemplateDescriptor Params(Dictionary<string, object> scriptParams) => Assign(a => a.Params = scriptParams);
40+
41+
public RenderSearchTemplateDescriptor Params(Func<FluentDictionary<string, object>, FluentDictionary<string, object>> paramsSelector) =>
42+
Assign(a => a.Params = paramsSelector?.Invoke(new FluentDictionary<string, object>()));
43+
44+
}
45+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Newtonsoft.Json;
2+
3+
namespace Nest
4+
{
5+
public interface IRenderSearchTemplateResponse : IResponse
6+
{
7+
ILazyDocument TemplateOutput { get; set; }
8+
}
9+
10+
[JsonObject]
11+
public class RenderSearchTemplateResponse : ResponseBase, IRenderSearchTemplateResponse
12+
{
13+
[JsonProperty("template_output")]
14+
public ILazyDocument TemplateOutput { get; set; }
15+
}
16+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
using Elasticsearch.Net;
5+
using FluentAssertions;
6+
using Nest;
7+
using Tests.Framework;
8+
using Tests.Framework.Integration;
9+
using Xunit;
10+
11+
namespace Tests.Search.SearchTemplate.RenderSearchTemplate
12+
{
13+
[Collection(IntegrationContext.ReadOnly)]
14+
public class RenderSearchTemplateApiTests : ApiIntegrationTestBase<IRenderSearchTemplateResponse, IRenderSearchTemplateRequest, RenderSearchTemplateDescriptor, RenderSearchTemplateRequest>
15+
{
16+
public RenderSearchTemplateApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
17+
18+
protected override LazyResponses ClientUsage() => Calls(
19+
fluent: (c, f) => c.RenderSearchTemplate(f),
20+
fluentAsync: (c, f) => c.RenderSearchTemplateAsync(f),
21+
request: (c, r) => c.RenderSearchTemplate(r),
22+
requestAsync: (c, r) => c.RenderSearchTemplateAsync(r)
23+
);
24+
25+
protected override HttpMethod HttpMethod => HttpMethod.POST;
26+
protected override string UrlPath => $"/_render/template";
27+
protected override int ExpectStatusCode => 200;
28+
protected override bool ExpectIsValid => true;
29+
30+
private static string inlineSearchTemplate = @"
31+
{
32+
""query"": {
33+
""terms"": {
34+
""status"": [
35+
""{{#status}}"",
36+
""{{.}}"",
37+
""{{/status}}""
38+
]
39+
}
40+
}
41+
}";
42+
private string[] statusValues = new[] { "pending", "published" };
43+
44+
protected override Func<RenderSearchTemplateDescriptor, IRenderSearchTemplateRequest> Fluent => s=>s
45+
.Inline(inlineSearchTemplate)
46+
.Params(p=>p
47+
.Add("status", statusValues)
48+
);
49+
50+
51+
protected override RenderSearchTemplateRequest Initializer => new RenderSearchTemplateRequest
52+
{
53+
Inline = inlineSearchTemplate,
54+
Params = new Dictionary<string, object>
55+
{
56+
{ "status", statusValues }
57+
}
58+
};
59+
60+
[I] public Task AssertResponse() => this.AssertOnAllResponses(r =>
61+
{
62+
r.TemplateOutput.Should().NotBeNull();
63+
var searchRequest = r.TemplateOutput.As<ISearchRequest>();
64+
searchRequest.Should().NotBeNull();
65+
66+
searchRequest.Query.Should().NotBeNull();
67+
});
68+
}
69+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Threading.Tasks;
2+
using Nest;
3+
using Tests.Framework;
4+
using static Tests.Framework.UrlTester;
5+
6+
namespace Tests.Search.SearchTemplate.RenderSearchTemplate
7+
{
8+
public class RenderSearchTemplateUrlTests
9+
{
10+
[U] public async Task Urls()
11+
{
12+
var id = "the-id";
13+
await POST("/_render/template/the-id")
14+
.Fluent(c => c.RenderSearchTemplate(s=>s.Id(id)))
15+
.Request(c=>c.RenderSearchTemplate(new RenderSearchTemplateRequest(id)))
16+
.FluentAsync(c => c.RenderSearchTemplateAsync(s=>s.Id(id)))
17+
.RequestAsync(c=>c.RenderSearchTemplateAsync(new RenderSearchTemplateRequest(id)))
18+
;
19+
20+
await POST("/_render/template")
21+
.Fluent(c => c.RenderSearchTemplate(s=>s.Inline("")))
22+
.Request(c=>c.RenderSearchTemplate(new RenderSearchTemplateRequest { Inline = "" }))
23+
.FluentAsync(c => c.RenderSearchTemplateAsync(s=>s.Inline("")))
24+
.RequestAsync(c=>c.RenderSearchTemplateAsync(new RenderSearchTemplateRequest { Inline = "" }))
25+
;
26+
}
27+
}
28+
}

src/Tests/Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,8 @@
545545
<Compile Include="Search\Request\ProfileUsageTests.cs" />
546546
<Compile Include="Indices\StatusManagement\ForceMerge\ForceMergeApiTests.cs" />
547547
<Compile Include="Indices\StatusManagement\ForceMerge\ForceMergeUrlTests.cs" />
548+
<Compile Include="Search\SearchTemplate\RenderSearchTemplate\RenderSearchTemplateApiTests.cs" />
549+
<Compile Include="Search\SearchTemplate\RenderSearchTemplate\RenderSearchTemplateUrlTests.cs" />
548550
<None Include="index.asciidoc" />
549551
<None Include="paket.references" />
550552
<None Include="tests.yaml" />

0 commit comments

Comments
 (0)