Skip to content

Commit 7edccb7

Browse files
committed
CSHARP-1890: Be more flexible in what types are valid for filter builder value arguments.
1 parent ceac8f7 commit 7edccb7

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

src/MongoDB.Driver/FilterDefinitionBuilder.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2179,8 +2179,8 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
21792179
{
21802180
var renderedField = _field.Render(documentSerializer, serializerRegistry);
21812181

2182-
IBsonSerializer itemSerializer;
2183-
if (renderedField.FieldSerializer != null)
2182+
IBsonSerializer itemSerializer = null;
2183+
if (itemSerializer == null && renderedField.FieldSerializer != null)
21842184
{
21852185
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
21862186
BsonSerializationInfo itemSerializationInfo;
@@ -2189,9 +2189,9 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
21892189
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
21902190
throw new InvalidOperationException(message);
21912191
}
2192-
itemSerializer = itemSerializationInfo.Serializer;
2192+
itemSerializer = FieldValueSerializerHelper.GetSerializerForValueType(itemSerializationInfo.Serializer, typeof(TItem));
21932193
}
2194-
else
2194+
if (itemSerializer == null)
21952195
{
21962196
itemSerializer = serializerRegistry.GetSerializer<TItem>();
21972197
}
@@ -2228,8 +2228,8 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
22282228
{
22292229
var renderedField = _field.Render(documentSerializer, serializerRegistry);
22302230

2231-
IBsonSerializer<TItem> itemSerializer;
2232-
if (renderedField.FieldSerializer != null)
2231+
IBsonSerializer<TItem> itemSerializer = null;
2232+
if (itemSerializer == null && renderedField.FieldSerializer != null)
22332233
{
22342234
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
22352235
BsonSerializationInfo itemSerializationInfo;
@@ -2238,9 +2238,9 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
22382238
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
22392239
throw new InvalidOperationException(message);
22402240
}
2241-
itemSerializer = (IBsonSerializer<TItem>)itemSerializationInfo.Serializer;
2241+
itemSerializer = (IBsonSerializer<TItem>)FieldValueSerializerHelper.GetSerializerForValueType(itemSerializationInfo.Serializer, typeof(TItem));
22422242
}
2243-
else
2243+
if (itemSerializer == null)
22442244
{
22452245
itemSerializer = serializerRegistry.GetSerializer<TItem>();
22462246
}

tests/MongoDB.Driver.Tests/FilterDefinitionBuilderTests.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,33 @@ public void Eq_Typed()
271271
Assert(subject.AnyEq("FavoriteColors", "yellow"), "{colors: 'yellow'}");
272272
}
273273

274+
[Fact]
275+
public void Eq_with_enums()
276+
{
277+
var subject = CreateSubject<BsonDocument>();
278+
279+
Assert(subject.Eq("E", EnumForClassWithEnums.A), "{ E : 0 }");
280+
Assert(subject.AnyEq("A", EnumForClassWithEnums.A), "{ A : 0 }");
281+
}
282+
283+
[Fact]
284+
public void Eq_with_enums_typed()
285+
{
286+
var subject = CreateSubject<ClassWithEnums>();
287+
288+
Assert(subject.Eq("E", 0), "{ E : \"A\" }");
289+
Assert(subject.Eq("A", 0), "{ A : \"A\" }");
290+
Assert(subject.AnyEq("A", 0), "{ A : \"A\" }");
291+
292+
Assert(subject.Eq("E", "X"), "{ E : \"X\" }");
293+
Assert(subject.Eq("A", "X"), "{ A : \"X\" }");
294+
Assert(subject.AnyEq("A", "X"), "{ A : \"X\" }");
295+
296+
Assert(subject.Eq("E", EnumForClassWithEnums.A), "{ E : \"A\" }");
297+
Assert(subject.Eq("A", EnumForClassWithEnums.A), "{ A : \"A\" }");
298+
Assert(subject.AnyEq("A", EnumForClassWithEnums.A), "{ A : \"A\" }");
299+
}
300+
274301
[Fact]
275302
public void Exists()
276303
{
@@ -501,17 +528,17 @@ public void In_with_enum()
501528
}
502529

503530
[Fact]
504-
public void In_typed_with_enum()
531+
public void In_with_enum_typed()
505532
{
506533
var subject = CreateSubject<ClassWithEnums>();
507534

508535
Assert(subject.In("E", new[] { 0, 1 }), "{ E : { $in : [ \"A\", \"B\" ] } }");
509536
Assert(subject.In("A", new[] { 0, 1 }), "{ A : { $in : [ \"A\", \"B\" ] } }");
510537
Assert(subject.AnyIn("A", new[] { 0, 1 }), "{ A : { $in : [ \"A\", \"B\" ] } }");
511538

512-
Assert(subject.In("E", new[] { "A", "B" }), "{ E : { $in : [ \"A\", \"B\" ] } }");
513-
Assert(subject.In("A", new[] { "A", "B" }), "{ A : { $in : [ \"A\", \"B\" ] } }");
514-
Assert(subject.AnyIn("A", new[] { "A", "B" }), "{ A : { $in : [ \"A\", \"B\" ] } }");
539+
Assert(subject.In("E", new[] { "X", "Y" }), "{ E : { $in : [ \"X\", \"Y\" ] } }");
540+
Assert(subject.In("A", new[] { "X", "Y" }), "{ A : { $in : [ \"X\", \"Y\" ] } }");
541+
Assert(subject.AnyIn("A", new[] { "X", "Y" }), "{ A : { $in : [ \"X\", \"Y\" ] } }");
515542

516543
Assert(subject.In("E", new[] { EnumForClassWithEnums.A, EnumForClassWithEnums.B }), "{ E : { $in : [ \"A\", \"B\" ] } }");
517544
Assert(subject.In("A", new[] { EnumForClassWithEnums.A, EnumForClassWithEnums.B }), "{ A : { $in : [ \"A\", \"B\" ] } }");

0 commit comments

Comments
 (0)