Skip to content

Commit 6c8d591

Browse files
committed
Handle short form queries
This commit handles the short form of the following queries: - term query - match query - prefix query - match phrase query - match phrase prefix query - match bool prefix query Closes #2855
1 parent 5432655 commit 6c8d591

File tree

7 files changed

+157
-12
lines changed

7 files changed

+157
-12
lines changed

src/Nest/QueryDsl/Abstractions/FieldName/FieldNameQueryFormatter.cs

+58-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using Elasticsearch.Net.Utf8Json;
1+
using Elasticsearch.Net.Extensions;
2+
using Elasticsearch.Net.Utf8Json;
3+
using Elasticsearch.Net.Utf8Json.Internal;
24

35
namespace Nest
46
{
@@ -34,18 +36,66 @@ public override void Serialize(ref JsonWriter writer, TInterface value, IJsonFor
3436
public override TInterface Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
3537
{
3638
reader.ReadIsBeginObjectWithVerify();
37-
var token = reader.GetCurrentJsonToken();
39+
40+
if (reader.ReadIsEndObject())
41+
return default;
3842

3943
TInterface query = null;
40-
string fieldName = null;
41-
if (token != JsonToken.EndObject)
44+
var fieldName = reader.ReadPropertyName();
45+
var token = reader.GetCurrentJsonToken();
46+
switch (token)
4247
{
43-
fieldName = reader.ReadPropertyName();
44-
query = base.Deserialize(ref reader, formatterResolver);
48+
case JsonToken.BeginObject:
49+
query = base.Deserialize(ref reader, formatterResolver);
50+
reader.ReadIsEndObjectWithVerify();
51+
break;
52+
case JsonToken.Null:
53+
reader.ReadNext();
54+
break;
55+
default:
56+
query = new T();
57+
switch (query)
58+
{
59+
case ITermQuery termQuery:
60+
switch (token)
61+
{
62+
case JsonToken.String:
63+
termQuery.Value = reader.ReadString();
64+
break;
65+
case JsonToken.Number:
66+
var segment = reader.ReadNumberSegment();
67+
if (segment.IsLong())
68+
termQuery.Value = NumberConverter.ReadInt64(segment.Array, segment.Offset, out var count);
69+
else
70+
termQuery.Value = NumberConverter.ReadDouble(segment.Array, segment.Offset, out var count);
71+
break;
72+
case JsonToken.True:
73+
case JsonToken.False:
74+
termQuery.Value = reader.ReadBoolean();
75+
break;
76+
}
77+
reader.ReadIsEndObjectWithVerify();
78+
break;
79+
case IMatchQuery matchQuery:
80+
matchQuery.Query = reader.ReadString();
81+
reader.ReadIsEndObjectWithVerify();
82+
break;
83+
case IMatchPhraseQuery matchPhraseQuery:
84+
matchPhraseQuery.Query = reader.ReadString();
85+
reader.ReadIsEndObjectWithVerify();
86+
break;
87+
case IMatchPhrasePrefixQuery matchPhrasePrefixQuery:
88+
matchPhrasePrefixQuery.Query = reader.ReadString();
89+
reader.ReadIsEndObjectWithVerify();
90+
break;
91+
case IMatchBoolPrefixQuery matchBoolPrefixQuery:
92+
matchBoolPrefixQuery.Query = reader.ReadString();
93+
reader.ReadIsEndObjectWithVerify();
94+
break;
95+
}
96+
break;
4597
}
4698

47-
reader.ReadIsEndObjectWithVerify();
48-
4999
if (query == null)
50100
return null;
51101

tests/Tests/QueryDsl/FullText/Match/MatchUsageTests.cs

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
using Nest;
1+
using System.IO;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using FluentAssertions;
5+
using Nest;
6+
using Newtonsoft.Json;
27
using Tests.Core.ManagedElasticsearch.Clusters;
38
using Tests.Domain;
49
using Tests.Framework.EndpointTests.TestState;
@@ -69,5 +74,16 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
6974
.Name("named_query")
7075
.AutoGenerateSynonymsPhraseQuery(false)
7176
);
77+
78+
//hide
79+
[U] public void DeserializeShortForm()
80+
{
81+
var json = JsonConvert.SerializeObject(new { description = "project description" });
82+
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
83+
var query = Client.RequestResponseSerializer.Deserialize<IMatchQuery>(stream);
84+
query.Should().NotBeNull();
85+
query.Field.Should().Be(new Field("description"));
86+
query.Query.Should().Be("project description");
87+
}
7288
}
7389
}

