From 46e8fcef9ebad06a0fa1aaaeef43cd796e62c6ce Mon Sep 17 00:00:00 2001 From: Russ Cam Date: Thu, 22 Dec 2016 19:38:28 +1100 Subject: [PATCH 1/2] Add deserialization method for TermsIncludeExclude Fixes #2503 --- .../Terms/TermsIncludeExcludeJsonConverter.cs | 38 ++++++++- src/Tests/Reproduce/GithubIssue2503.cs | 81 +++++++++++++++++++ src/Tests/Tests.csproj | 5 +- 3 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 src/Tests/Reproduce/GithubIssue2503.cs diff --git a/src/Nest/Aggregations/Bucket/Terms/TermsIncludeExcludeJsonConverter.cs b/src/Nest/Aggregations/Bucket/Terms/TermsIncludeExcludeJsonConverter.cs index af3868c7741..e1734fd2baa 100644 --- a/src/Nest/Aggregations/Bucket/Terms/TermsIncludeExcludeJsonConverter.cs +++ b/src/Nest/Aggregations/Bucket/Terms/TermsIncludeExcludeJsonConverter.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Newtonsoft.Json; namespace Nest @@ -7,11 +8,42 @@ internal class TermsIncludeExcludeJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) => true; - public override bool CanRead => false; - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - throw new NotImplementedException(); + if (reader.TokenType == JsonToken.Null) return null; + + var termsInclude = new TermsIncludeExclude(); + + switch (reader.TokenType) + { + case JsonToken.StartArray: + termsInclude.Values = serializer.Deserialize>(reader); + break; + case JsonToken.StartObject: + while (reader.TokenType != JsonToken.EndObject) + { + reader.Read(); + + if (reader.TokenType == JsonToken.PropertyName) + { + var propertyName = (string)reader.Value; + switch (propertyName) + { + case "pattern": + termsInclude.Pattern = reader.ReadAsString(); + break; + case "flags": + termsInclude.Flags = reader.ReadAsString(); + break; + } + } + } + break; + default: + throw new JsonSerializationException($"Unexpected token {reader.TokenType} when deserializing {nameof(TermsIncludeExclude)}"); + } + + return termsInclude; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) diff --git a/src/Tests/Reproduce/GithubIssue2503.cs b/src/Tests/Reproduce/GithubIssue2503.cs new file mode 100644 index 00000000000..d207cd0338b --- /dev/null +++ b/src/Tests/Reproduce/GithubIssue2503.cs @@ -0,0 +1,81 @@ +using System.IO; +using System.Text; +using FluentAssertions; +using Nest; +using Tests.Framework; + +namespace Tests.Reproduce +{ + public class GithubIssue2503 + { + [U] + public void DeserializeTermsIncludeExcludeValues() + { + var json = @"{ + ""aggs"": { + ""sizes"": { + ""terms"": { + ""field"": ""size"", + ""size"": 20, + ""include"": [ + ""35"", + ""50"", + ""70"", + ""75"", + ""100"" + ] + } + } + } + }"; + + var client = TestClient.GetInMemoryClient(); + SearchRequest request; + + using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) + { + request = client.Serializer.Deserialize(stream); + } + + request.Should().NotBeNull(); + request.Aggregations.Should().NotBeNull().And.HaveCount(1); + var termsAggregation = request.Aggregations["sizes"].Terms; + termsAggregation.Should().NotBeNull(); + termsAggregation.Include.Should().NotBeNull(); + termsAggregation.Include.Values.Should().NotBeNull().And.HaveCount(5); + } + + [U] + public void DeserializeTermsIncludeExcludePattern() + { + var json = @"{ + ""aggs"": { + ""sizes"": { + ""terms"": { + ""field"": ""size"", + ""size"": 20, + ""include"": { + ""pattern"" : ""\\d+"" + } + } + } + } + }"; + + var client = TestClient.GetInMemoryClient(); + SearchRequest request; + + using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) + { + request = client.Serializer.Deserialize(stream); + } + + request.Should().NotBeNull(); + request.Aggregations.Should().NotBeNull().And.HaveCount(1); + var termsAggregation = request.Aggregations["sizes"].Terms; + termsAggregation.Should().NotBeNull(); + termsAggregation.Include.Should().NotBeNull(); + termsAggregation.Include.Pattern.Should().NotBeNull(); + } + } +} diff --git a/src/Tests/Tests.csproj b/src/Tests/Tests.csproj index dd4aa30ba1b..586e0b402e2 100644 --- a/src/Tests/Tests.csproj +++ b/src/Tests/Tests.csproj @@ -606,6 +606,7 @@ + @@ -707,9 +708,7 @@ - - - + From 1151a63921077000ac7e0cb98e3ab905f006cd9e Mon Sep 17 00:00:00 2001 From: Mpdreamz Date: Wed, 28 Dec 2016 11:23:48 +0100 Subject: [PATCH 2/2] moved manual deserializing to RoundTripper --- src/Tests/Framework/Roundtrip.cs | 21 +++++ src/Tests/Reproduce/GithubIssue2503.cs | 107 +++++++++++-------------- 2 files changed, 66 insertions(+), 62 deletions(-) diff --git a/src/Tests/Framework/Roundtrip.cs b/src/Tests/Framework/Roundtrip.cs index b839d1494af..32eacac8ffb 100644 --- a/src/Tests/Framework/Roundtrip.cs +++ b/src/Tests/Framework/Roundtrip.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Linq.Expressions; +using System.Text; using Elasticsearch.Net; using FluentAssertions; using Nest; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Tests.Framework @@ -28,6 +31,24 @@ internal RoundTripper( this._serializerFactory = _serializerFactory; } + public virtual void DeserializesTo(Action assert) + { + var json = (this.ExpectJson is string) ? (string) ExpectJson : JsonConvert.SerializeObject(this.ExpectJson); + + T sut; + using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) + sut = this.Client.Serializer.Deserialize(stream); + sut.Should().NotBeNull(); + assert("first deserialization", sut); + + var serialized = this.Client.Serializer.SerializeToString(sut); + using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(serialized))) + sut = this.Client.Serializer.Deserialize(stream); + sut.Should().NotBeNull(); + assert("second deserialization", sut); + } + + public virtual RoundTripper WhenSerializing(T actual) { var sut = this.AssertSerializesAndRoundTrips(actual); diff --git a/src/Tests/Reproduce/GithubIssue2503.cs b/src/Tests/Reproduce/GithubIssue2503.cs index d207cd0338b..c27a2963608 100644 --- a/src/Tests/Reproduce/GithubIssue2503.cs +++ b/src/Tests/Reproduce/GithubIssue2503.cs @@ -3,79 +3,62 @@ using FluentAssertions; using Nest; using Tests.Framework; +using static Tests.Framework.RoundTripper; namespace Tests.Reproduce { public class GithubIssue2503 { - [U] - public void DeserializeTermsIncludeExcludeValues() + [U] public void DeserializeTermsIncludeExcludeValues() { - var json = @"{ - ""aggs"": { - ""sizes"": { - ""terms"": { - ""field"": ""size"", - ""size"": 20, - ""include"": [ - ""35"", - ""50"", - ""70"", - ""75"", - ""100"" - ] - } - } - } - }"; - - var client = TestClient.GetInMemoryClient(); - SearchRequest request; - - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) + Expect(new { - request = client.Serializer.Deserialize(stream); - } - - request.Should().NotBeNull(); - request.Aggregations.Should().NotBeNull().And.HaveCount(1); - var termsAggregation = request.Aggregations["sizes"].Terms; - termsAggregation.Should().NotBeNull(); - termsAggregation.Include.Should().NotBeNull(); - termsAggregation.Include.Values.Should().NotBeNull().And.HaveCount(5); + aggs = new + { + sizes = new + { + terms = new + { + field= "size", + size= 20, + include= new [] { "35", "50", "70", "75", "100" } + } + } + } + }).DeserializesTo((message, request) => + { + request.Should().NotBeNull(message); + request.Aggregations.Should().NotBeNull(message).And.HaveCount(1, message); + var termsAggregation = request.Aggregations["sizes"].Terms; + termsAggregation.Should().NotBeNull(message); + termsAggregation.Include.Should().NotBeNull(message); + termsAggregation.Include.Values.Should().NotBeNull(message).And.HaveCount(5, message); + }); } - [U] - public void DeserializeTermsIncludeExcludePattern() + [U] public void DeserializeTermsIncludeExcludePattern() { - var json = @"{ - ""aggs"": { - ""sizes"": { - ""terms"": { - ""field"": ""size"", - ""size"": 20, - ""include"": { - ""pattern"" : ""\\d+"" - } - } - } - } - }"; - - var client = TestClient.GetInMemoryClient(); - SearchRequest request; - - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) + Expect(@"{ + ""aggs"": { + ""sizes"": { + ""terms"": { + ""field"": ""size"", + ""size"": 20, + ""include"": { + ""pattern"" : ""\\d+"" + } + } + } + } + }").DeserializesTo((message, request) => { - request = client.Serializer.Deserialize(stream); - } - - request.Should().NotBeNull(); - request.Aggregations.Should().NotBeNull().And.HaveCount(1); - var termsAggregation = request.Aggregations["sizes"].Terms; - termsAggregation.Should().NotBeNull(); - termsAggregation.Include.Should().NotBeNull(); - termsAggregation.Include.Pattern.Should().NotBeNull(); + request.Should().NotBeNull(message); + request.Aggregations.Should().NotBeNull(message).And.HaveCount(1, message); + var termsAggregation = request.Aggregations["sizes"].Terms; + termsAggregation.Should().NotBeNull(message); + termsAggregation.Include.Should().NotBeNull(message); + termsAggregation.Include.Pattern.Should().NotBeNull(message); + }); } } }