Skip to content

Commit c1816cd

Browse files
committed
fix #2812 make sure verbatim sends an empty array (#2941)
Conflicts: src/Nest/QueryDsl/TermLevel/Terms/TermsQueryJsonConverter.cs src/Tests/QueryDsl/TermLevel/Terms/TermsQueryUsageTests.cs
1 parent 02428eb commit c1816cd

File tree

4 files changed

+105
-9
lines changed

4 files changed

+105
-9
lines changed

src/Nest/QueryDsl/TermLevel/Terms/TermsQueryJsonConverter.cs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,38 @@ internal class TermsQueryJsonConverter : JsonConverter
1414

1515
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
1616
{
17-
var t = value as ITermsQuery;
18-
if (t == null) return;
17+
if (!(value is ITermsQuery t)) return;
1918

2019
var settings = serializer.GetConnectionSettings();
2120
var field = settings.Inferrer.Field(t.Field);
2221

2322
writer.WriteStartObject();
2423
{
25-
if (t.Terms.HasAny())
24+
if (t.IsVerbatim)
2625
{
27-
writer.WritePropertyName(field);
28-
serializer.Serialize(writer, t.Terms);
26+
if (t.TermsLookup != null)
27+
{
28+
writer.WritePropertyName(field);
29+
serializer.Serialize(writer, t.TermsLookup);
30+
}
31+
else if (t.Terms != null)
32+
{
33+
writer.WritePropertyName(field);
34+
serializer.Serialize(writer, t.Terms);
35+
}
2936
}
30-
else if (t.TermsLookup != null)
37+
else
3138
{
32-
writer.WritePropertyName(field);
33-
serializer.Serialize(writer, t.TermsLookup);
39+
if (t.Terms.HasAny())
40+
{
41+
writer.WritePropertyName(field);
42+
serializer.Serialize(writer, t.Terms);
43+
}
44+
else if (t.TermsLookup != null)
45+
{
46+
writer.WritePropertyName(field);
47+
serializer.Serialize(writer, t.TermsLookup);
48+
}
3449
}
3550
#pragma warning disable 618
3651
if (t.DisableCoord.HasValue)

src/Tests/QueryDsl/QueryDslUsageTestsBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ private void AssertIsNotConditionless(IQueryContainer c)
5757

5858
protected QueryContainer ConditionlessQuery = new QueryContainer(new TermQuery { });
5959

60-
protected QueryContainer VerbatimQuery = new QueryContainer(new TermQuery { IsVerbatim = true });
60+
protected readonly QueryContainer VerbatimQuery = new QueryContainer(new TermQuery { IsVerbatim = true });
6161

6262
[U] public void SeenByVisitor()
6363
{

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,45 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
4545
q=> q.Value = null
4646
};
4747
}
48+
49+
/**[float]
50+
*== Verbatim term query
51+
*
52+
* By default an empty term is conditionless so will be rewritten. Sometimes sending an empty term to
53+
* match nothing makes sense. You can either use the `ConditionlessQuery` construct from NEST to provide a fallback or make the
54+
* query verbatim as followed:
55+
*/
56+
public class VerbatimTermQueryUsageTests : TermQueryUsageTests
57+
{
58+
public VerbatimTermQueryUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
59+
60+
protected override ConditionlessWhen ConditionlessWhen => null;
61+
//when reading back the json the notion of is conditionless is lost
62+
protected override bool SupportsDeserialization => false;
63+
64+
protected override object QueryJson => new
65+
{
66+
term = new
67+
{
68+
description = new
69+
{
70+
value = ""
71+
}
72+
}
73+
};
74+
75+
protected override QueryContainer QueryInitializer => new TermQuery
76+
{
77+
IsVerbatim = true,
78+
Field = "description",
79+
Value = "",
80+
};
81+
82+
protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project> q) => q
83+
.Term(c => c
84+
.Verbatim()
85+
.Field(p => p.Description)
86+
.Value(string.Empty)
87+
);
88+
}
4889
}

src/Tests/QueryDsl/TermLevel/Terms/TermsQueryUsageTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,44 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project>
8080
.Terms("term1")
8181
);
8282
}
83+
84+
/**[float]
85+
*== Verbatim terms query
86+
*
87+
* By default an empty terms array is conditionless so will be rewritten. Sometimes sending an empty an empty array to mean
88+
* match nothing makes sense. You can either use the `ConditionlessQuery` construct from NEST to provide a fallback or make the
89+
* query verbatim as followed:
90+
*/
91+
public class VerbatimTermsQueryUsageTests : TermsQueryUsageTests
92+
{
93+
public VerbatimTermsQueryUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
94+
95+
protected override ConditionlessWhen ConditionlessWhen => null;
96+
//when reading back the json the notion of is conditionless is lost
97+
protected override bool SupportsDeserialization => false;
98+
99+
protected override object QueryJson => new
100+
{
101+
terms = new
102+
{
103+
description = new string[] {}
104+
}
105+
};
106+
107+
protected override QueryContainer QueryInitializer => new TermsQuery
108+
{
109+
IsVerbatim = true,
110+
Field = "description",
111+
Terms = new string[] {},
112+
};
113+
114+
protected override QueryContainer QueryFluent(QueryContainerDescriptor<Project> q) => q
115+
.Terms(c => c
116+
.Verbatim()
117+
.Field(p => p.Description)
118+
.Terms(new string[] {})
119+
);
120+
}
121+
122+
83123
}

0 commit comments

Comments
 (0)