Skip to content

Commit 0456ca2

Browse files
committed
fixed bool query merges when a boolean query is marked fixed or indicates a minimum_should_match clause
1 parent ff47408 commit 0456ca2

23 files changed

+766
-291
lines changed

src/Nest.Tests.Unit/Core/MultiSearch/MultiSearchTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void MultiSearchFixedIndexAndType()
4545
public void MultiSearchRespectsSearchTypePreferenceAndRouting()
4646
{
4747
var result = this._client.MultiSearch(b => b
48-
.FixedPath("myindex", "mytype")
48+
.FixedPath("myindex", "mytype")
4949
.Search<ElasticSearchProject>(s => s.MatchAll().Preference("_primary").Routing("customvalue1").SearchType(SearchType.DfsQueryAndFetch))
5050
.Search<Person>(s => s.MatchAll().Preference("_primary_first").Routing("customvalue2").SearchType(SearchType.Count))
5151
);
@@ -56,7 +56,7 @@ public void MultiSearchRespectsSearchTypePreferenceAndRouting()
5656
const string second = @"{""index"":""myindex"",""type"":""mytype"",""search_type"":""count"",""preference"":""_primary_first"",""routing"":""customvalue2""}";
5757

5858
StringAssert.Contains(first, status.Request);
59-
StringAssert.Contains(second, status.Request);
59+
StringAssert.Contains(second, status.Request);
6060

6161

6262
}

src/Nest.Tests.Unit/Nest.Tests.Unit.csproj

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
<Compile Include="Internals\Inferno\HostNameWithPathTests.cs" />
108108
<Compile Include="Internals\Inferno\MapTypeNamesTests.cs" />
109109
<Compile Include="Internals\Serialize\OptOutTests.cs" />
110+
<Compile Include="Search\Filter\BoolQueryMerges\BoolQueryMergesTests.cs" />
110111
<Compile Include="Search\Filter\Singles\HasParentFilterJson.cs" />
111112
<Compile Include="Search\Query\Singles\HasParentQueryJson.cs" />
112113
<Compile Include="Search\Query\Singles\MultiMatch\MultiMatchJson.cs" />
@@ -359,6 +360,33 @@
359360
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
360361
</None>
361362
<None Include="packages.config" />
363+
<None Include="Search\Filter\BoolQueryMerges\ShouldNotJoinMustNotIntoMustStrictQueryInverse.json">
364+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
365+
</None>
366+
<None Include="Search\Filter\BoolQueryMerges\ShouldNotJoinMustNotIntoMustStrictQuery.json">
367+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
368+
</None>
369+
<None Include="Search\Filter\BoolQueryMerges\ShouldJoinMustNotIntoMustQuery.json">
370+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
371+
</None>
372+
<None Include="Search\Filter\BoolQueryMerges\ShouldJoinIntoMustQuery.json">
373+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
374+
</None>
375+
<None Include="Search\Filter\BoolQueryMerges\ShouldNotJoinIntoStrictMustQuery.json">
376+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
377+
</None>
378+
<None Include="Search\Filter\BoolQueryMerges\ShouldNotJoinIntoShouldQueryWithMinimumMatchPercentage.json">
379+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
380+
</None>
381+
<None Include="Search\Filter\BoolQueryMerges\ShouldNotJoinIntoShouldQueryWithMinimumMatch.json">
382+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
383+
</None>
384+
<None Include="Search\Filter\BoolQueryMerges\ShouldJoinIntoNonStrictShouldQuery.json">
385+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
386+
</None>
387+
<None Include="Search\Filter\BoolQueryMerges\ShouldNotJoinIntoStrictShouldQuery.json">
388+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
389+
</None>
362390
<None Include="Search\Query\Singles\MultiMatch\TestMultiMatchJson.json" />
363391
<None Include="Search\Query\Singles\Terms\TermsQueryDescriptorUsingExternalField.json" />
364392
<None Include="Search\Query\Singles\Term\DateTimeWithCustomStringValue.json" />

src/Nest.Tests.Unit/Search/Filter/BoolCombinations/BoolCombinationTests.cs

