Skip to content

Commit fb1a1fc

Browse files
authored
Handle short form queries (#4323)
* 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 Closes #2855
1 parent de95290 commit fb1a1fc

File tree

8 files changed

+104
-10
lines changed

8 files changed

+104
-10
lines changed

src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/FromJson.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ internal static class FromJson
1010
/// </summary>
1111
public static T ReadAs<T>(JsonReader reader, JsonSerializer serializer)
1212
{
13-
var t = (T)typeof(T).CreateInstance();
13+
var t = typeof(T).CreateInstance<T>();
1414
serializer.Populate(reader, t);
1515
return t;
1616
}

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

+30-5
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,39 @@ internal class FieldNameQueryJsonConverter<TReadAs> : ReserializeJsonConverter<T
88
{
99
protected override object DeserializeJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
1010
{
11-
//{
1211
reader.Read(); //property name
13-
var fieldName = reader.Value as string;
14-
reader.Read(); //{
15-
var query = ReadAs(reader, objectType, existingValue, serializer);
12+
var fieldName = (string)reader.Value;
13+
reader.Read();
14+
TReadAs query = null;
1615

17-
if (query == null) return null;
16+
switch (reader.TokenType)
17+
{
18+
case JsonToken.StartObject:
19+
query = ReadAs(reader, objectType, existingValue, serializer);
20+
break;
21+
case JsonToken.Null:
22+
break;
23+
default:
24+
query = new TReadAs();
25+
switch (query)
26+
{
27+
case ITermQuery termQuery:
28+
termQuery.Value = reader.Value;
29+
break;
30+
case IMatchQuery matchQuery:
31+
matchQuery.Query = (string)reader.Value;
32+
break;
33+
case IMatchPhraseQuery matchPhraseQuery:
34+
matchPhraseQuery.Query = (string)reader.Value;
35+
break;
36+
case IMatchPhrasePrefixQuery matchPhrasePrefixQuery:
37+
matchPhrasePrefixQuery.Query = (string)reader.Value;
38+
break;
39+
}
40+
break;
41+
}
1842

43+
if (query == null) return null;
1944
query.Field = fieldName;
2045

2146
return query;

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

+14-1
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.Integration;
@@ -69,5 +72,15 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
6972
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
7073
.Name("named_query")
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
}

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

+14-1
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.Integration;
@@ -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
}

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

+14-1
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.Integration;
@@ -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
}

src/Tests/Tests/QueryDsl/QueryDslUsageTestsBase.cs

+4
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;

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

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
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
using Tests.Framework.Integration;
58

6-
namespace Tests.QueryDsl.PrefixLevel.Prefix
9+
namespace Tests.QueryDsl.TermLevel.Prefix
710
{
811
public class PrefixQueryUsageTests : QueryDslUsageTestsBase
912
{
@@ -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
}

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

+13
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)