Skip to content

Commit 2e5658e

Browse files
committed
CSHARP-1891: Code review changes.
1 parent c88d2fb commit 2e5658e

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed

src/MongoDB.Driver/FieldDefinition.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ public sealed class RenderedFieldDefinition<TField>
7373
private readonly IBsonSerializer _underlyingSerializer;
7474
private readonly IBsonSerializer<TField> _valueSerializer;
7575

76+
/// <summary>
77+
/// Initializes a new instance of the <see cref="RenderedFieldDefinition{TField}" /> class.
78+
/// </summary>
79+
/// <param name="fieldName">The field name.</param>
80+
/// <param name="fieldSerializer">The field serializer.</param>
81+
public RenderedFieldDefinition(string fieldName, IBsonSerializer<TField> fieldSerializer)
82+
: this(fieldName, fieldSerializer, fieldSerializer, fieldSerializer)
83+
{
84+
}
85+
7686
/// <summary>
7787
/// Initializes a new instance of the <see cref="RenderedFieldDefinition{TField}" /> class.
7888
/// </summary>

src/MongoDB.Driver/FieldValueSerializerHelper.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public static IBsonSerializer GetSerializerForValueType(IBsonSerializer fieldSer
3232

3333
private static IBsonSerializer GetSerializerForValueType(IBsonSerializer fieldSerializer, Type valueType, int recursionLevel)
3434
{
35+
if (recursionLevel > 1)
36+
{
37+
throw new ArgumentException("Unexpectedly high recursion level.", nameof(recursionLevel));
38+
}
39+
3540
var fieldType = fieldSerializer.ValueType;
3641

3742
// these will normally be equal unless we've removed some Convert(s) that the compiler put in

src/MongoDB.Driver/MongoCollectionImpl.cs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -562,28 +562,7 @@ private CountOperation CreateCountOperation(FilterDefinition<TDocument> filter,
562562
private DistinctOperation<TField> CreateDistinctOperation<TField>(FieldDefinition<TDocument, TField> field, FilterDefinition<TDocument> filter, DistinctOptions options)
563563
{
564564
var renderedField = field.Render(_documentSerializer, _settings.SerializerRegistry);
565-
566-
IBsonSerializer<TField> valueSerializer = null;
567-
if (renderedField.UnderlyingSerializer != null)
568-
{
569-
IBsonArraySerializer arraySerializer;
570-
BsonSerializationInfo itemSerializationInfo;
571-
if (renderedField.UnderlyingSerializer.ValueType == typeof(TField))
572-
{
573-
valueSerializer = (IBsonSerializer<TField>)renderedField.UnderlyingSerializer;
574-
}
575-
else if (
576-
(arraySerializer = renderedField.UnderlyingSerializer as IBsonArraySerializer) != null &&
577-
arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo) &&
578-
itemSerializationInfo.Serializer.ValueType == typeof(TField))
579-
{
580-
valueSerializer = (IBsonSerializer<TField>)itemSerializationInfo.Serializer;
581-
}
582-
}
583-
if (valueSerializer == null)
584-
{
585-
valueSerializer = _settings.SerializerRegistry.GetSerializer<TField>();
586-
}
565+
var valueSerializer = GetValueSerializerForDistinct(renderedField, _settings.SerializerRegistry);
587566

588567
return new DistinctOperation<TField>(
589568
_collectionNamespace,
@@ -759,6 +738,32 @@ private FindOperation<TResult> CreateMapReduceOutputToCollectionFindOperation<TR
759738
};
760739
}
761740

741+
private IBsonSerializer<TField> GetValueSerializerForDistinct<TField>(RenderedFieldDefinition<TField> renderedField, IBsonSerializerRegistry serializerRegistry)
742+
{
743+
if (renderedField.UnderlyingSerializer != null)
744+
{
745+
if (renderedField.UnderlyingSerializer.ValueType == typeof(TField))
746+
{
747+
return (IBsonSerializer<TField>)renderedField.UnderlyingSerializer;
748+
}
749+
750+
var arraySerializer = renderedField.UnderlyingSerializer as IBsonArraySerializer;
751+
if (arraySerializer != null)
752+
{
753+
BsonSerializationInfo itemSerializationInfo;
754+
if (arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
755+
{
756+
if (itemSerializationInfo.Serializer.ValueType == typeof(TField))
757+
{
758+
return (IBsonSerializer<TField>)itemSerializationInfo.Serializer;
759+
}
760+
}
761+
}
762+
}
763+
764+
return serializerRegistry.GetSerializer<TField>();
765+
}
766+
762767
private TResult ExecuteReadOperation<TResult>(IReadOperation<TResult> operation, CancellationToken cancellationToken)
763768
{
764769
return ExecuteReadOperation(operation, _settings.ReadPreference, cancellationToken);

0 commit comments

Comments
 (0)