Skip to content

Commit 63c088a

Browse files
committed
Add async and OIS search template variants
1 parent 185d036 commit 63c088a

File tree

3 files changed

+136
-4
lines changed

3 files changed

+136
-4
lines changed

src/Nest/ElasticClient-SearchTemplate.cs

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
using System.IO;
66
using System.Linq;
77
using System.Text;
8+
using System.Threading.Tasks;
89

910
namespace Nest
1011
{
11-
public partial class ElasticClient
12+
public partial class ElasticClient : IElasticClient
1213
{
1314
public ISearchResponse<T> SearchTemplate<T>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector) where T : class
1415
{
@@ -31,6 +32,77 @@ public ISearchResponse<TResult> SearchTemplate<T, TResult>(Func<SearchTemplateDe
3132
return status.Success ? status.Response : CreateInvalidInstance<SearchResponse<TResult>>(status);
3233
}
3334

35+
public ISearchResponse<T> SearchTemplate<T>(ISearchTemplateRequest request) where T : class
36+
{
37+
return this.SearchTemplate<T, T>(request);
38+
}
39+
40+
public ISearchResponse<TResult> SearchTemplate<T, TResult>(ISearchTemplateRequest request)
41+
where T : class
42+
where TResult : class
43+
{
44+
var pathInfo = request
45+
.ToPathInfo(_connectionSettings)
46+
.DeserializationState(this.CreateSearchDeserializer<T, TResult>(request));
47+
48+
var status = this.RawDispatch.SearchTemplateDispatch<SearchResponse<TResult>>(pathInfo, request);
49+
return status.Success ? status.Response : CreateInvalidInstance<SearchResponse<TResult>>(status);
50+
}
51+
52+
public Task<ISearchResponse<T>> SearchTemplateAsync<T>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector) where T : class
53+
{
54+
return this.SearchTemplateAsync<T, T>(selector);
55+
}
56+
57+
public Task<ISearchResponse<TResult>> SearchTemplateAsync<T, TResult>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector)
58+
where T : class
59+
where TResult : class
60+
{
61+
selector.ThrowIfNull("selector");
62+
var descriptor = selector(new SearchTemplateDescriptor<T>());
63+
64+
IPathInfo<SearchTemplateRequestParameters> p = descriptor;
65+
var pathInfo = p
66+
.ToPathInfo(_connectionSettings)
67+
.DeserializationState(CreateSearchDeserializer<T, TResult>(descriptor));
68+
69+
return this.RawDispatch.SearchTemplateDispatchAsync<SearchResponse<TResult>>(pathInfo, descriptor)
70+
.ContinueWith<ISearchResponse<TResult>>(t =>
71+
{
72+
if (t.IsFaulted)
73+
throw t.Exception.Flatten().InnerException;
74+
75+
return t.Result.Success
76+
? t.Result.Response
77+
: CreateInvalidInstance<SearchResponse<TResult>>(t.Result);
78+
});
79+
}
80+
81+
public Task<ISearchResponse<T>> SearchTemplateAsync<T>(ISearchTemplateRequest request) where T : class
82+
{
83+
return this.SearchTemplateAsync<T, T>(request);
84+
}
85+
86+
public Task<ISearchResponse<TResult>> SearchTemplateAsync<T, TResult>(ISearchTemplateRequest request)
87+
where T : class
88+
where TResult : class
89+
{
90+
var pathInfo = request
91+
.ToPathInfo(_connectionSettings)
92+
.DeserializationState(this.CreateSearchDeserializer<T, TResult>(request));
93+
94+
return this.RawDispatch.SearchTemplateDispatchAsync<SearchResponse<TResult>>(pathInfo, request)
95+
.ContinueWith<ISearchResponse<TResult>>(t =>
96+
{
97+
if (t.IsFaulted)
98+
throw t.Exception.Flatten().InnerException;
99+
100+
return t.Result.Success
101+
? t.Result.Response
102+
: CreateInvalidInstance<SearchResponse<TResult>>(t.Result);
103+
});
104+
}
105+
34106
private SearchResponse<TResult> FieldsSearchDeserializer<T, TResult>(IElasticsearchResponse response, Stream stream, ISearchTemplateRequest d)
35107
where T : class
36108
where TResult : class

