Skip to content

Commit 49d1d2b

Browse files
committed
has_parent filter was added in 0.19.10
1 parent 0c4ee32 commit 49d1d2b

File tree

7 files changed

+120
-1
lines changed

7 files changed

+120
-1
lines changed

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

Lines changed: 1 addition & 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\Singles\HasParentFilterJson.cs" />
110111
<Compile Include="Search\Rescore\RescoreTests.cs" />
111112
<Compile Include="Search\Facets\DateHistogramFacetJson.cs" />
112113
<Compile Include="Search\Facets\FacetJson.cs" />

src/Nest.Tests.Unit/Search/Filter/Singles/HasChildFilterJson.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void HasChildFilter()
3333
}
3434
}
3535
}";
36-
Assert.True(json.JsonEquals(expected), json);
36+
Assert.True(json.JsonEquals(expected), json);
3737
}
3838
}
3939
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using NUnit.Framework;
2+
using Nest.Tests.MockData.Domain;
3+
4+
namespace Nest.Tests.Unit.Search.Filter.Singles
5+
{
6+
[TestFixture]
7+
public class HasParentFilterJson
8+
{
9+
[Test]
10+
public void HasParentFilter()
11+
{
12+
var s = new SearchDescriptor<Person>().From(0).Size(10)
13+
.Filter(ff=>ff
14+
.HasParent<ElasticSearchProject>(d=>d
15+
.Scope("my_scope")
16+
.Query(q=>q.Term(p=>p.Country, "value"))
17+
)
18+
);
19+
20+
var json = TestElasticClient.Serialize(s);
21+
var expected = @"{ from: 0, size: 10,
22+
filter : {
23+
""has_parent"": {
24+
""type"": ""elasticsearchprojects"",
25+
""_scope"": ""my_scope"",
26+
""query"": {
27+
""term"": {
28+
""country"": {
29+
""value"": ""value""
30+
}
31+
}
32+
}
33+
}
34+
}
35+
}";
36+
Assert.True(json.JsonEquals(expected), json);
37+
}
38+
}
39+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using Newtonsoft.Json;
6+
using System.Linq.Expressions;
7+
using Nest.Resolvers;
8+
9+
namespace Nest
10+
{
11+
[JsonObject(MemberSerialization=MemberSerialization.OptIn)]
12+
public class HasParentFilterDescriptor<T> : FilterBase where T : class
13+
{
14+
public HasParentFilterDescriptor()
15+
{
16+
this._Type = new TypeNameResolver().GetTypeNameFor<T>();
17+
}
18+
internal override bool IsConditionless
19+
{
20+
get
21+
{
22+
return this._QueryDescriptor == null || this._QueryDescriptor.IsConditionless || this._Type.IsNullOrEmpty();
23+
}
24+
}
25+
26+
[JsonProperty("type")]
27+
internal TypeNameMarker _Type { get; set; }
28+
29+
[JsonProperty("_scope")]
30+
internal string _Scope { get; set;}
31+
32+
[JsonProperty("query")]
33+
internal BaseQuery _QueryDescriptor { get; set; }
34+
35+
public HasParentFilterDescriptor<T> Query(Func<QueryDescriptor<T>, BaseQuery> querySelector)
36+
{
37+
var q = new QueryDescriptor<T>();
38+
this._QueryDescriptor = querySelector(q);
39+
return this;
40+
}
41+
42+
public HasParentFilterDescriptor<T> Scope(string scope)
43+
{
44+
this._Scope = scope;
45+
return this;
46+
}
47+
public HasParentFilterDescriptor<T> Type(string type)
48+
{
49+
this._Type = type;
50+
return this;
51+
}
52+
}
53+
}

src/Nest/DSL/FilterDescriptor.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ public FilterDescriptor<T> Cache(bool cache)
7575
[JsonProperty(PropertyName = "has_child")]
7676
internal object HasChildFilter { get; set; }
7777

78+
[JsonProperty(PropertyName = "has_parent")]
79+
internal object HasParentFilter { get; set; }
80+
7881
[JsonProperty(PropertyName = "numeric_range")]
7982
internal Dictionary<string, object> NumericRangeFilter { get; set; }
8083

@@ -150,6 +153,7 @@ internal FilterDescriptor<T> Clone()
150153
TypeFilter = TypeFilter,
151154
MatchAllFilter = MatchAllFilter,
152155
HasChildFilter = HasChildFilter,
156+
HasParentFilter = HasParentFilter,
153157
NumericRangeFilter = NumericRangeFilter,
154158
RangeFilter = RangeFilter,
155159
PrefixFilter = PrefixFilter,
@@ -498,6 +502,26 @@ public BaseFilter HasChild<K>(Action<HasChildFilterDescriptor<K>> filterSelector
498502

499503
return new FilterDescriptor<T>() { HasChildFilter = filter };
500504
}
505+
506+
/// <summary>
507+
/// The has_child filter accepts a query and the child type to run against,
508+
/// and results in parent documents that have child docs matching the query.
509+
/// </summary>
510+
/// <typeparam name="K">Type of the child</typeparam>
511+
public BaseFilter HasParent<K>(Action<HasParentFilterDescriptor<K>> filterSelector) where K : class
512+
{
513+
var filter = new HasParentFilterDescriptor<K>();
514+
if (filterSelector == null)
515+
return CreateConditionlessFilterDescriptor("has_parent", filter);
516+
517+
filterSelector(filter);
518+
519+
if (filter.IsConditionless)
520+
return CreateConditionlessFilterDescriptor("has_parent", filter);
521+
522+
return new FilterDescriptor<T>() { HasParentFilter = filter };
523+
}
524+
501525
/// <summary>
502526
/// A limit filter limits the number of documents (per shard) to execute on.
503527
/// </summary>

src/Nest/DSL/IFilterDescriptor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ interface IFilterDescriptor<T>
2323
BaseFilter GeoPolygon(string field, IEnumerable<Tuple<double, double>> points);
2424
BaseFilter GeoPolygon(string fieldName, params string[] points);
2525
BaseFilter HasChild<K>(Action<HasChildFilterDescriptor<K>> querySelector) where K : class;
26+
BaseFilter HasParent<K>(Action<HasParentFilterDescriptor<K>> querySelector) where K : class;
2627
BaseFilter Ids(IEnumerable<string> types, IEnumerable<string> values);
2728
BaseFilter Ids(IEnumerable<string> values);
2829
BaseFilter Ids(string type, IEnumerable<string> values);

src/Nest/Nest.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
<Compile Include="Domain\Connection\ConnectionStatusTracer.cs" />
7171
<Compile Include="Domain\PathAndData.cs" />
7272
<Compile Include="DSL\BulkUpdateDescriptor.cs" />
73+
<Compile Include="DSL\Filter\HasParentFilterDescriptor.cs" />
7374
<Compile Include="DSL\PercolatorDescriptor.cs" />
7475
<Compile Include="DSL\PercolateDescriptor.cs" />
7576
<Compile Include="Extensions\NameValueCollectionExtensions.cs" />

0 commit comments

Comments
 (0)