Skip to content

Commit 4adf18a

Browse files
authored
Handle short form queries (#4324)
* 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 2a11ffe commit 4adf18a

File tree

8 files changed

+143
-12
lines changed

8 files changed

+143
-12
lines changed

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

Lines changed: 58 additions & 8 deletions
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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Nest;
1+
using System.IO;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
4+
using Nest;
25
using Tests.Core.ManagedElasticsearch.Clusters;
36
using Tests.Domain;
47
using Tests.Framework.EndpointTests.TestState;
@@ -69,5 +72,15 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
6972
.Name("named_query")
7073
.AutoGenerateSynonymsPhraseQuery(false)
7174
);
75+
76+
//hide
77+
[U] public void DeserializeShortForm()
78+
{
79+
using var stream = new MemoryStream(ShortFormQuery);
80+
var query = Client.RequestResponseSerializer.Deserialize<IMatchQuery>(stream);
81+
query.Should().NotBeNull();
82+
query.Field.Should().Be(new Field("description"));
83+
query.Query.Should().Be("project description");
84+
}
7285
}
7386
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using Elastic.Xunit.XunitPlumbing;
1+
using System.IO;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
24
using Nest;
35
using Tests.Core.ManagedElasticsearch.Clusters;
46
using Tests.Domain;
@@ -59,5 +61,15 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
5961
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
6062
.Name("named_query")
6163
);
64+
65+
//hide
66+
[U] public void DeserializeShortForm()
67+
{
68+
using var stream = new MemoryStream(ShortFormQuery);
69+
var query = Client.RequestResponseSerializer.Deserialize<IMatchBoolPrefixQuery>(stream);
70+
query.Should().NotBeNull();
71+
query.Field.Should().Be(new Field("description"));
72+
query.Query.Should().Be("project description");
73+
}
6274
}
6375
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Nest;
1+
using System.IO;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
4+
using Nest;
25
using Tests.Core.ManagedElasticsearch.Clusters;
36
using Tests.Domain;
47
using Tests.Framework.EndpointTests.TestState;
@@ -51,5 +54,15 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
5154
.Slop(2)
5255
.Name("named_query")
5356
);
57+
58+
//hide
59+
[U] public void DeserializeShortForm()
60+
{
61+
using var stream = new MemoryStream(ShortFormQuery);
62+
var query = Client.RequestResponseSerializer.Deserialize<IMatchPhraseQuery>(stream);
63+
query.Should().NotBeNull();
64+
query.Field.Should().Be(new Field("description"));
65+
query.Query.Should().Be("project description");
66+
}
5467
}
5568
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Nest;
1+
using System.IO;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
4+
using Nest;
25
using Tests.Core.ManagedElasticsearch.Clusters;
36
using Tests.Domain;
47
using Tests.Framework.EndpointTests.TestState;
@@ -54,5 +57,15 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
5457
.Slop(2)
5558
.Name("named_query")
5659
);
60+
61+
//hide
62+
[U] public void DeserializeShortForm()
63+
{
64+
using var stream = new MemoryStream(ShortFormQuery);
65+
var query = Client.RequestResponseSerializer.Deserialize<IMatchPhrasePrefixQuery>(stream);
66+
query.Should().NotBeNull();
67+
query.Field.Should().Be(new Field("description"));
68+
query.Query.Should().Be("project description");
69+
}
5770
}
5871
}

tests/Tests/QueryDsl/QueryDslUsageTestsBase.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System;
2+
using System.Text;
23
using System.Threading.Tasks;
34
using Elastic.Xunit.XunitPlumbing;
45
using Elasticsearch.Net;
56
using FluentAssertions;
67
using Nest;
8+
using Newtonsoft.Json;
79
using Tests.Core.Client;
810
using Tests.Core.Extensions;
911
using Tests.Core.ManagedElasticsearch.Clusters;
@@ -20,6 +22,8 @@ public abstract class QueryDslUsageTestsBase
2022

2123
protected readonly QueryContainer VerbatimQuery = new QueryContainer(new TermQuery { IsVerbatim = true });
2224

25+
protected byte[] ShortFormQuery => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { description = "project description" }));
26+
2327
protected QueryDslUsageTestsBase(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
2428

2529
protected virtual ConditionlessWhen ConditionlessWhen => null;

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System.IO;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
14
using Nest;
25
using Tests.Core.ManagedElasticsearch.Clusters;
36
using Tests.Domain;
@@ -47,5 +50,15 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
4750
.Value("proj")
4851
.Rewrite(MultiTermQueryRewrite.TopTerms(10))
4952
);
53+
54+
//hide
55+
[U] public void DeserializeShortForm()
56+
{
57+
using var stream = new MemoryStream(ShortFormQuery);
58+
var query = Client.RequestResponseSerializer.Deserialize<IPrefixQuery>(stream);
59+
query.Should().NotBeNull();
60+
query.Field.Should().Be(new Field("description"));
61+
query.Value.Should().Be("project description");
62+
}
5063
}
5164
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System.IO;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
14
using Nest;
25
using Tests.Core.ManagedElasticsearch.Clusters;
36
using Tests.Domain;
@@ -44,6 +47,16 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
4447
.Field(p => p.Description)
4548
.Value("project description")
4649
);
50+
51+
//hide
52+
[U] public void DeserializeShortForm()
53+
{
54+
using var stream = new MemoryStream(ShortFormQuery);
55+
var query = Client.RequestResponseSerializer.Deserialize<ITermQuery>(stream);
56+
query.Should().NotBeNull();
57+
query.Field.Should().Be(new Field("description"));
58+
query.Value.Should().Be("project description");
59+
}
4760
}
4861

4962
/**[float]

0 commit comments

Comments
 (0)