Skip to content

Commit 3a7b7b6

Browse files
russcamMpdreamz
authored andcommitted
Add deserialization method for TermsIncludeExclude (#2508)
* Add deserialization method for TermsIncludeExclude Fixes #2503 * moved manual deserializing to RoundTripper Conflicts: src/Nest/Aggregations/Bucket/Terms/TermsIncludeExcludeJsonConverter.cs src/Tests/Tests.csproj
1 parent 3b4466e commit 3a7b7b6

File tree

4 files changed

+121
-3
lines changed

4 files changed

+121
-3
lines changed

src/Nest/Aggregations/Bucket/Terms/TermsIncludeExcludeJsonConverter.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using Newtonsoft.Json;
34

45
namespace Nest
@@ -7,11 +8,42 @@ internal class TermsIncludeExcludeJsonConverter : JsonConverter
78
{
89
public override bool CanConvert(Type objectType) => true;
910

10-
public override bool CanRead => false;
11-
1211
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
1312
{
14-
throw new NotSupportedException();
13+
if (reader.TokenType == JsonToken.Null) return null;
14+
15+
var termsInclude = new TermsIncludeExclude();
16+
17+
switch (reader.TokenType)
18+
{
19+
case JsonToken.StartArray:
20+
termsInclude.Values = serializer.Deserialize<IEnumerable<string>>(reader);
21+
break;
22+
case JsonToken.StartObject:
23+
while (reader.TokenType != JsonToken.EndObject)
24+
{
25+
reader.Read();
26+
27+
if (reader.TokenType == JsonToken.PropertyName)
28+
{
29+
var propertyName = (string)reader.Value;
30+
switch (propertyName)
31+
{
32+
case "pattern":
33+
termsInclude.Pattern = reader.ReadAsString();
34+
break;
35+
case "flags":
36+
termsInclude.Flags = reader.ReadAsString();
37+
break;
38+
}
39+
}
40+
}
41+
break;
42+
default:
43+
throw new JsonSerializationException($"Unexpected token {reader.TokenType} when deserializing {nameof(TermsIncludeExclude)}");
44+
}
45+
46+
return termsInclude;
1547
}
1648

1749
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

src/Tests/Framework/SerializationTests/Roundtrip.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Linq;
45
using System.Linq.Expressions;
6+
using System.Text;
57
using Elasticsearch.Net;
68
using FluentAssertions;
79
using Nest;
10+
using Newtonsoft.Json;
811
using Newtonsoft.Json.Linq;
912

1013
namespace Tests.Framework
@@ -28,6 +31,24 @@ internal RoundTripper(
2831
this._serializerFactory = _serializerFactory;
2932
}
3033

34+
public virtual void DeserializesTo<T>(Action<string, T> assert)
35+
{
36+
var json = (this.ExpectJson is string) ? (string) ExpectJson : JsonConvert.SerializeObject(this.ExpectJson);
37+
38+
T sut;
39+
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
40+
sut = this.Client.Serializer.Deserialize<T>(stream);
41+
sut.Should().NotBeNull();
42+
assert("first deserialization", sut);
43+
44+
var serialized = this.Client.Serializer.SerializeToString(sut);
45+
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(serialized)))
46+
sut = this.Client.Serializer.Deserialize<T>(stream);
47+
sut.Should().NotBeNull();
48+
assert("second deserialization", sut);
49+
}
50+
51+
3152
public virtual RoundTripper<T> WhenSerializing<T>(T actual)
3253
{
3354
var sut = this.AssertSerializesAndRoundTrips(actual);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System.IO;
2+
using System.Text;
3+
using FluentAssertions;
4+
using Nest;
5+
using Tests.Framework;
6+
using static Tests.Framework.RoundTripper;
7+
8+
namespace Tests.Reproduce
9+
{
10+
public class GithubIssue2503
11+
{
12+
[U] public void DeserializeTermsIncludeExcludeValues()
13+
{
14+
Expect(new
15+
{
16+
aggs = new
17+
{
18+
sizes = new
19+
{
20+
terms = new
21+
{
22+
field= "size",
23+
size= 20,
24+
include= new [] { "35", "50", "70", "75", "100" }
25+
}
26+
}
27+
}
28+
}).DeserializesTo<SearchRequest>((message, request) =>
29+
{
30+
request.Should().NotBeNull(message);
31+
request.Aggregations.Should().NotBeNull(message).And.HaveCount(1, message);
32+
var termsAggregation = request.Aggregations["sizes"].Terms;
33+
termsAggregation.Should().NotBeNull(message);
34+
termsAggregation.Include.Should().NotBeNull(message);
35+
termsAggregation.Include.Values.Should().NotBeNull(message).And.HaveCount(5, message);
36+
});
37+
}
38+
39+
[U] public void DeserializeTermsIncludeExcludePattern()
40+
{
41+
Expect(@"{
42+
""aggs"": {
43+
""sizes"": {
44+
""terms"": {
45+
""field"": ""size"",
46+
""size"": 20,
47+
""include"": {
48+
""pattern"" : ""\\d+""
49+
}
50+
}
51+
}
52+
}
53+
}").DeserializesTo<SearchRequest>((message, request) =>
54+
{
55+
request.Should().NotBeNull(message);
56+
request.Aggregations.Should().NotBeNull(message).And.HaveCount(1, message);
57+
var termsAggregation = request.Aggregations["sizes"].Terms;
58+
termsAggregation.Should().NotBeNull(message);
59+
termsAggregation.Include.Should().NotBeNull(message);
60+
termsAggregation.Include.Pattern.Should().NotBeNull(message);
61+
});
62+
}
63+
}
64+
}

src/Tests/Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,7 @@
661661
<Compile Include="Search\Request\SlicedScrollSearchUsageTests.cs" />
662662
<Compile Include="Search\Request\SearchAfterUsageTests.cs" />
663663
<Compile Include="Search\Scroll\Scroll\SlicedScrollSearchApiTests.cs" />
664+
<Compile Include="Reproduce\GithubIssue2503.cs" />
664665
<Compile Include="Search\Search\Rescoring\RescoreUsageTests.cs" />
665666
<Compile Include="Search\Search\InvalidSearchApiTests.cs" />
666667
<Compile Include="Search\Suggesters\SuggestUrlTests.cs" />

0 commit comments

Comments
 (0)