@@ -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>
0 commit comments