Skip to content

Commit de95290

Browse files
russcamStuart Cam
and
Stuart Cam
authored
Handle StartObject or StartArray when reading QueryContainer collection (#4322)
This commit implements ReadJson for QueryContainerCollectionJsonConverter, to allow handling a single query within a JSON object, or multiple queries within a JSON array. Fixes #4311 Co-authored-by: Stuart Cam <[email protected]>
1 parent 67847b6 commit de95290

File tree

2 files changed

+119
-5
lines changed

2 files changed

+119
-5
lines changed

src/Nest/QueryDsl/Abstractions/Container/QueryContainerJsonConverter.cs

+20-5
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ protected override void SerializeJson(JsonWriter writer, object value, IQueryCon
4040

4141
internal class QueryContainerCollectionJsonConverter : JsonConverter
4242
{
43-
public override bool CanRead => false;
44-
public override bool CanWrite => true;
45-
4643
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
4744
{
4845
var collection = (IEnumerable<QueryContainer>)value;
@@ -62,8 +59,26 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
6259
writer.WriteEndArray();
6360
}
6461

65-
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
66-
throw new NotSupportedException();
62+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
63+
{
64+
switch (reader.TokenType)
65+
{
66+
case JsonToken.StartObject:
67+
return new[] { serializer.Deserialize<QueryContainer>(reader) };
68+
case JsonToken.StartArray:
69+
var queryContainers = new List<QueryContainer>();
70+
while (reader.Read())
71+
{
72+
if (reader.TokenType == JsonToken.EndArray)
73+
break;
74+
75+
queryContainers.Add(serializer.Deserialize<QueryContainer>(reader));
76+
}
77+
return queryContainers;
78+
default:
79+
return null;
80+
}
81+
}
6782

6883
public override bool CanConvert(Type objectType) => true;
6984
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
using System;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using Elasticsearch.Net;
5+
using FluentAssertions;
6+
using Nest;
7+
8+
namespace Tests.Reproduce
9+
{
10+
public class GithubIssue4311
11+
{
12+
[U]
13+
public void CanDeserializeIndexResponseWithSingleFilterItem()
14+
{
15+
var json = @"{
16+
"".es-test-repro"": {
17+
""aliases"": {
18+
"".es-test-repro-alias1"": {
19+
""filter"": {
20+
""bool"": {
21+
""must_not"": {
22+
""exists"": {
23+
""field"": ""field1""
24+
}
25+
}
26+
}
27+
}
28+
}
29+
},
30+
""mappings"": {
31+
""user"": {
32+
""properties"": {
33+
""email"": {
34+
""type"": ""text"",
35+
""fields"": {
36+
""keyword"": {
37+
""type"": ""keyword"",
38+
""ignore_above"": 256
39+
}
40+
}
41+
},
42+
""firstName"": {
43+
""type"": ""text"",
44+
""fields"": {
45+
""keyword"": {
46+
""type"": ""keyword"",
47+
""ignore_above"": 256
48+
}
49+
}
50+
},
51+
""isActive"": {
52+
""type"": ""boolean""
53+
},
54+
""lastName"": {
55+
""type"": ""text"",
56+
""fields"": {
57+
""keyword"": {
58+
""type"": ""keyword"",
59+
""ignore_above"": 256
60+
}
61+
}
62+
},
63+
""state"": {
64+
""type"": ""text"",
65+
""fields"": {
66+
""keyword"": {
67+
""type"": ""keyword"",
68+
""ignore_above"": 256
69+
}
70+
}
71+
}
72+
}
73+
}
74+
},
75+
""settings"": {
76+
""index"": {
77+
""creation_date"": ""1579594498360"",
78+
""number_of_shards"": ""5"",
79+
""number_of_replicas"": ""1"",
80+
""uuid"": ""wqYY9c4xSH6nyilffGobmw"",
81+
""version"": {
82+
""created"": ""6080399""
83+
},
84+
""provided_name"": "".es-test-repro""
85+
}
86+
}
87+
}
88+
}";
89+
90+
var bytes = Encoding.UTF8.GetBytes(json);
91+
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
92+
var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection(bytes));
93+
var client = new ElasticClient(connectionSettings);
94+
95+
var indexResponse = client.GetIndex(".es-test-repro");
96+
indexResponse.IsValid.Should().BeTrue();
97+
}
98+
}
99+
}

0 commit comments

Comments
 (0)