Skip to content

Commit acb03b9

Browse files
committed
Small fixes
1 parent 823b2ad commit acb03b9

File tree

4 files changed

+69
-18
lines changed

4 files changed

+69
-18
lines changed

src/MongoDB.Bson/BsonExtensionMethods.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace MongoDB.Bson
2626
public static class BsonExtensionMethods
2727
{
2828
//DOMAIN-API We should remove this and use the version with the domain.
29-
//QUESTION: Do we want to do something now about this...? It's used also internally, but in a huge number of places.
29+
//QUESTION: Do we want to do something now about this...? It's used also internally, but it seems in most cases it's used for "default serialization", so it should be ok.
3030
/// <summary>
3131
/// Serializes an object to a BSON byte array.
3232
/// </summary>

src/MongoDB.Driver/MongoDatabase.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,12 +613,11 @@ private IWriteOperation<BsonDocument> CreateCreateCollectionOperation<TDocument>
613613
var documentSerializer = options.DocumentSerializer ?? serializerRegistry.GetSerializer<TDocument>();
614614

615615
//DOMAIN-API This will need to go away
616+
//This is only happening in a couple of places, it's not worth to find better solutions right now.
616617
RenderArgs<TDocument> renderArgs = options.SerializationDomain is null ?
617618
new(documentSerializer, serializerRegistry, translationOptions: translationOptions) :
618619
new(documentSerializer, options.SerializationDomain, translationOptions: translationOptions);
619620

620-
//var serializationDomain = Settings.SerializationDomain.WithSerializerRegistry(serializerRegistry); //FP This could be the way to go
621-
622621
//DOMAIN-API This will need to go away
623622
var clusteredIndex = options.SerializationDomain is null?
624623
options.ClusteredIndex?.Render(documentSerializer, serializerRegistry, translationOptions):

src/MongoDB.Driver/PipelineStageDefinitionBuilder.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,7 @@ public static PipelineStageDefinition<TInput, TOutput> Facet<TInput, TOutput>(
544544

545545
const string operatorName = "$facet";
546546
var materializedFacets = facets.ToArray();
547+
547548
var stage = new DelegatedPipelineStageDefinition<TInput, TOutput>(
548549
operatorName,
549550
args =>
@@ -556,7 +557,25 @@ public static PipelineStageDefinition<TInput, TOutput> Facet<TInput, TOutput>(
556557
facetsDocument.Add(facet.Name, renderedPipeline);
557558
}
558559
var document = new BsonDocument("$facet", facetsDocument);
559-
var outputSerializer = options?.OutputSerializer ?? args.SerializerRegistry.GetSerializer<TOutput>();
560+
561+
IBsonSerializer<TOutput> outputSerializer;
562+
563+
if (options?.OutputSerializer is not null)
564+
{
565+
outputSerializer = options.OutputSerializer;
566+
}
567+
else if (typeof(TOutput) == typeof(AggregateFacetResults))
568+
{
569+
outputSerializer = (IBsonSerializer<TOutput>)new AggregateFacetResultsSerializer(
570+
materializedFacets.Select(f => f.Name),
571+
materializedFacets.Select(f => f.OutputSerializer ?? args.SerializerRegistry.GetSerializer(f.OutputType))); //QUESTION What do we do? Do we delay the setting of the serializer..?
572+
}
573+
else
574+
{
575+
outputSerializer = args.SerializerRegistry.GetSerializer<TOutput>();
576+
}
577+
578+
//var outputSerializer = options?.OutputSerializer ?? args.SerializerRegistry.GetSerializer<TOutput>();
560579
return new RenderedPipelineStageDefinition<TOutput>(operatorName, document, outputSerializer);
561580
});
562581

@@ -572,12 +591,7 @@ public static PipelineStageDefinition<TInput, TOutput> Facet<TInput, TOutput>(
572591
public static PipelineStageDefinition<TInput, AggregateFacetResults> Facet<TInput>(
573592
IEnumerable<AggregateFacet<TInput>> facets)
574593
{
575-
Ensure.IsNotNull(facets, nameof(facets));
576-
var outputSerializer = new AggregateFacetResultsSerializer(
577-
facets.Select(f => f.Name),
578-
facets.Select(f => f.OutputSerializer ?? BsonSerializer.SerializerRegistry.GetSerializer(f.OutputType))); //QUESTION What do we do? Do we delay the setting of the serializer..?
579-
var options = new AggregateFacetOptions<AggregateFacetResults> { OutputSerializer = outputSerializer };
580-
return Facet(facets, options);
594+
return Facet<TInput, AggregateFacetResults>(facets, options: null);
581595
}
582596

583597
/// <summary>

tests/MongoDB.Driver.Tests/MultipleRegistriesTests.cs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,14 @@ public void TestDiscriminators()
173173
{
174174
cm.AutoMap();
175175
cm.SetDiscriminator("dp1");
176+
cm.MapMember( m => m.ExtraField1).SetSerializer(new CustomStringSerializer());
176177
});
177178

178179
customDomain.BsonClassMap.RegisterClassMap<DerivedPerson2>(cm =>
179180
{
180181
cm.AutoMap();
181182
cm.SetDiscriminator("dp2");
183+
cm.MapMember( m => m.ExtraField2).SetSerializer(new CustomStringSerializer());
182184
});
183185

184186
var client = CreateClientWithDomain(customDomain);
@@ -192,31 +194,67 @@ public void TestDiscriminators()
192194
var retrievedDerivedPerson1 = collection.Aggregate().OfType<DerivedPerson1>().Single();
193195
var retrievedDerivedPerson2 = collection.Aggregate().OfType<DerivedPerson2>().Single();
194196

195-
Assert.Equal(bp1.Id, retrievedDerivedPerson1.Id);
196-
Assert.Equal(bp2.Id, retrievedDerivedPerson2.Id);
197+
AssertDerivedPerson1(bp1, retrievedDerivedPerson1);
198+
AssertDerivedPerson2(bp2, retrievedDerivedPerson2);
197199

198200
//AppendStage with OfType
199201
retrievedDerivedPerson1 = collection.AsQueryable().AppendStage(PipelineStageDefinitionBuilder.OfType<BasePerson, DerivedPerson1>())
200202
.OfType<DerivedPerson1>().Single();
201203
retrievedDerivedPerson2 = collection.AsQueryable().AppendStage(PipelineStageDefinitionBuilder.OfType<BasePerson, DerivedPerson2>())
202204
.OfType<DerivedPerson2>().Single();
203205

204-
Assert.Equal(bp1.Id, retrievedDerivedPerson1.Id);
205-
Assert.Equal(bp2.Id, retrievedDerivedPerson2.Id);
206+
AssertDerivedPerson1(bp1, retrievedDerivedPerson1);
207+
AssertDerivedPerson2(bp2, retrievedDerivedPerson2);
206208

207209
//LINQ with OfType
208210
retrievedDerivedPerson1 = collection.AsQueryable().OfType<DerivedPerson1>().Single();
209211
retrievedDerivedPerson2 = collection.AsQueryable().OfType<DerivedPerson2>().Single();
210212

211-
Assert.Equal(bp1.Id, retrievedDerivedPerson1.Id);
212-
Assert.Equal(bp2.Id, retrievedDerivedPerson2.Id);
213+
AssertDerivedPerson1(bp1, retrievedDerivedPerson1);
214+
AssertDerivedPerson2(bp2, retrievedDerivedPerson2);
215+
216+
//Facet with OfType
217+
218+
var pipeline1 = PipelineDefinition<BasePerson, DerivedPerson1>.Create( new [] {
219+
PipelineStageDefinitionBuilder.OfType<BasePerson, DerivedPerson1>() });
220+
var facet1 = AggregateFacet.Create("facet1", pipeline1);
221+
222+
var pipeline2 = PipelineDefinition<BasePerson, DerivedPerson2>.Create( new [] {
223+
PipelineStageDefinitionBuilder.OfType<BasePerson, DerivedPerson2>() });
224+
var facet2 = AggregateFacet.Create("facet2", pipeline2);
225+
226+
var result = collection.Aggregate().Facet(facet1, facet2).Single().Facets;
227+
retrievedDerivedPerson1 = result[0].Output<DerivedPerson1>().Single();
228+
retrievedDerivedPerson2 = result[1].Output<DerivedPerson2>().Single();
229+
230+
AssertDerivedPerson1(bp1, retrievedDerivedPerson1);
231+
AssertDerivedPerson2(bp2, retrievedDerivedPerson2);
213232

214233
//Find with OfType
215234
var retrievedBasePerson1 = collection.FindSync(Builders<BasePerson>.Filter.OfType<DerivedPerson1>()).Single();
216235
var retrievedBasePerson2 = collection.FindSync(Builders<BasePerson>.Filter.OfType<DerivedPerson2>()).Single();
217236

218-
Assert.Equal(bp1.Id, retrievedBasePerson1.Id);
219-
Assert.Equal(bp2.Id, retrievedBasePerson2.Id);
237+
AssertBasePerson(bp1, retrievedBasePerson1);
238+
AssertBasePerson(bp2, retrievedBasePerson2);
239+
240+
void AssertDerivedPerson1(DerivedPerson1 expected, DerivedPerson1 retrieved)
241+
{
242+
AssertBasePerson(expected, retrieved);
243+
Assert.Equal(expected.ExtraField1, retrieved.ExtraField1);
244+
}
245+
246+
void AssertDerivedPerson2(DerivedPerson2 expected, DerivedPerson2 retrieved)
247+
{
248+
AssertBasePerson(expected, retrieved);
249+
Assert.Equal(expected.ExtraField2, retrieved.ExtraField2);
250+
}
251+
252+
void AssertBasePerson(BasePerson expected, BasePerson retrieved)
253+
{
254+
Assert.Equal(expected.Id, retrieved.Id);
255+
Assert.Equal(expected.Name, retrieved.Name);
256+
Assert.Equal(expected.Age, retrieved.Age);
257+
}
220258
}
221259

222260
private static IMongoCollection<T> GetTypedCollection<T>(IMongoClient client) =>

0 commit comments

Comments
 (0)