Skip to content

Commit 2e8699b

Browse files
committed
- PR comments
1 parent 377b4be commit 2e8699b

File tree

3 files changed

+45
-56
lines changed

3 files changed

+45
-56
lines changed

src/MongoDB.Driver/Search/OperatorSearchDefinitions.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -176,29 +176,26 @@ private protected override BsonDocument RenderArguments(IBsonSerializer<TDocumen
176176
new(_area.Render());
177177
}
178178

179-
internal sealed class MoreLikeThisSearchDefinition<TDocumentCollection, TDocumentLike> : OperatorSearchDefinition<TDocumentCollection>
179+
internal sealed class MoreLikeThisSearchDefinition<TDocument, TLike> : OperatorSearchDefinition<TDocument>
180180
{
181-
private readonly TDocumentLike[] _like;
181+
private readonly TLike[] _like;
182182

183-
public MoreLikeThisSearchDefinition(IEnumerable<TDocumentLike> like)
183+
public MoreLikeThisSearchDefinition(IEnumerable<TLike> like)
184184
: base(OperatorType.MoreLikeThis)
185185
{
186-
if (typeof(TDocumentLike) != typeof(BsonDocument) &&
187-
typeof(TDocumentLike) != typeof(TDocumentCollection))
188-
{
189-
throw new ArgumentOutOfRangeException($"Only {nameof(BsonDocument)} and {nameof(TDocumentCollection)} are supported for {nameof(TDocumentLike)} type.");
190-
}
191-
192186
_like = Ensure.IsNotNull(like, nameof(like)).ToArray();
193187
}
194188

195-
private protected override BsonDocument RenderArguments(IBsonSerializer<TDocumentCollection> documentSerializer, IBsonSerializerRegistry serializerRegistry)
189+
private protected override BsonDocument RenderArguments(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
196190
{
197-
var likeArray = typeof(TDocumentLike) == typeof(BsonDocument) ?
198-
new BsonArray(_like.OfType<BsonDocument>()) :
199-
new BsonArray(_like.OfType<TDocumentCollection>().Select(e => e.ToBsonDocument(documentSerializer)));
191+
var likeSerializer = typeof(TLike) switch
192+
{
193+
var t when t == typeof(BsonDocument) => null,
194+
var t when t == typeof(TDocument) => (IBsonSerializer<TLike>)documentSerializer,
195+
_ => serializerRegistry.GetSerializer<TLike>()
196+
};
200197

201-
return new("like", likeArray);
198+
return new("like", new BsonArray(_like.Select(document => document.ToBsonDocument(likeSerializer))));
202199
}
203200
}
204201

src/MongoDB.Driver/Search/SearchDefinitionBuilder.cs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -289,42 +289,24 @@ public SearchDefinition<TDocument> GeoWithin<TCoordinates>(
289289
/// <summary>
290290
/// Creates a search definition that returns documents similar to the input documents.
291291
/// </summary>
292+
/// <typeparam name="TLike">The type of the like documents.</typeparam>
292293
/// <param name="like">
293294
/// One or more documents that Atlas Search uses to extract representative terms for.
294295
/// </param>
295296
/// <returns>A more like this search definition.</returns>
296-
public SearchDefinition<TDocument> MoreLikeThis(IEnumerable<TDocument> like) =>
297-
new MoreLikeThisSearchDefinition<TDocument, TDocument>(like);
297+
public SearchDefinition<TDocument> MoreLikeThis<TLike>(IEnumerable<TLike> like) =>
298+
new MoreLikeThisSearchDefinition<TDocument, TLike>(like);
298299

299300
/// <summary>
300301
/// Creates a search definition that returns documents similar to the input documents.
301302
/// </summary>
303+
/// <typeparam name="TLike">The type of the like documents.</typeparam>
302304
/// <param name="like">
303305
/// One or more documents that Atlas Search uses to extract representative terms for.
304306
/// </param>
305307
/// <returns>A more like this search definition.</returns>
306-
public SearchDefinition<TDocument> MoreLikeThis(IEnumerable<BsonDocument> like) =>
307-
new MoreLikeThisSearchDefinition<TDocument, BsonDocument>(like);
308-
309-
/// <summary>
310-
/// Creates a search definition that returns documents similar to the input documents.
311-
/// </summary>
312-
/// <param name="like">
313-
/// One or more documents that Atlas Search uses to extract representative terms for.
314-
/// </param>
315-
/// <returns>A more like this search definition.</returns>
316-
public SearchDefinition<TDocument> MoreLikeThis(params TDocument[] like) =>
317-
MoreLikeThis((IEnumerable<TDocument>)like);
318-
319-
/// <summary>
320-
/// Creates a search definition that returns documents similar to the input documents.
321-
/// </summary>
322-
/// <param name="like">
323-
/// One or more documents that Atlas Search uses to extract representative terms for.
324-
/// </param>
325-
/// <returns>A more like this search definition.</returns>
326-
public SearchDefinition<TDocument> MoreLikeThis(params BsonDocument[] like) =>
327-
MoreLikeThis((IEnumerable<BsonDocument>)like);
308+
public SearchDefinition<TDocument> MoreLikeThis<TLike>(params TLike[] like) =>
309+
new MoreLikeThisSearchDefinition<TDocument, TLike>(like);
328310

329311
/// <summary>
330312
/// Creates a search definition that supports querying and scoring numeric and date values.

tests/MongoDB.Driver.Tests/Search/SearchDefinitionBuilderTests.cs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,12 @@ public void MoreLikeThis()
374374
new BsonDocument("x", "foo"),
375375
new BsonDocument("x", "bar")),
376376
"{ moreLikeThis: { like: [{ x: 'foo' }, { x: 'bar' }] } }");
377+
378+
AssertRendered(
379+
subject.MoreLikeThis(
380+
new SimplePerson { FirstName = "John", LastName = "Doe" },
381+
new SimplePerson { FirstName = "Jane", LastName = "Doe" }),
382+
"{ moreLikeThis: { like: [{ fn: 'John', ln: 'Doe' }, { fn: 'Jane', ln: 'Doe' }] } }");
377383
}
378384

