Skip to content

Commit 498eaa8

Browse files
committed
added template API syntax spike as a unit tests so @gmarz and I can itterate over it together
1 parent d9f24be commit 498eaa8

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
using System;
2+
using Elasticsearch.Net;
3+
using Elasticsearch.Net.Connection;
4+
using FluentAssertions;
5+
using Newtonsoft.Json;
6+
using NUnit.Framework;
7+
using System.Collections.Generic;
8+
9+
namespace Nest.Tests.Unit.Template
10+
{
11+
[TestFixture]
12+
public class TemplateSpikeTests : BaseJsonTests
13+
{
14+
[Test]
15+
public void Print()
16+
{
17+
18+
var search = this._client.Search<object>(s => s
19+
.Strict()
20+
.Query(q =>
21+
Template.If("start",
22+
q.Range(r => r
23+
.OnField("fieldx")
24+
.Greater(Template.Variable("start"))
25+
.Lower(Template.Variable("end", "20"))
26+
)
27+
)
28+
&& Template.If("other_var", new TermQuery()
29+
{
30+
Field = Template.Variable("myfield"),
31+
Value = Template.Variable("myval")
32+
})
33+
&& q.Terms("field", Template.Array("array"))
34+
)
35+
.Sort(Template.If<object>("sort", sort => sort.Ascending().OnField("{{sort}}")))
36+
);
37+
Assert.Fail(search.ConnectionStatus.ToString());
38+
}
39+
40+
}
41+
42+
interface IIfTemplate
43+
{
44+
object Instance { get; }
45+
string Variable { get; }
46+
}
47+
// Define other methods and classes here
48+
public static class Template
49+
{
50+
[JsonConverter(typeof(IfTemplateConverter))]
51+
private class IfSortFieldDescriptor : SortFieldDescriptor<object>, IIfTemplate
52+
{
53+
private readonly IFieldSort _queryContainer;
54+
private readonly string _variable;
55+
object IIfTemplate.Instance { get { return _queryContainer; } }
56+
string IIfTemplate.Variable { get { return _variable; } }
57+
public IfSortFieldDescriptor(string variable, IFieldSort o)
58+
{
59+
_variable = variable;
60+
_queryContainer = o;
61+
}
62+
}
63+
64+
65+
[JsonConverter(typeof(IfTemplateConverter))]
66+
private class IfQueryContainer : QueryContainer, IIfTemplate
67+
{
68+
private readonly QueryContainer _queryContainer;
69+
private readonly string _variable;
70+
object IIfTemplate.Instance { get { return _queryContainer; } }
71+
string IIfTemplate.Variable { get { return _variable; } }
72+
public IfQueryContainer(string variable, QueryContainer o)
73+
{
74+
_variable = variable;
75+
_queryContainer = o;
76+
}
77+
}
78+
public static Func<SortFieldDescriptor<T>, IFieldSort> If<T>(string variable, Func<SortFieldDescriptor<T>, IFieldSort> s)
79+
where T : class
80+
{
81+
return new Func<SortFieldDescriptor<T>, IFieldSort>(inner => new IfSortFieldDescriptor(variable, s(inner)));
82+
}
83+
public static QueryContainer If(string variable, QueryContainer o)
84+
{
85+
return new IfQueryContainer(variable, o);
86+
}
87+
88+
public static string Variable(string name, string defaultValue = null)
89+
{
90+
if (!string.IsNullOrWhiteSpace(defaultValue))
91+
return "{{" + name + "}}{{^" + name + "}}" + defaultValue + "{{/" + name + "}}";
92+
return "{{" + name + "}}";
93+
}
94+
public static IEnumerable<string> Array(string name)
95+
{
96+
return new[] {
97+
"{{#"+name+"}",
98+
"{{.}}",
99+
"{{/" + name + "}"
100+
101+
};
102+
}
103+
}
104+
105+
public class IfTemplateConverter : JsonConverter
106+
{
107+
public override bool CanWrite { get { return true; } }
108+
109+
public override bool CanRead { get { return false; } }
110+
111+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
112+
{
113+
var v = value as IIfTemplate;
114+
if (v == null) writer.WriteNull();
115+
116+
writer.WriteRaw("{{#" + v.Variable + "}}");
117+
serializer.Serialize(writer, v.Instance);
118+
writer.WriteRaw("{{/" + v.Variable + "}}");
119+
120+
}
121+
122+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
123+
{
124+
return null;
125+
}
126+
127+
public override bool CanConvert(Type objectType)
128+
{
129+
return true;
130+
}
131+
}
132+
}

0 commit comments

Comments
 (0)