@@ -42,7 +42,7 @@ public AutocompleteSearchDefinition(
4242 _fuzzy = fuzzy ;
4343 }
4444
45- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
45+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
4646 new ( )
4747 {
4848 { "query" , _query . Render ( ) } ,
@@ -76,7 +76,7 @@ public CompoundSearchDefinition(
7676 _minimumShouldMatch = minimumShouldMatch ;
7777 }
7878
79- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry )
79+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext )
8080 {
8181 return new ( )
8282 {
@@ -88,7 +88,33 @@ private protected override BsonDocument RenderArguments(IBsonSerializer<TDocumen
8888 } ;
8989
9090 Func < BsonArray > Render ( List < SearchDefinition < TDocument > > searchDefinitions ) =>
91- ( ) => new BsonArray ( searchDefinitions . Select ( clause => clause . Render ( documentSerializer , serializerRegistry ) ) ) ;
91+ ( ) => new BsonArray ( searchDefinitions . Select ( clause => clause . Render ( renderContext ) ) ) ;
92+ }
93+ }
94+
95+ internal sealed class EmbeddedDocumentSearchDefinition < TDocument , TField > : OperatorSearchDefinition < TDocument >
96+ {
97+ private readonly SearchDefinition < TField > _operator ;
98+
99+ public EmbeddedDocumentSearchDefinition ( FieldDefinition < TDocument , IEnumerable < TField > > path , SearchDefinition < TField > @operator , SearchScoreDefinition < TDocument > score )
100+ : base ( OperatorType . EmbeddedDocument ,
101+ new SingleSearchPathDefinition < TDocument > ( path ) ,
102+ score )
103+ {
104+ _operator = Ensure . IsNotNull ( @operator , nameof ( @operator ) ) ;
105+ }
106+
107+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext )
108+ {
109+ // Add base path to all nested operator paths
110+ var pathPrefix = _path . Render ( renderContext ) . AsString ;
111+
112+ var newRenderContext = new SearchDefinitionRenderContext < TField > (
113+ renderContext . SerializerRegistry . GetSerializer < TField > ( ) ,
114+ renderContext . SerializerRegistry ,
115+ pathPrefix ) ;
116+
117+ return new ( "operator" , _operator . Render ( newRenderContext ) ) ;
92118 }
93119 }
94120
@@ -102,7 +128,7 @@ public EqualsSearchDefinition(FieldDefinition<TDocument> path, TField value, Sea
102128 _value = ToBsonValue ( value ) ;
103129 }
104130
105- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
131+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
106132 new ( "value" , _value ) ;
107133
108134 private static BsonValue ToBsonValue ( TField value ) =>
@@ -145,11 +171,11 @@ public FacetSearchDefinition(SearchDefinition<TDocument> @operator, IEnumerable<
145171 _facets = Ensure . IsNotNull ( facets , nameof ( facets ) ) . ToArray ( ) ;
146172 }
147173
148- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
174+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
149175 new ( )
150176 {
151- { "operator" , _operator . Render ( documentSerializer , serializerRegistry ) } ,
152- { "facets" , new BsonDocument ( _facets . Select ( f => new BsonElement ( f . Name , f . Render ( documentSerializer , serializerRegistry ) ) ) ) }
177+ { "operator" , _operator . Render ( renderContext ) } ,
178+ { "facets" , new BsonDocument ( _facets . Select ( f => new BsonElement ( f . Name , f . Render ( renderContext ) ) ) ) }
153179 } ;
154180 }
155181
@@ -170,7 +196,7 @@ public GeoShapeSearchDefinition(
170196 _relation = relation ;
171197 }
172198
173- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
199+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
174200 new ( )
175201 {
176202 { "geometry" , _geometry . ToBsonDocument ( ) } ,
@@ -192,7 +218,7 @@ public GeoWithinSearchDefinition(
192218 _area = Ensure . IsNotNull ( area , nameof ( area ) ) ;
193219 }
194220
195- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
221+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
196222 new ( _area . Render ( ) ) ;
197223 }
198224
@@ -206,13 +232,13 @@ public MoreLikeThisSearchDefinition(IEnumerable<TLike> like)
206232 _like = Ensure . IsNotNull ( like , nameof ( like ) ) . ToArray ( ) ;
207233 }
208234
209- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry )
235+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext )
210236 {
211237 var likeSerializer = typeof ( TLike ) switch
212238 {
213239 var t when t == typeof ( BsonDocument ) => null ,
214- var t when t == typeof ( TDocument ) => ( IBsonSerializer < TLike > ) documentSerializer ,
215- _ => serializerRegistry . GetSerializer < TLike > ( )
240+ var t when t == typeof ( TDocument ) => ( IBsonSerializer < TLike > ) renderContext . DocumentSerializer ,
241+ _ => renderContext . SerializerRegistry . GetSerializer < TLike > ( )
216242 } ;
217243
218244 return new ( "like" , new BsonArray ( _like . Select ( document => document . ToBsonDocument ( likeSerializer ) ) ) ) ;
@@ -235,7 +261,7 @@ public NearSearchDefinition(
235261 _pivot = pivot ;
236262 }
237263
238- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
264+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
239265 new ( )
240266 {
241267 { "origin" , _origin } ,
@@ -259,7 +285,7 @@ public PhraseSearchDefinition(
259285 _slop = slop ;
260286 }
261287
262- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
288+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
263289 new ( )
264290 {
265291 { "query" , _query . Render ( ) } ,
@@ -269,20 +295,20 @@ private protected override BsonDocument RenderArguments(IBsonSerializer<TDocumen
269295
270296 internal sealed class QueryStringSearchDefinition < TDocument > : OperatorSearchDefinition < TDocument >
271297 {
272- private readonly FieldDefinition < TDocument > _defaultPath ;
298+ private readonly SingleSearchPathDefinition < TDocument > _defaultPath ;
273299 private readonly string _query ;
274300
275301 public QueryStringSearchDefinition ( FieldDefinition < TDocument > defaultPath , string query , SearchScoreDefinition < TDocument > score )
276302 : base ( OperatorType . QueryString , score )
277303 {
278- _defaultPath = Ensure . IsNotNull ( defaultPath , nameof ( defaultPath ) ) ;
304+ _defaultPath = new SingleSearchPathDefinition < TDocument > ( defaultPath ) ;
279305 _query = Ensure . IsNotNull ( query , nameof ( query ) ) ;
280306 }
281307
282- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
308+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
283309 new ( )
284310 {
285- { "defaultPath" , _defaultPath . Render ( documentSerializer , serializerRegistry ) . FieldName } ,
311+ { "defaultPath" , _defaultPath . Render ( renderContext ) } ,
286312 { "query" , _query }
287313 } ;
288314 }
@@ -305,7 +331,7 @@ public RangeSearchDefinition(
305331 _max = ToBsonValue ( _range . Max ) ;
306332 }
307333
308- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
334+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
309335 new ( )
310336 {
311337 { _range . IsMinInclusive ? "gte" : "gt" , _min , _min != null } ,
@@ -347,7 +373,7 @@ public RegexSearchDefinition(
347373 _allowAnalyzedField = allowAnalyzedField ;
348374 }
349375
350- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
376+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
351377 new ( )
352378 {
353379 { "query" , _query . Render ( ) } ,
@@ -365,8 +391,8 @@ public SpanSearchDefinition(SearchSpanDefinition<TDocument> clause)
365391 _clause = Ensure . IsNotNull ( clause , nameof ( clause ) ) ;
366392 }
367393
368- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
369- _clause . Render ( documentSerializer , serializerRegistry ) ;
394+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
395+ _clause . Render ( renderContext ) ;
370396 }
371397
372398 internal sealed class TextSearchDefinition < TDocument > : OperatorSearchDefinition < TDocument >
@@ -385,7 +411,7 @@ public TextSearchDefinition(
385411 _fuzzy = fuzzy ;
386412 }
387413
388- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
414+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
389415 new ( )
390416 {
391417 { "query" , _query . Render ( ) } ,
@@ -409,7 +435,7 @@ public WildcardSearchDefinition(
409435 _allowAnalyzedField = allowAnalyzedField ;
410436 }
411437
412- private protected override BsonDocument RenderArguments ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry ) =>
438+ private protected override BsonDocument RenderArguments ( SearchDefinitionRenderContext < TDocument > renderContext ) =>
413439 new ( )
414440 {
415441 { "query" , _query . Render ( ) } ,
0 commit comments