Skip to content

Commit a3f0413

Browse files
committed
Started on conditionless filters
1 parent 258404c commit a3f0413

23 files changed

+312
-176
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using NUnit.Framework;
6+
using Newtonsoft.Json;
7+
using Newtonsoft.Json.Linq;
8+
9+
using Nest;
10+
using Newtonsoft.Json.Converters;
11+
using Nest.Resolvers.Converters;
12+
using Nest.Tests.MockData.Domain;
13+
14+
namespace Nest.Tests.Unit.FilterJson.ConditionLess
15+
{
16+
[TestFixture]
17+
public class ConditionLessTests : BaseJsonTests
18+
{
19+
public class Criteria
20+
{
21+
public string Name1 { get; set; }
22+
public string Name2 { get; set; }
23+
public int? Int1 { get; set; }
24+
public DateTime? Date { get; set; }
25+
}
26+
private readonly Criteria _c = new Criteria();
27+
28+
private void DoConditionlessQuery(Func<FilterDescriptor<ElasticSearchProject>, BaseFilter> filter)
29+
{
30+
var criteria = new Criteria { };
31+
var s = new SearchDescriptor<ElasticSearchProject>()
32+
.Strict()
33+
.From(0)
34+
.Take(10)
35+
.Filter(filter);
36+
37+
this.JsonEquals(s, System.Reflection.MethodInfo.GetCurrentMethod(), "MatchAll");
38+
}
39+
40+
41+
}
42+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"from": 0,
3+
"size": 10,
4+
}
5+

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<Compile Include="Facets\TermsStatsFacetJson.cs" />
7777
<Compile Include="FilterJson\BoolCombinations\BoolCombinationTests.cs" />
7878
<Compile Include="FilterJson\BoolFiltersInFacets\BoolFiltersInFacetsTests.cs" />
79+
<Compile Include="FilterJson\ConditionLess\ConditionLessTests.cs" />
7980
<Compile Include="FilterJson\InsideBoolCalls\InsideBoolCallsTests.cs" />
8081
<Compile Include="FilterJson\FiltersInQueries\FiltersInQueriesTests.cs" />
8182
<Compile Include="FilterJson\FilterCalls\FilterCallsTests.cs" />
@@ -256,6 +257,7 @@
256257
<None Include="FilterJson\Bool\StaticBoolTest.json">
257258
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
258259
</None>
260+
<None Include="FilterJson\ConditionLess\MatchAll.json" />
259261
<None Include="FilterJson\InsideBoolCalls\InsideMustNot.json">
260262
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
261263
</None>
Lines changed: 135 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using Newtonsoft.Json;
6-
using Newtonsoft.Json.Converters;
7-
using Nest.Resolvers.Converters;
8-
using System.Linq.Expressions;
9-
10-
namespace Nest
11-
{
12-
public class BaseFilter
13-
{
14-
[JsonProperty(PropertyName = "bool")]
15-
internal BoolBaseFilterDescriptor BoolFilterDescriptor { get; set; }
16-
17-
public static BaseFilter operator &(BaseFilter lbq, BaseFilter rbq)
18-
{
19-
var f = new BaseFilter();
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Converters;
7+
using Nest.Resolvers.Converters;
8+
using System.Linq.Expressions;
9+
10+
namespace Nest
11+
{
12+
public class BaseFilter
13+
{
14+
[JsonProperty(PropertyName = "bool")]
15+
internal BoolBaseFilterDescriptor BoolFilterDescriptor { get; set; }
16+
17+
internal bool IsConditionless { get; set; }
18+
19+
public static BaseFilter operator &(BaseFilter lbq, BaseFilter rbq)
20+
{
21+
if (lbq.IsConditionless && rbq.IsConditionless)
22+
return new BaseFilter() { IsConditionless = true };
23+
else if (lbq.IsConditionless)
24+
return rbq;
25+
else if (rbq.IsConditionless)
26+
return lbq;
27+
28+
var f = new BaseFilter();
2029
var fq = new BoolBaseFilterDescriptor();
2130
f.BoolFilterDescriptor = fq;
2231

@@ -40,100 +49,110 @@ public class BaseFilter
4049
if (lbq.BoolFilterDescriptor.CanJoinMustNot() && rbq.BoolFilterDescriptor.CanJoinMustNot())
4150
fq._MustNotFilters = lbq.MergeMustNotFilters(rbq);
4251
return f;
43-
}
44-
if (lbq.BoolFilterDescriptor != null)
45-
{
46-
if (lbq.BoolFilterDescriptor._HasOnlyMustNot())
47-
{
48-
fq._MustNotFilters = lbq.BoolFilterDescriptor._MustNotFilters;
49-
fq._MustFilters = new[] { rbq };
50-
return f;
51-
}
52-
53-
else if (lbq.BoolFilterDescriptor.CanJoinMust())
54-
fq._MustFilters = lbq.MergeMustFilters(rbq);
55-
else
56-
fq._MustFilters = new[] { lbq, rbq };
57-
58-
if (lbq.BoolFilterDescriptor.CanJoinMustNot())
59-
fq._MustNotFilters = lbq.MergeMustNotFilters(rbq);
60-
return f;
61-
}
62-
63-
if (rbq.BoolFilterDescriptor._HasOnlyMustNot())
64-
{
65-
fq._MustNotFilters = rbq.BoolFilterDescriptor._MustNotFilters;
66-
fq._MustFilters = new[] { lbq };
67-
return f;
68-
}
69-
70-
if (rbq.BoolFilterDescriptor.CanJoinMust())
71-
fq._MustFilters = rbq.MergeMustFilters(lbq);
72-
else
73-
fq._MustFilters = new[] { rbq, lbq };
74-
75-
if (rbq.BoolFilterDescriptor.CanJoinMustNot())
76-
fq._MustNotFilters = rbq.MergeMustNotFilters(lbq);
77-
return f;
78-
79-
}
80-
81-
public static BaseFilter operator |(BaseFilter lbq, BaseFilter rbq)
82-
{
83-
var f = new BaseFilter();
84-
var fq = new BoolBaseFilterDescriptor();
85-
fq._ShouldFilters = new[] { lbq, rbq };
86-
f.BoolFilterDescriptor = fq;
87-
88-
if (lbq.BoolFilterDescriptor == null && rbq.BoolFilterDescriptor == null)
89-
{
90-
fq._ShouldFilters = lbq.MergeShouldFilters(rbq);
91-
return f;
92-
}
93-
else if (lbq.BoolFilterDescriptor != null && rbq.BoolFilterDescriptor == null)
94-
{
95-
JoinShouldOnSide(lbq, rbq, fq);
96-
}
97-
else if (rbq.BoolFilterDescriptor != null && lbq.BoolFilterDescriptor == null)
98-
{
99-
JoinShouldOnSide(rbq, lbq, fq);
100-
}
101-
else
102-
{
103-
if (lbq.BoolFilterDescriptor.CanJoinShould() && rbq.BoolFilterDescriptor.CanJoinShould())
104-
fq._ShouldFilters = lbq.MergeShouldFilters(rbq);
105-
else
106-
fq._ShouldFilters = new[] { lbq, rbq };
107-
}
108-
109-
110-
111-
return f;
112-
}
113-
114-
public static BaseFilter operator !(BaseFilter lbq)
115-
{
116-
var f = new BaseFilter();
117-
var fq = new BoolBaseFilterDescriptor();
118-
fq._MustNotFilters = new[] { lbq };
119-
120-
f.BoolFilterDescriptor = fq;
121-
return f;
122-
}
123-
124-
public static bool operator false(BaseFilter a)
125-
{
126-
return false;
127-
}
128-
129-
public static bool operator true(BaseFilter a)
130-
{
131-
return false;
132-
}
133-
134-
private static void JoinShouldOnSide(BaseFilter lbq, BaseFilter rbq, BoolBaseFilterDescriptor bq)
135-
{
136-
bq._ShouldFilters = lbq.MergeShouldFilters(rbq);
137-
}
138-
}
139-
}
52+
}
53+
if (lbq.BoolFilterDescriptor != null)
54+
{
55+
if (lbq.BoolFilterDescriptor._HasOnlyMustNot())
56+
{
57+
fq._MustNotFilters = lbq.BoolFilterDescriptor._MustNotFilters;
58+
fq._MustFilters = new[] { rbq };
59+
return f;
60+
}
61+
62+
else if (lbq.BoolFilterDescriptor.CanJoinMust())
63+
fq._MustFilters = lbq.MergeMustFilters(rbq);
64+
else
65+
fq._MustFilters = new[] { lbq, rbq };
66+
67+
if (lbq.BoolFilterDescriptor.CanJoinMustNot())
68+
fq._MustNotFilters = lbq.MergeMustNotFilters(rbq);
69+
return f;
70+
}
71+
72+
if (rbq.BoolFilterDescriptor._HasOnlyMustNot())
73+
{
74+
fq._MustNotFilters = rbq.BoolFilterDescriptor._MustNotFilters;
75+
fq._MustFilters = new[] { lbq };
76+
return f;
77+
}
78+
79+
if (rbq.BoolFilterDescriptor.CanJoinMust())
80+
fq._MustFilters = rbq.MergeMustFilters(lbq);
81+
else
82+
fq._MustFilters = new[] { rbq, lbq };
83+
84+
if (rbq.BoolFilterDescriptor.CanJoinMustNot())
85+
fq._MustNotFilters = rbq.MergeMustNotFilters(lbq);
86+
return f;
87+
88+
}
89+
90+
public static BaseFilter operator |(BaseFilter lbq, BaseFilter rbq)
91+
{
92+
if (lbq.IsConditionless && rbq.IsConditionless)
93+
return new BaseFilter() { IsConditionless = true };
94+
else if (lbq.IsConditionless)
95+
return rbq;
96+
else if (rbq.IsConditionless)
97+
return lbq;
98+
99+
var f = new BaseFilter();
100+
var fq = new BoolBaseFilterDescriptor();
101+
fq._ShouldFilters = new[] { lbq, rbq };
102+
f.BoolFilterDescriptor = fq;
103+
104+
if (lbq.BoolFilterDescriptor == null && rbq.BoolFilterDescriptor == null)
105+
{
106+
fq._ShouldFilters = lbq.MergeShouldFilters(rbq);
107+
return f;
108+
}
109+
else if (lbq.BoolFilterDescriptor != null && rbq.BoolFilterDescriptor == null)
110+
{
111+
JoinShouldOnSide(lbq, rbq, fq);
112+
}
113+
else if (rbq.BoolFilterDescriptor != null && lbq.BoolFilterDescriptor == null)
114+
{
115+
JoinShouldOnSide(rbq, lbq, fq);
116+
}
117+
else
118+
{
119+
if (lbq.BoolFilterDescriptor.CanJoinShould() && rbq.BoolFilterDescriptor.CanJoinShould())
120+
fq._ShouldFilters = lbq.MergeShouldFilters(rbq);
121+
else
122+
fq._ShouldFilters = new[] { lbq, rbq };
123+
}
124+
125+
126+
127+
return f;
128+
}
129+
130+
public static BaseFilter operator !(BaseFilter lbq)
131+
{
132+
if (lbq.IsConditionless)
133+
return new BaseFilter { IsConditionless = true };
134+
135+
var f = new BaseFilter();
136+
var fq = new BoolBaseFilterDescriptor();
137+
fq._MustNotFilters = new[] { lbq };
138+
139+
f.BoolFilterDescriptor = fq;
140+
return f;
141+
}
142+
143+
public static bool operator false(BaseFilter a)
144+
{
145+
return false;
146+
}
147+
148+
public static bool operator true(BaseFilter a)
149+
{
150+
return false;
151+
}
152+
153+
private static void JoinShouldOnSide(BaseFilter lbq, BaseFilter rbq, BoolBaseFilterDescriptor bq)
154+
{
155+
bq._ShouldFilters = lbq.MergeShouldFilters(rbq);
156+
}
157+
}
158+
}