tests/Tests/QueryDsl/FullText/MatchBoolPrefix/MatchBoolPrefixUsageTests.cs

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
using Elastic.Xunit.XunitPlumbing;
1+
using System.IO;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using FluentAssertions;
25
using Nest;
6+
using Newtonsoft.Json;
37
using Tests.Core.ManagedElasticsearch.Clusters;
48
using Tests.Domain;
59
using Tests.Framework.EndpointTests.TestState;
@@ -59,5 +63,16 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
5963
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
6064
.Name("named_query")
6165
);
66+
67+
//hide
68+
[U] public void DeserializeShortForm()
69+
{
70+
var json = JsonConvert.SerializeObject(new { description = "project description" });
71+
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
72+
var query = Client.RequestResponseSerializer.Deserialize<IMatchBoolPrefixQuery>(stream);
73+
query.Should().NotBeNull();
74+
query.Field.Should().Be(new Field("description"));
75+
query.Query.Should().Be("project description");
76+
}
6277
}
6378
}

tests/Tests/QueryDsl/FullText/MatchPhrase/MatchPhraseUsageTests.cs

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
using Nest;
1+
using System.IO;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using FluentAssertions;
5+
using Nest;
6+
using Newtonsoft.Json;
27
using Tests.Core.ManagedElasticsearch.Clusters;
38
using Tests.Domain;
49
using Tests.Framework.EndpointTests.TestState;
@@ -51,5 +56,16 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
5156
.Slop(2)
5257
.Name("named_query")
5358
);
59+
60+
//hide
61+
[U] public void DeserializeShortForm()
62+
{
63+
var json = JsonConvert.SerializeObject(new { description = "project description" });
64+
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
65+
var query = Client.RequestResponseSerializer.Deserialize<IMatchPhraseQuery>(stream);
66+
query.Should().NotBeNull();
67+
query.Field.Should().Be(new Field("description"));
68+
query.Query.Should().Be("project description");
69+
}
5470
}
5571
}

tests/Tests/QueryDsl/FullText/MatchPhrasePrefix/MatchPhrasePrefixUsageTests.cs

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
using Nest;
1+
using System.IO;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using FluentAssertions;
5+
using Nest;
6+
using Newtonsoft.Json;
27
using Tests.Core.ManagedElasticsearch.Clusters;
38
using Tests.Domain;
49
using Tests.Framework.EndpointTests.TestState;
@@ -54,5 +59,16 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
5459
.Slop(2)
5560
.Name("named_query")
5661
);
62+
63+
//hide
64+
[U] public void DeserializeShortForm()
65+
{
66+
var json = JsonConvert.SerializeObject(new { description = "project description" });
67+
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
68+
var query = Client.RequestResponseSerializer.Deserialize<IMatchPhrasePrefixQuery>(stream);
69+
query.Should().NotBeNull();
70+
query.Field.Should().Be(new Field("description"));
71+
query.Query.Should().Be("project description");
72+
}
5773
}
5874
}

tests/Tests/QueryDsl/TermLevel/Prefix/PrefixQueryUsageTests.cs

+16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
using System.IO;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using FluentAssertions;
15
using Nest;
6+
using Newtonsoft.Json;
27
using Tests.Core.ManagedElasticsearch.Clusters;
38
using Tests.Domain;
49
using Tests.Framework.EndpointTests.TestState;
@@ -47,5 +52,16 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
4752
.Value("proj")
4853
.Rewrite(MultiTermQueryRewrite.TopTerms(10))
4954
);
55+
56+
//hide
57+
[U] public void DeserializeShortForm()
58+
{
59+
var json = JsonConvert.SerializeObject(new { description = "project description" });
60+
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
61+
var query = Client.RequestResponseSerializer.Deserialize<IPrefixQuery>(stream);
62+
query.Should().NotBeNull();
63+
query.Field.Should().Be(new Field("description"));
64+
query.Value.Should().Be("project description");
65+
}
5066
}
5167
}

tests/Tests/QueryDsl/TermLevel/Term/TermQueryUsageTests.cs

+16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
using System.IO;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using FluentAssertions;
15
using Nest;
6+
using Newtonsoft.Json;
27
using Tests.Core.ManagedElasticsearch.Clusters;
38
using Tests.Domain;
49
using Tests.Framework.EndpointTests.TestState;
@@ -44,6 +49,17 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
4449
.Field(p => p.Description)
4550
.Value("project description")
4651
);
52+
53+
//hide
54+
[U] public void DeserializeShortForm()
55+
{
56+
var json = JsonConvert.SerializeObject(new { description = "project description" });
57+
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
58+
var query = Client.RequestResponseSerializer.Deserialize<ITermQuery>(stream);
59+
query.Should().NotBeNull();
60+
query.Field.Should().Be(new Field("description"));
61+
query.Value.Should().Be("project description");
62+
}
4763
}
4864

4965
/**[float]

0 commit comments

Comments
 (0)