src/Nest/IElasticClient.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,9 +774,48 @@ Task<ISearchResponse<TResult>> SearchAsync<T, TResult>(ISearchRequest request)
774774
where T : class
775775
where TResult : class;
776776

777+
/// <summary>
778+
/// The /_search/template endpoint allows to use the mustache language to pre render search
779+
/// requests, before they are executed and fill existing templates with template parameters.
780+
/// </summary>
781+
/// <typeparam name="T">The type used to infer the index and typename as well describe the query strongly typed</typeparam>
782+
/// <param name="selector">A descriptor that describes the parameters for the search operation</param>
783+
/// <returns></returns>
777784
ISearchResponse<T> SearchTemplate<T>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector)
778785
where T : class;
779786

787+
/// <inheritdoc />
788+
ISearchResponse<TResult> SearchTemplate<T, TResult>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector)
789+
where T : class
790+
where TResult : class;
791+
792+
/// <inheritdoc />
793+
ISearchResponse<T> SearchTemplate<T>(ISearchTemplateRequest request)
794+
where T : class;
795+
796+
/// <inheritdoc />
797+
ISearchResponse<TResult> SearchTemplate<T, TResult>(ISearchTemplateRequest request)
798+
where T : class
799+
where TResult : class;
800+
801+
/// <inheritdoc />
802+
Task<ISearchResponse<T>> SearchTemplateAsync<T>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector)
803+
where T : class;
804+
805+
/// <inheritdoc />
806+
Task<ISearchResponse<TResult>> SearchTemplateAsync<T, TResult>(Func<SearchTemplateDescriptor<T>, SearchTemplateDescriptor<T>> selector)
807+
where T : class
808+
where TResult : class;
809+
810+
/// <inheritdoc />
811+
Task<ISearchResponse<T>> SearchTemplateAsync<T>(ISearchTemplateRequest request)
812+
where T : class;
813+
814+
/// <inheritdoc />
815+
Task<ISearchResponse<TResult>> SearchTemplateAsync<T, TResult>(ISearchTemplateRequest request)
816+
where T : class
817+
where TResult : class;
818+
780819
/// <summary>
781820
/// The multi search API allows to execute several search requests within the same API.
782821
/// <para> </para>http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-multi-search.html

src/Tests/Nest.Tests.Integration/Search/Template/SearchTemplateTests.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ namespace Nest.Tests.Integration.Search.Template
1313
[TestFixture]
1414
public class SearchTemplateTests : IntegrationTests
1515
{
16+
private string _template = "{\"from\": \"{{my_from}}\",\"size\": \"{{my_size}}\",\"query\": { \"match\": {\"{{my_field}}\": {\"query\": \"{{my_value}}\" }}}}";
17+
1618
[Test]
1719
public void SearchTemplateByQuery()
1820
{
19-
var template = "{\"from\": \"{{my_from}}\",\"size\": \"{{my_size}}\",\"query\": { \"match\": {\"{{my_field}}\": {\"query\": \"{{my_value}}\" }}}}";
20-
2121
var result = this.Client.SearchTemplate<ElasticsearchProject>(s => s
22-
.Template(template)
22+
.Template(_template)
2323
.Params(p => p
2424
.Add("my_from", 0)
2525
.Add("my_size", 5)
@@ -31,6 +31,27 @@ public void SearchTemplateByQuery()
3131
result.IsValid.Should().BeTrue();
3232
result.Hits.Count().Should().BeGreaterThan(0);
3333
}
34+
35+
[Test]
36+
public void SearchTemplateByQuery_ObjectInitializer()
37+
{
38+
var request = new SearchTemplateRequest
39+
{
40+
Template = _template,
41+
Params = new Dictionary<string, object>
42+
{
43+
{ "my_from", 0 },
44+
{ "my_size", 5 },
45+
{ "my_field", "name" },
46+
{ "my_value", "em-elasticsearch" }
47+
}
48+
};
49+
50+
var result = this.Client.SearchTemplate<ElasticsearchProject>(request);
51+
52+
result.IsValid.Should().BeTrue();
53+
result.Hits.Count().Should().BeGreaterThan(0);
54+
}
3455
}
3556
}
3657

0 commit comments

Comments
 (0)