Lines changed: 49 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class BoolCombinationTests : BaseJsonTests
99
[Test]
1010
public void CombineNotAnd()
1111
{
12-
var s = !Filter<ElasticSearchProject>.Term(f => f.Name, "foo")
12+
var s = !Filter<ElasticSearchProject>.Term(f => f.Name, "foo")
1313
&& !Filter<ElasticSearchProject>.Term(f => f.Name, "bar")
1414
&& Filter<ElasticSearchProject>.Term(f => f.Name, "derp");
1515
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
@@ -28,7 +28,7 @@ public void CombineNotAndShould()
2828
}
2929
[Test]
3030
public void ForceBranchOr()
31-
{
31+
{
3232
var s = (Filter<ElasticSearchProject>.Term(f => f.Name, "foo")
3333
&& Filter<ElasticSearchProject>.Term(f => f.Name, "bar")
3434
|| Filter<ElasticSearchProject>.Term(f => f.Name, "blah"))
@@ -39,8 +39,8 @@ public void ForceBranchOr()
3939
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
4040
}
4141
[Test]
42-
public void ForceBranchAnd()
43-
{
42+
public void ForceBranchAnd()
43+
{
4444
var s = (Filter<ElasticSearchProject>.Term(f => f.Name, "foo")
4545
&& !Filter<ElasticSearchProject>.Term(f => f.Name, "bar")
4646
&& Filter<ElasticSearchProject>.Term(f => f.Name, "blah"))
@@ -52,59 +52,62 @@ public void ForceBranchAnd()
5252
}
5353
[Test]
5454
public void RandomOrderAnd()
55-
{
55+
{
5656
var s = Filter<ElasticSearchProject>.Term(f => f.Name, "foo")
5757
&& !Filter<ElasticSearchProject>.Term(f => f.Name, "bar")
5858
&& Filter<ElasticSearchProject>.Term(f => f.Name, "blah");
5959
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
6060
}
6161
[Test]
6262
public void RandomOrderOr()
63-
{
63+
{
6464
var s = Filter<ElasticSearchProject>.Term(f => f.Name, "foo2")
6565
|| Filter<ElasticSearchProject>.Term(f => f.Name, "bar2")
6666
|| !Filter<ElasticSearchProject>.Term(f => f.Name, "blah2");
6767
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
6868
}
69-
[Test]
70-
public void OrWithExists()
71-
{
72-
var s = Filter<ElasticSearchProject>.Exists(f=>f.Name)
73-
|| Filter<ElasticSearchProject>.Term(f => f.Name, "bar2")
74-
|| Filter<ElasticSearchProject>.Term(f => f.Name, "blah2");
75-
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
76-
}
77-
[Test]
78-
public void OrWithExistsLambda()
79-
{
80-
var s = new SearchDescriptor<ElasticSearchProject>()
81-
.Filter(q=>
82-
q.Term(f => f.Name, "bar2")
83-
|| q.Term(f => f.Name, "blah2")
84-
|| q.Exists(f => f.Name)
85-
);
86-
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
87-
}
88-
[Test]
89-
public void OrWithExistsLambdaSimple()
90-
{
91-
var s = new SearchDescriptor<ElasticSearchProject>()
92-
.Filter(q =>
93-
q.Term(f => f.Name, "blah2")
94-
|| q.Exists(f => f.Name)
95-
);
96-
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
69+
[Test]
70+
public void OrWithExists()
71+
{
72+
var s = Filter<ElasticSearchProject>.Exists(f => f.Name)
73+
|| Filter<ElasticSearchProject>.Term(f => f.Name, "bar2")
74+
|| Filter<ElasticSearchProject>.Term(f => f.Name, "blah2");
75+
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
76+
}
77+
[Test]
78+
public void OrWithExistsLambda()
79+
{
80+
var s = new SearchDescriptor<ElasticSearchProject>()
81+
.Filter(q =>
82+
q.Term(f => f.Name, "bar2")
83+
|| q.Term(f => f.Name, "blah2")
84+
|| q.Exists(f => f.Name)
85+
);
86+
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
87+
}
88+
[Test]
89+
public void OrWithExistsLambdaSimple()
90+
{
91+
var s = new SearchDescriptor<ElasticSearchProject>()
92+
.Filter(q =>
93+
q.Term(f => f.Name, "blah2")
94+
|| q.Exists(f => f.Name)
95+
);
96+
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
97+
}
98+
99+
[Test]
100+
public void OrSimpleLambda()
101+
{
102+
var s = new SearchDescriptor<ElasticSearchProject>()
103+
.Filter(q =>
104+
q.Term(f => f.Name, "foo2")
105+
|| q.Term(f => f.Name, "bar2")
106+
|| q.Term(f => f.Name, "blah2")
107+
);
108+
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
109+
}
110+
111+
97112
}
98-
[Test]
99-
public void OrSimpleLambda()
100-
{
101-
var s = new SearchDescriptor<ElasticSearchProject>()
102-
.Filter(q =>
103-
q.Term(f => f.Name, "foo2")
104-
|| q.Term(f => f.Name, "bar2")
105-
|| q.Term(f => f.Name, "blah2")
106-
);
107-
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod());
108-
}
109-
}
110113
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
using System.Reflection;
2+
using NUnit.Framework;
3+
using Nest.Tests.MockData.Domain;
4+
5+
namespace Nest.Tests.Unit.Search.Filter.BoolQueryMerges
6+
{
7+
[TestFixture]
8+
public class BoolQueryMergesTests : BaseJsonTests
9+
{
10+
[Test]
11+
public void ShouldNotJoinIntoStrictShouldQuery()
12+
{
13+
var s = new SearchDescriptor<ElasticSearchProject>()
14+
.Query(q =>
15+
q.Strict().Bool(
16+
bf=>bf.Should(
17+
qq=>qq.Term(f => f.Name, "foo2"),
18+
qq => qq.Term(f => f.Name, "bar2")
19+
)
20+
)
21+
|| q.Term(f => f.Name, "blah2")
22+
);
23+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
24+
}
25+
[Test]
26+
public void ShouldNotJoinIntoShouldQueryWithMinimumMatch()
27+
{
28+
var s = new SearchDescriptor<ElasticSearchProject>()
29+
.Query(q =>
30+
q.Bool(
31+
bf => bf.Should(
32+
qq => qq.Term(f => f.Name, "foo2"),
33+
qq => qq.Term(f => f.Name, "bar2")
34+
)
35+
.MinimumNumberShouldMatch(2)
36+
)
37+
|| q.Term(f => f.Name, "blah2")
38+
);
39+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
40+
}
41+
[Test]
42+
public void ShouldNotJoinIntoShouldQueryWithMinimumMatchPercentage()
43+
{
44+
var s = new SearchDescriptor<ElasticSearchProject>()
45+
.Query(q =>
46+
q.Bool(
47+
bf => bf.Should(
48+
qq => qq.Term(f => f.Name, "foo2"),
49+
qq => qq.Term(f => f.Name, "bar2")
50+
)
51+
.MinimumNumberShouldMatch("50%")
52+
)
53+
|| q.Term(f => f.Name, "blah2")
54+
);
55+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
56+
}
57+
58+
[Test]
59+
public void ShouldJoinIntoNonStrictShouldQuery()
60+
{
61+
var s = new SearchDescriptor<ElasticSearchProject>()
62+
.Query(q =>
63+
q.Bool(
64+
bf => bf.Should(
65+
qq => qq.Term(f => f.Name, "foo2"),
66+
qq => qq.Term(f => f.Name, "bar2")
67+
)
68+
)
69+
|| q.Term(f => f.Name, "blah2")
70+
);
71+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
72+
}
73+
74+
75+
[Test]
76+
public void ShouldJoinIntoMustQuery()
77+
{
78+
var s = new SearchDescriptor<ElasticSearchProject>()
79+
.Query(q =>
80+
q.Bool(
81+
bf => bf.Must(
82+
qq => qq.Term(f => f.Name, "foo2"),
83+
qq => qq.Term(f => f.Name, "bar2")
84+
)
85+
)
86+
&& q.Term(f => f.Name, "blah2")
87+
);
88+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
89+
}
90+
[Test]
91+
public void ShouldJoinMustNotIntoMustQuery()
92+
{
93+
var s = new SearchDescriptor<ElasticSearchProject>()
94+
.Query(q =>
95+
q.Bool(
96+
bf => bf.Must(
97+
qq => qq.Term(f => f.Name, "foo2"),
98+
qq => qq.Term(f => f.Name, "bar2")
99+
)
100+
)
101+
&& !q.Term(f => f.Name, "blah2")
102+
);
103+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
104+
}
105+
106+
[Test]
107+
public void ShouldNotJoinMustNotIntoMustStrictQuery()
108+
{
109+
var s = new SearchDescriptor<ElasticSearchProject>()
110+
.Query(q =>
111+
q.Strict().Bool(
112+
bf => bf.Must(
113+
qq => qq.Term(f => f.Name, "foo2"),
114+
qq => qq.Term(f => f.Name, "bar2")
115+
)
116+
)
117+
&& !q.Term(f => f.Name, "blah2")
118+
);
119+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
120+
}
121+
122+
[Test]
123+
public void ShouldNotJoinMustNotIntoMustStrictQueryInverse()
124+
{
125+
var s = new SearchDescriptor<ElasticSearchProject>()
126+
.Query(q =>
127+
!q.Term(f => f.Name, "blah2")
128+
&& q.Strict().Bool(
129+
bf => bf.Must(
130+
qq => qq.Term(f => f.Name, "foo2"),
131+
qq => qq.Term(f => f.Name, "bar2")
132+
)
133+
)
134+
);
135+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
136+
}
137+
138+
[Test]
139+
public void ShouldNotJoinIntoStrictMustQuery()
140+
{
141+
var s = new SearchDescriptor<ElasticSearchProject>()
142+
.Query(q =>
143+
q.Strict().Bool(
144+
bf => bf.Must(
145+
qq => qq.Term(f => f.Name, "foo2"),
146+
qq => qq.Term(f => f.Name, "bar2")
147+
)
148+
)
149+
&& q.Term(f => f.Name, "blah2")
150+
);
151+
this.JsonEquals(s, MethodBase.GetCurrentMethod());
152+
}
153+
154+
}
155+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"query": {
3+
"bool": {
4+
"must": [
5+
{
6+
"term": {
7+
"name": {
8+
"value": "foo2"
9+
}
10+
}
11+
},
12+
{
13+
"term": {
14+
"name": {
15+
"value": "bar2"
16+
}
17+
}
18+
},
19+
{
20+
"term": {
21+
"name": {
22+
"value": "blah2"
23+
}
24+
}
25+
}
26+
]
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)