diff --git a/src/Nest/DSL/Filter/HasChildFilterDescriptor.cs b/src/Nest/DSL/Filter/HasChildFilterDescriptor.cs index 551442d13be..6db5ee221e2 100644 --- a/src/Nest/DSL/Filter/HasChildFilterDescriptor.cs +++ b/src/Nest/DSL/Filter/HasChildFilterDescriptor.cs @@ -15,6 +15,9 @@ public interface IHasChildFilter : IFilter [JsonProperty("query")] IQueryContainer Query { get; set; } + + [JsonProperty("filter")] + IFilterContainer Filter { get; set; } } public class HasChildFilter : PlainFilter, IHasChildFilter @@ -26,6 +29,7 @@ protected internal override void WrapInContainer(IFilterContainer container) public TypeNameMarker Type { get; set; } public IQueryContainer Query { get; set; } + public IFilterContainer Filter { get; set; } } public class HasChildFilterDescriptor : FilterBase, IHasChildFilter where T : class @@ -35,15 +39,25 @@ bool IFilter.IsConditionless get { var hf = ((IHasChildFilter)this); - return hf.Query == null || hf.Query.IsConditionless || hf.Type.IsNullOrEmpty(); + if (hf.Type.IsNullOrEmpty()) + return true; + + if (hf.Query == null && hf.Filter == null) + return true; + if (hf.Filter == null && hf.Query != null) + return hf.Query.IsConditionless; + if (hf.Filter != null && hf.Query == null) + return hf.Filter.IsConditionless; + return hf.Query.IsConditionless && hf.Filter.IsConditionless; } } TypeNameMarker IHasChildFilter.Type { get; set; } - IQueryContainer IHasChildFilter.Query { get; set; } + IFilterContainer IHasChildFilter.Filter { get; set; } + public HasChildFilterDescriptor() { ((IHasChildFilter)this).Type = TypeNameMarker.Create(); @@ -55,7 +69,14 @@ public HasChildFilterDescriptor Query(Func, QueryContainer ((IHasChildFilter)this).Query = querySelector(q); return this; } - + + public HasChildFilterDescriptor Filter(Func, FilterContainer> filterSelector) + { + var f = new FilterDescriptor(); + ((IHasChildFilter) this).Filter = filterSelector(f); + return this; + } + public HasChildFilterDescriptor Type(string type) { ((IHasChildFilter)this).Type = type; diff --git a/src/Tests/Nest.Tests.Unit/QueryParsers/Filter/HasChildFilterTests.cs b/src/Tests/Nest.Tests.Unit/QueryParsers/Filter/HasChildFilterTests.cs index db12897d4c1..86438d92ea0 100644 --- a/src/Tests/Nest.Tests.Unit/QueryParsers/Filter/HasChildFilterTests.cs +++ b/src/Tests/Nest.Tests.Unit/QueryParsers/Filter/HasChildFilterTests.cs @@ -14,13 +14,18 @@ public void HasChild_Deserializes(string cacheName, string cacheKey, bool cache) var hasChildFilter = this.SerializeThenDeserialize(cacheName, cacheKey, cache, f=>f.HasChild, f=>f.HasChild(d=>d - .Query(q=>q.Term(p=>p.FirstName, "value")) + .Query(q => q.Term(p => p.FirstName, "value")) + .Filter(q => q.Term(p => p.Age, 42)) ) ); var query = hasChildFilter.Query; query.Should().NotBeNull(); query.Term.Field.Should().Be("firstName"); + + var filter = hasChildFilter.Filter; + filter.Should().NotBeNull(); + filter.Term.Field.Should().Be("age"); } } diff --git a/src/Tests/Nest.Tests.Unit/Search/Filter/ConditionLess/ConditionLessTests.cs b/src/Tests/Nest.Tests.Unit/Search/Filter/ConditionLess/ConditionLessTests.cs index 2b534c3c15c..5a954d2664c 100644 --- a/src/Tests/Nest.Tests.Unit/Search/Filter/ConditionLess/ConditionLessTests.cs +++ b/src/Tests/Nest.Tests.Unit/Search/Filter/ConditionLess/ConditionLessTests.cs @@ -116,6 +116,8 @@ public void HasChildTest() { this.DoConditionlessFilter(f => f.HasChild(null)); this.DoConditionlessFilter(f => f.HasChild(q=>q.Query(qq=>qq.Term(p=>p.FirstName, string.Empty)))); + this.DoConditionlessFilter(f => f.HasChild(q=>q.Filter(qq=>qq.Term(p=>p.FirstName, string.Empty)))); + this.DoConditionlessFilter(f => f.HasChild(q => q.Query(qq => qq.Term(p => p.FirstName, string.Empty)).Filter(qq => qq.Term(p => p.FirstName, string.Empty)))); } diff --git a/src/Tests/Nest.Tests.Unit/Search/Filter/Singles/HasChildFilterJson.cs b/src/Tests/Nest.Tests.Unit/Search/Filter/Singles/HasChildFilterJson.cs index 1dd4ddac0e0..756e6fe227e 100644 --- a/src/Tests/Nest.Tests.Unit/Search/Filter/Singles/HasChildFilterJson.cs +++ b/src/Tests/Nest.Tests.Unit/Search/Filter/Singles/HasChildFilterJson.cs @@ -12,7 +12,8 @@ public void HasChildFilter() var s = new SearchDescriptor().From(0).Size(10) .Filter(ff=>ff .HasChild(d=>d - .Query(q=>q.Term(p=>p.FirstName, "value")) + .Query(q => q.Term(p => p.FirstName, "value")) + .Filter(q => q.Term(p => p.Age, 42)) ) ); @@ -27,6 +28,11 @@ public void HasChildFilter() ""value"": ""value"" } } + }, + ""filter"": { + ""term"": { + ""age"": 42 + } } } }