Skip to content

Commit c88d2fb

Browse files
committed
CSHARP-1891: Further changes to Distinct for backward compatibility.
1 parent 7edccb7 commit c88d2fb

10 files changed

+156
-60
lines changed

src/MongoDB.Driver/FieldDefinition.cs

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright 2010-2016 MongoDB Inc.
1+
/* Copyright 2010-2017 MongoDB Inc.
22
*
33
* Licensed under the Apache License, Version 2.0 (the "License");
44
* you may not use this file except in compliance with the License.
@@ -70,16 +70,22 @@ public sealed class RenderedFieldDefinition<TField>
7070
{
7171
private readonly string _fieldName;
7272
private readonly IBsonSerializer<TField> _fieldSerializer;
73+
private readonly IBsonSerializer _underlyingSerializer;
74+
private readonly IBsonSerializer<TField> _valueSerializer;
7375

7476
/// <summary>
7577
/// Initializes a new instance of the <see cref="RenderedFieldDefinition{TField}" /> class.
7678
/// </summary>
7779
/// <param name="fieldName">The field name.</param>
7880
/// <param name="fieldSerializer">The field serializer.</param>
79-
public RenderedFieldDefinition(string fieldName, IBsonSerializer<TField> fieldSerializer)
81+
/// <param name="valueSerializer">The value serializer.</param>
82+
/// <param name="underlyingSerializer">The underlying serializer.</param>
83+
public RenderedFieldDefinition(string fieldName, IBsonSerializer<TField> fieldSerializer, IBsonSerializer<TField> valueSerializer, IBsonSerializer underlyingSerializer)
8084
{
8185
_fieldName = Ensure.IsNotNull(fieldName, nameof(fieldName));
82-
_fieldSerializer = Ensure.IsNotNull(fieldSerializer, nameof(fieldSerializer));
86+
_fieldSerializer = fieldSerializer;
87+
_valueSerializer = Ensure.IsNotNull(valueSerializer, nameof(valueSerializer));
88+
_underlyingSerializer = underlyingSerializer;
8389
}
8490

8591
/// <summary>
@@ -97,6 +103,22 @@ public IBsonSerializer<TField> FieldSerializer
97103
{
98104
get { return _fieldSerializer; }
99105
}
106+
107+
/// <summary>
108+
/// Gets the underlying serializer.
109+
/// </summary>
110+
public IBsonSerializer UnderlyingSerializer
111+
{
112+
get { return _underlyingSerializer; }
113+
}
114+
115+
/// <summary>
116+
/// Gets the value serializer.
117+
/// </summary>
118+
public IBsonSerializer<TField> ValueSerializer
119+
{
120+
get { return _valueSerializer; }
121+
}
100122
}
101123

102124
/// <summary>
@@ -273,9 +295,15 @@ public override RenderedFieldDefinition<TField> Render(IBsonSerializer<TDocument
273295
throw new InvalidOperationException(message);
274296
}
275297

276-
var fieldSerializer = (IBsonSerializer<TField>)FieldValueSerializerHelper.GetSerializerForValueType(field.Serializer, typeof(TField));
298+
var underlyingSerializer = field.Serializer;
299+
var fieldSerializer = underlyingSerializer as IBsonSerializer<TField>;
300+
var valueSerializer = (IBsonSerializer<TField>)FieldValueSerializerHelper.GetSerializerForValueType(underlyingSerializer, typeof(TField));
301+
if (valueSerializer == null)
302+
{
303+
valueSerializer = serializerRegistry.GetSerializer<TField>();
304+
}
277305

278-
return new RenderedFieldDefinition<TField>(field.FieldName, fieldSerializer);
306+
return new RenderedFieldDefinition<TField>(field.FieldName, fieldSerializer, valueSerializer, underlyingSerializer);
279307
}
280308
}
281309

@@ -332,20 +360,22 @@ public StringFieldDefinition(string fieldName, IBsonSerializer<TField> fieldSeri
332360
public override RenderedFieldDefinition<TField> Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
333361
{
334362
string resolvedName;
335-
IBsonSerializer resolvedSerializer;
336-
StringFieldDefinitionHelper.Resolve<TDocument>(_fieldName, documentSerializer, out resolvedName, out resolvedSerializer);
363+
IBsonSerializer underlyingSerializer;
364+
StringFieldDefinitionHelper.Resolve<TDocument>(_fieldName, documentSerializer, out resolvedName, out underlyingSerializer);
365+
366+
var fieldSerializer = underlyingSerializer as IBsonSerializer<TField>;
337367

338-
var fieldSerializer = _fieldSerializer;
339-
if (fieldSerializer == null && resolvedSerializer != null)
368+
var valueSerializer = _fieldSerializer;
369+
if (valueSerializer == null && underlyingSerializer != null)
340370
{
341-
fieldSerializer = (IBsonSerializer<TField>)FieldValueSerializerHelper.GetSerializerForValueType(resolvedSerializer, typeof(TField));
371+
valueSerializer = (IBsonSerializer<TField>)FieldValueSerializerHelper.GetSerializerForValueType(underlyingSerializer, typeof(TField));
342372
}
343-
if (fieldSerializer == null)
373+
if (valueSerializer == null)
344374
{
345-
fieldSerializer = serializerRegistry.GetSerializer<TField>();
375+
valueSerializer = serializerRegistry.GetSerializer<TField>();
346376
}
347377

348-
return new RenderedFieldDefinition<TField>(resolvedName, fieldSerializer);
378+
return new RenderedFieldDefinition<TField>(resolvedName, fieldSerializer, valueSerializer, underlyingSerializer);
349379
}
350380
}
351381

@@ -355,6 +385,7 @@ public static void Resolve<TDocument>(string fieldName, IBsonSerializer<TDocumen
355385
{
356386
resolvedFieldName = fieldName;
357387
resolvedFieldSerializer = null;
388+
358389
var documentSerializer = serializer as IBsonDocumentSerializer;
359390
if (documentSerializer == null)
360391
{
@@ -444,8 +475,7 @@ public UntypedFieldDefinitionAdapter(FieldDefinition<TDocument, TField> adaptee)
444475
public override RenderedFieldDefinition Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
445476
{
446477
var rendered = _adaptee.Render(documentSerializer, serializerRegistry);
447-
return new RenderedFieldDefinition(rendered.FieldName, rendered.FieldSerializer);
478+
return new RenderedFieldDefinition(rendered.FieldName, rendered.UnderlyingSerializer);
448479
}
449480
}
450-
451481
}

src/MongoDB.Driver/FieldValueSerializerHelper.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ namespace MongoDB.Driver
2626
internal static class FieldValueSerializerHelper
2727
{
2828
public static IBsonSerializer GetSerializerForValueType(IBsonSerializer fieldSerializer, Type valueType)
29+
{
30+
return GetSerializerForValueType(fieldSerializer, valueType, 0);
31+
}
32+
33+
private static IBsonSerializer GetSerializerForValueType(IBsonSerializer fieldSerializer, Type valueType, int recursionLevel)
2934
{
3035
var fieldType = fieldSerializer.ValueType;
3136

@@ -102,8 +107,11 @@ public static IBsonSerializer GetSerializerForValueType(IBsonSerializer fieldSer
102107
BsonSerializationInfo itemSerializationInfo;
103108
if (arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
104109
{
105-
var itemSerializer = itemSerializationInfo.Serializer;
106-
return GetSerializerForValueType(itemSerializer, valueType);
110+
if (recursionLevel == 0)
111+
{
112+
var itemSerializer = itemSerializationInfo.Serializer;
113+
return GetSerializerForValueType(itemSerializer, valueType, recursionLevel + 1);
114+
}
107115
}
108116
}
109117

@@ -162,7 +170,16 @@ public EnumConvertingSerializer(IBsonSerializer<TTo> serializer)
162170

163171
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TFrom value)
164172
{
165-
_serializer.Serialize(context, args, (TTo)Enum.ToObject(typeof(TTo), (object)value));
173+
TTo convertedValue;
174+
if (typeof(TFrom) == typeof(string))
175+
{
176+
convertedValue = (TTo)Enum.Parse(typeof(TTo), (string)(object)value);
177+
}
178+
else
179+
{
180+
convertedValue = (TTo)Enum.ToObject(typeof(TTo), (object)value);
181+
}
182+
_serializer.Serialize(context, args, convertedValue);
166183
}
167184
}
168185

src/MongoDB.Driver/FilterDefinitionBuilder.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,7 +1586,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
15861586
var renderedField = _field.Render(documentSerializer, serializerRegistry);
15871587

15881588
IBsonSerializer itemSerializer = null;
1589-
if (itemSerializer == null && renderedField.FieldSerializer != null)
1589+
if (renderedField.FieldSerializer != null)
15901590
{
15911591
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
15921592
BsonSerializationInfo itemSerializationInfo;
@@ -2029,7 +2029,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
20292029
bsonWriter.WriteName(renderedField.FieldName);
20302030
bsonWriter.WriteStartDocument();
20312031
bsonWriter.WriteName(_operatorName);
2032-
renderedField.FieldSerializer.Serialize(context, _value);
2032+
renderedField.ValueSerializer.Serialize(context, _value);
20332033
bsonWriter.WriteEndDocument();
20342034
bsonWriter.WriteEndDocument();
20352035
}
@@ -2115,7 +2115,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
21152115
var context = BsonSerializationContext.CreateRoot(bsonWriter);
21162116
bsonWriter.WriteStartDocument();
21172117
bsonWriter.WriteName(renderedField.FieldName);
2118-
renderedField.FieldSerializer.Serialize(context, _value);
2118+
renderedField.ValueSerializer.Serialize(context, _value);
21192119
bsonWriter.WriteEndDocument();
21202120
}
21212121

@@ -2151,7 +2151,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
21512151
bsonWriter.WriteStartArray();
21522152
foreach (var value in _values)
21532153
{
2154-
renderedField.FieldSerializer.Serialize(context, value);
2154+
renderedField.ValueSerializer.Serialize(context, value);
21552155
}
21562156
bsonWriter.WriteEndArray();
21572157
bsonWriter.WriteEndDocument();
@@ -2180,7 +2180,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
21802180
var renderedField = _field.Render(documentSerializer, serializerRegistry);
21812181

21822182
IBsonSerializer itemSerializer = null;
2183-
if (itemSerializer == null && renderedField.FieldSerializer != null)
2183+
if (renderedField.FieldSerializer != null)
21842184
{
21852185
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
21862186
BsonSerializationInfo itemSerializationInfo;
@@ -2229,7 +2229,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
22292229
var renderedField = _field.Render(documentSerializer, serializerRegistry);
22302230

22312231
IBsonSerializer<TItem> itemSerializer = null;
2232-
if (itemSerializer == null && renderedField.FieldSerializer != null)
2232+
if (renderedField.FieldSerializer != null)
22332233
{
22342234
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
22352235
BsonSerializationInfo itemSerializationInfo;
@@ -2296,7 +2296,7 @@ public UInt32GreaterThanFilterDefinition(string operatorName, FieldDefinition<TD
22962296
public override BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
22972297
{
22982298
var renderedField = _field.Render(documentSerializer, serializerRegistry);
2299-
var serializedValue = renderedField.FieldSerializer.ToBsonValue(_value);
2299+
var serializedValue = renderedField.ValueSerializer.ToBsonValue(_value);
23002300

23012301
if (serializedValue.BsonType != BsonType.Int32)
23022302
{
@@ -2348,7 +2348,7 @@ public UInt32LessThanFilterDefinition(string operatorName, FieldDefinition<TDocu
23482348
public override BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
23492349
{
23502350
var renderedField = _field.Render(documentSerializer, serializerRegistry);
2351-
var serializedValue = renderedField.FieldSerializer.ToBsonValue(_value);
2351+
var serializedValue = renderedField.ValueSerializer.ToBsonValue(_value);
23522352

23532353
if (serializedValue.BsonType != BsonType.Int32)
23542354
{
@@ -2400,7 +2400,7 @@ public UInt64GreaterThanFilterDefinition(string operatorName, FieldDefinition<TD
24002400
public override BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
24012401
{
24022402
var renderedField = _field.Render(documentSerializer, serializerRegistry);
2403-
var serializedValue = renderedField.FieldSerializer.ToBsonValue(_value);
2403+
var serializedValue = renderedField.ValueSerializer.ToBsonValue(_value);
24042404

24052405
if (serializedValue.BsonType != BsonType.Int64)
24062406
{
@@ -2452,7 +2452,7 @@ public UInt64LessThanFilterDefinition(string operatorName, FieldDefinition<TDocu
24522452
public override BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
24532453
{
24542454
var renderedField = _field.Render(documentSerializer, serializerRegistry);
2455-
var serializedValue = renderedField.FieldSerializer.ToBsonValue(_value);
2455+
var serializedValue = renderedField.ValueSerializer.ToBsonValue(_value);
24562456

24572457
if (serializedValue.BsonType != BsonType.Int64)
24582458
{

src/MongoDB.Driver/MongoCollectionImpl.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright 2010-2016 MongoDB Inc.
1+
/* Copyright 2010-2017 MongoDB Inc.
22
*
33
* Licensed under the Apache License, Version 2.0 (the "License");
44
* you may not use this file except in compliance with the License.
@@ -563,9 +563,31 @@ private DistinctOperation<TField> CreateDistinctOperation<TField>(FieldDefinitio
563563
{
564564
var renderedField = field.Render(_documentSerializer, _settings.SerializerRegistry);
565565

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+
}
587+
566588
return new DistinctOperation<TField>(
567589
_collectionNamespace,
568-
renderedField.FieldSerializer,
590+
valueSerializer,
569591
renderedField.FieldName,
570592
_messageEncoderSettings)
571593
{

src/MongoDB.Driver/Support/ReflectionExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ public static bool IsConvertibleToEnum(this Type type)
8585
type == typeof(ushort) ||
8686
type == typeof(uint) ||
8787
type == typeof(ulong) ||
88-
type == typeof(Enum);
88+
type == typeof(Enum) ||
89+
type == typeof(string);
8990
}
9091

9192
public static Type GetNullableUnderlyingType(this Type type)

src/MongoDB.Driver/UpdateDefinitionBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright 2010-2015 MongoDB Inc.
1+
/* Copyright 2010-2017 MongoDB Inc.
22
*
33
* Licensed under the Apache License, Version 2.0 (the "License");
44
* you may not use this file except in compliance with the License.
@@ -1448,7 +1448,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
14481448
bsonWriter.WriteName(renderedField.FieldName);
14491449
bsonWriter.WriteStartDocument();
14501450
bsonWriter.WriteName(_operatorName);
1451-
renderedField.FieldSerializer.Serialize(context, _value);
1451+
renderedField.ValueSerializer.Serialize(context, _value);
14521452
bsonWriter.WriteEndDocument();
14531453
bsonWriter.WriteEndDocument();
14541454
bsonWriter.WriteEndDocument();
@@ -1503,7 +1503,7 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
15031503
bsonWriter.WriteName(_operatorName);
15041504
bsonWriter.WriteStartDocument();
15051505
bsonWriter.WriteName(renderedField.FieldName);
1506-
renderedField.FieldSerializer.Serialize(context, _value);
1506+
renderedField.ValueSerializer.Serialize(context, _value);
15071507
bsonWriter.WriteEndDocument();
15081508
bsonWriter.WriteEndDocument();
15091509
}

src/MongoDB.Shared/GlobalAssemblyInfo.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
[assembly: AssemblyCompany("MongoDB Inc.")]
1919
[assembly: AssemblyCopyright("Copyright © 2010-2014 MongoDB Inc.")]
20-
[assembly: AssemblyVersion("2.4.2.11")]
21-
[assembly: AssemblyInformationalVersion("2.4.2-local-0011")]
22-
[assembly: AssemblyFileVersion("2.4.2.11")]
23-
[assembly: AssemblyMetadata("githash", "cf7accd4bd504d33adb74fc49a4ef9cfec499836")]
24-
[assembly: AssemblyConfiguration("Release")]
20+
[assembly: AssemblyVersion("0.0.*")]
21+
[assembly: AssemblyInformationalVersion("unofficial")]
22+
[assembly: AssemblyFileVersion("0.0.0.0")]
23+
[assembly: AssemblyMetadata("githash", "none")]
24+
[assembly: AssemblyConfiguration("Debug")]

0 commit comments

Comments
 (0)