src/Nest/DSL/Descriptors/BaseQuery.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ public class BaseQuery
1414
[JsonProperty(PropertyName = "bool")]
1515
internal BoolBaseQueryDescriptor BoolQueryDescriptor { get; set; }
1616

17-
internal bool IsConditionlessQueryDescriptor { get; set; }
17+
internal bool IsConditionless { get; set; }
1818

1919
public static BaseQuery operator &(BaseQuery lbq, BaseQuery rbq)
2020
{
21-
if (lbq.IsConditionlessQueryDescriptor && rbq.IsConditionlessQueryDescriptor)
22-
return new BaseQuery() { IsConditionlessQueryDescriptor = true };
23-
else if (lbq.IsConditionlessQueryDescriptor)
21+
if (lbq.IsConditionless && rbq.IsConditionless)
22+
return new BaseQuery() { IsConditionless = true };
23+
else if (lbq.IsConditionless)
2424
return rbq;
25-
else if (rbq.IsConditionlessQueryDescriptor)
25+
else if (rbq.IsConditionless)
2626
return lbq;
2727

2828
var q = new BaseQuery();
@@ -90,11 +90,11 @@ public class BaseQuery
9090

9191
public static BaseQuery operator |(BaseQuery lbq, BaseQuery rbq)
9292
{
93-
if (lbq.IsConditionlessQueryDescriptor && rbq.IsConditionlessQueryDescriptor)
94-
return new BaseQuery() { IsConditionlessQueryDescriptor = true };
95-
else if (lbq.IsConditionlessQueryDescriptor)
93+
if (lbq.IsConditionless && rbq.IsConditionless)
94+
return new BaseQuery() { IsConditionless = true };
95+
else if (lbq.IsConditionless)
9696
return rbq;
97-
else if (rbq.IsConditionlessQueryDescriptor)
97+
else if (rbq.IsConditionless)
9898
return lbq;
9999

100100
var q = new BaseQuery();
@@ -130,8 +130,8 @@ public class BaseQuery
130130

131131
public static BaseQuery operator !(BaseQuery lbq)
132132
{
133-
if (lbq.IsConditionlessQueryDescriptor)
134-
return new BaseQuery { IsConditionlessQueryDescriptor = true };
133+
if (lbq.IsConditionless)
134+
return new BaseQuery { IsConditionless = true };
135135

136136
var q = new BaseQuery();
137137
var bq = new BoolBaseQueryDescriptor();

src/Nest/DSL/Descriptors/Filter/ExistsFilter.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ namespace Nest
88
{
99
public class ExistsFilter : FilterBase
1010
{
11+
internal bool IsConditionless
12+
{
13+
get
14+
{
15+
return this.Field.IsNullOrEmpty();
16+
}
17+
18+
}
19+
1120
[JsonProperty(PropertyName = "field")]
1221
public string Field { get; set;}
1322

0 commit comments

Comments
 (0)