Skip to content

Commit 97f2085

Browse files
committed
Merge pull request #2109 from elastic/fix/2086
Fix compound query conditionless logic
2 parents 0e97afd + 4bd2e24 commit 97f2085

File tree

17 files changed

+152
-92
lines changed

17 files changed

+152
-92
lines changed

src/CodeGeneration/CodeGeneration.LowLevelClient/CodeGeneration.LowLevelClient.project.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"locked": false,
3-
"version": 2,
3+
"version": 1,
44
"targets": {
55
".NETFramework,Version=v4.5": {},
66
".NETFramework,Version=v4.5/win": {}

src/CodeGeneration/Nest.Litterateur/Nest.Litterateur.project.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"locked": false,
3-
"version": 2,
3+
"version": 1,
44
"targets": {
55
".NETFramework,Version=v4.5": {},
66
".NETFramework,Version=v4.5/win": {}

src/Elasticsearch.Net/Elasticsearch.Net.project.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"locked": false,
3-
"version": 2,
3+
"version": 1,
44
"targets": {
55
".NETFramework,Version=v4.5": {},
66
".NETFramework,Version=v4.5/win": {}

src/Nest/CommonAbstractions/Extensions/Extensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ namespace Nest
1515
{
1616
internal static class Extensions
1717
{
18+
internal static bool NotWritable(this QueryContainer q) => q == null || !q.IsWritable;
19+
20+
internal static bool NotWritable(this IEnumerable<QueryContainer> qs) => qs == null || qs.All(q => q.NotWritable());
21+
1822
internal static TReturn InvokeOrDefault<T, TReturn>(this Func<T, TReturn> func, T @default)
1923
where T : class, TReturn where TReturn : class =>
2024
func?.Invoke(@default) ?? @default;

src/Nest/QueryDsl/Compound/And/AndQuery.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ public class AndQuery : QueryBase, IAndQuery
2121
public IEnumerable<QueryContainer> Filters { get; set; }
2222

2323
internal override void InternalWrapInContainer(IQueryContainer c) => c.And = this;
24-
internal static bool IsConditionless(IAndQuery q)
25-
{
26-
return !q.Filters.HasAny() || q.Filters.All(f => f.IsConditionless);
27-
}
24+
internal static bool IsConditionless(IAndQuery q) => q.Filters.NotWritable();
2825
}
2926

3027
[Obsolete("Use the bool query with a must clause instead. The bool query should not have other clauses to be semantically correct")]

src/Nest/QueryDsl/Compound/Bool/BoolQuery.cs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,21 +95,8 @@ public class BoolQuery : QueryBase, IBoolQuery
9595
internal override void InternalWrapInContainer(IQueryContainer c) => c.Bool = this;
9696

9797
protected override bool Conditionless => IsConditionless(this);
98-
internal static bool IsConditionless(IBoolQuery q)
99-
{
100-
var musts = q.Must == null || q.Must.All(qq => qq.IsConditionless());
101-
if (!musts) return false;
102-
103-
var shoulds = q.Should == null || q.Should.All(qq => qq.IsConditionless());
104-
if (!shoulds) return false;
105-
106-
var filters = q.Filter == null || q.Filter.All(qq => qq.IsConditionless());
107-
if (!filters) return false;
108-
109-
var mustNots = q.MustNot == null || q.MustNot.All(qq => qq.IsConditionless());
110-
111-
return mustNots;
112-
}
98+
internal static bool IsConditionless(IBoolQuery q) =>
99+
q.Must.NotWritable() && q.MustNot.NotWritable() && q.Should.NotWritable() && q.Filter.NotWritable();
113100
}
114101

115102
public class BoolQueryDescriptor<T>

src/Nest/QueryDsl/Compound/Boosting/BoostingQuery.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ public class BoostingQuery : QueryBase, IBoostingQuery
2727
public double? NegativeBoost { get; set; }
2828

2929
internal override void InternalWrapInContainer(IQueryContainer c) => c.Boosting = this;
30-
internal static bool IsConditionless(IBoostingQuery q) =>
31-
q.NegativeQuery.IsConditionless() && q.PositiveQuery.IsConditionless();
30+
internal static bool IsConditionless(IBoostingQuery q) => q.NegativeQuery.NotWritable() && q.PositiveQuery.NotWritable();
3231
}
3332

34-
public class BoostingQueryDescriptor<T>
33+
public class BoostingQueryDescriptor<T>
3534
: QueryDescriptorBase<BoostingQueryDescriptor<T>, IBoostingQuery>
3635
, IBoostingQuery where T : class
3736
{
@@ -42,10 +41,10 @@ public class BoostingQueryDescriptor<T>
4241

4342
public BoostingQueryDescriptor<T> NegativeBoost(double? boost) => Assign(a => a.NegativeBoost = boost);
4443

45-
public BoostingQueryDescriptor<T> Positive(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
44+
public BoostingQueryDescriptor<T> Positive(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
4645
Assign(a => a.PositiveQuery = selector?.Invoke(new QueryContainerDescriptor<T>()));
4746

48-
public BoostingQueryDescriptor<T> Negative(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
47+
public BoostingQueryDescriptor<T> Negative(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
4948
Assign(a => a.NegativeQuery = selector?.Invoke(new QueryContainerDescriptor<T>()));
5049
}
5150
}

src/Nest/QueryDsl/Compound/ConstantScore/ConstantScoreQuery.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ public class ConstantScoreQuery : QueryBase, IConstantScoreQuery
2121
public QueryContainer Filter { get; set; }
2222

2323
internal override void InternalWrapInContainer(IQueryContainer c) => c.ConstantScore = this;
24-
internal static bool IsConditionless(IConstantScoreQuery q) => q.Filter.IsConditionless();
24+
internal static bool IsConditionless(IConstantScoreQuery q) => q.Filter.NotWritable();
2525
}
2626

27-
public class ConstantScoreQueryDescriptor<T>
27+
public class ConstantScoreQueryDescriptor<T>
2828
: QueryDescriptorBase<ConstantScoreQueryDescriptor<T>, IConstantScoreQuery>
2929
, IConstantScoreQuery where T : class
3030
{
3131
protected override bool Conditionless => ConstantScoreQuery.IsConditionless(this);
3232
QueryContainer IConstantScoreQuery.Filter { get; set; }
3333

34-
public ConstantScoreQueryDescriptor<T> Filter(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
34+
public ConstantScoreQueryDescriptor<T> Filter(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
3535
Assign(a => a.Filter = selector?.Invoke(new QueryContainerDescriptor<T>()));
3636
}
3737
}

src/Nest/QueryDsl/Compound/Dismax/DismaxQuery.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,21 @@ public class DisMaxQuery : QueryBase, IDisMaxQuery
2323
public IEnumerable<QueryContainer> Queries { get; set; }
2424

2525
internal override void InternalWrapInContainer(IQueryContainer c) => c.DisMax = this;
26-
internal static bool IsConditionless(IDisMaxQuery q) => !q.Queries.HasAny() || q.Queries.All(qq => qq.IsConditionless);
26+
internal static bool IsConditionless(IDisMaxQuery q) => q.Queries.NotWritable();
2727
}
2828

29-
public class DisMaxQueryDescriptor<T>
29+
public class DisMaxQueryDescriptor<T>
3030
: QueryDescriptorBase<DisMaxQueryDescriptor<T>, IDisMaxQuery>
3131
, IDisMaxQuery where T : class
3232
{
3333
protected override bool Conditionless => DisMaxQuery.IsConditionless(this);
3434
double? IDisMaxQuery.TieBreaker { get; set; }
3535
IEnumerable<QueryContainer> IDisMaxQuery.Queries { get; set; }
3636

37-
public DisMaxQueryDescriptor<T> Queries(params Func<QueryContainerDescriptor<T>, QueryContainer>[] querySelectors) =>
37+
public DisMaxQueryDescriptor<T> Queries(params Func<QueryContainerDescriptor<T>, QueryContainer>[] querySelectors) =>
3838
Assign(a => a.Queries = querySelectors.Select(q=>q?.Invoke(new QueryContainerDescriptor<T>())).Where(q => q != null).ToListOrNullIfEmpty());
3939

40-
public DisMaxQueryDescriptor<T> Queries(IEnumerable<Func<QueryContainerDescriptor<T>, QueryContainer>> querySelectors) =>
40+
public DisMaxQueryDescriptor<T> Queries(IEnumerable<Func<QueryContainerDescriptor<T>, QueryContainer>> querySelectors) =>
4141
Assign(a => a.Queries = querySelectors.Select(q=>q?.Invoke(new QueryContainerDescriptor<T>())).Where(q => q != null).ToListOrNullIfEmpty());
4242

4343
public DisMaxQueryDescriptor<T> Queries(params QueryContainer[] queries) => Assign(a => a.Queries = queries.Where(q => q != null).ToListOrNullIfEmpty());

src/Nest/QueryDsl/Compound/Filtered/FilteredQuery.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,22 @@ public class FilteredQuery : QueryBase, IFilteredQuery
2424

2525
internal override void InternalWrapInContainer(IQueryContainer c) => c.Filtered = this;
2626

27-
internal static bool IsConditionless(IFilteredQuery q)
28-
{
29-
if (q.Query == null && q.Filter == null)
30-
return true;
31-
if (q.Filter == null && q.Query != null)
32-
return q.Query.IsConditionless;
33-
if (q.Filter != null && q.Query == null)
34-
return q.Filter.IsConditionless;
35-
return q.Query.IsConditionless() && q.Filter.IsConditionless();
36-
}
27+
internal static bool IsConditionless(IFilteredQuery q) => q.Query.NotWritable() && q.Filter.NotWritable();
3728
}
3829

3930
[Obsolete("Use the bool query instead with a must clause for the query and a filter clause for the filter.")]
40-
public class FilteredQueryDescriptor<T>
41-
: QueryDescriptorBase<FilteredQueryDescriptor<T>, IFilteredQuery>
31+
public class FilteredQueryDescriptor<T>
32+
: QueryDescriptorBase<FilteredQueryDescriptor<T>, IFilteredQuery>
4233
, IFilteredQuery where T : class
4334
{
4435
protected override bool Conditionless => FilteredQuery.IsConditionless(this);
4536
QueryContainer IFilteredQuery.Query { get; set; }
4637
QueryContainer IFilteredQuery.Filter { get; set; }
4738

48-
public FilteredQueryDescriptor<T> Query(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
39+
public FilteredQueryDescriptor<T> Query(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
4940
Assign(a => a.Query = selector?.Invoke(new QueryContainerDescriptor<T>()));
5041

51-
public FilteredQueryDescriptor<T> Filter(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
42+
public FilteredQueryDescriptor<T> Filter(Func<QueryContainerDescriptor<T>, QueryContainer> selector) =>
5243
Assign(a => a.Filter = selector?.Invoke(new QueryContainerDescriptor<T>()));
5344
}
5445
}

0 commit comments

Comments
 (0)