379385
[Fact]
@@ -383,31 +389,29 @@ public void MoreLikeThis_typed()
383389

384390
AssertRendered(
385391
subject.MoreLikeThis(
386-
new SimplePerson
387-
{
388-
FirstName = "John",
389-
LastName = "Doe"
390-
},
391-
new SimplePerson
392-
{
393-
FirstName = "Jane",
394-
LastName = "Doe"
395-
}),
396-
"{ moreLikeThis: { like: [{ fn: 'John', ln: 'Doe' }, { fn: 'Jane', ln: 'Doe' }] } }");
392+
new SimplestPerson { FirstName = "John" },
393+
new SimplestPerson { FirstName = "Jane" }),
394+
"{ moreLikeThis: { like: [{ fn: 'John' }, { fn: 'Jane' }] } }");
397395

398396
AssertRendered(
399397
subject.MoreLikeThis(
400-
new BsonDocument
401-
{
398+
new SimplePerson { FirstName = "John", LastName = "Doe" },
399+
new SimplePerson { FirstName = "Jane", LastName = "Doe" }),
400+
"{ moreLikeThis: { like: [{ fn: 'John', ln: 'Doe' }, { fn: 'Jane', ln: 'Doe' }] } }");
401+
402+
AssertRendered(
403+
subject.MoreLikeThis(
404+
new BsonDocument
405+
{
402406
{ "fn", "John" },
403407
{ "ln", "Doe" },
404-
},
405-
new BsonDocument
406-
{
408+
},
409+
new BsonDocument
410+
{
407411
{ "fn", "Jane" },
408412
{ "ln", "Doe" },
409-
}),
410-
"{ moreLikeThis: { like: [{ fn: 'John', ln: 'Doe' }, { fn: 'Jane', ln: 'Doe' }] } }");
413+
}),
414+
"{ moreLikeThis: { like: [{ fn: 'John', ln: 'Doe' }, { fn: 'Jane', ln: 'Doe' }] } }");
411415
}
412416

413417
[Fact]
@@ -949,5 +953,11 @@ private class SimplePerson
949953
[BsonElement("ln")]
950954
public string LastName { get; set; }
951955
}
956+
957+
private class SimplestPerson
958+
{
959+
[BsonElement("fn")]
960+
public string FirstName { get; set; }
961+
}
952962
}
953963
}

0 commit comments

Comments
 (0)