Skip to content

Commit 0ba1861

Browse files
committed
Various fixes about RenderArgs plus new tests
1 parent a59ad0f commit 0ba1861

File tree

8 files changed

+121
-29
lines changed

8 files changed

+121
-29
lines changed

src/MongoDB.Bson/Serialization/BsonSerializationDomain.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ internal class BsonSerializationDomain : IBsonSerializationDomain, IDisposable
3535
private bool _useZeroIdChecker;
3636

3737
// constructor
38-
public BsonSerializationDomain(string name = null) //TODO name is used for testing
38+
public BsonSerializationDomain(string name = null)
3939
{
4040
CreateSerializerRegistry();
4141
CreateSubDomains();
4242
RegisterIdGenerators();
43-
Name = name ?? "CUSTOM"; //TODO remove after testing is done
43+
Name = name ?? "CUSTOM";
4444
}
4545

46-
public string Name { get; private set; }
46+
public string Name { get; }
4747

4848
// public properties
4949
/// <summary>

src/MongoDB.Bson/Serialization/IBsonSerializationDomain.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace MongoDB.Bson.Serialization
1111
/// </summary>
1212
internal interface IBsonSerializationDomain
1313
{
14+
string Name { get; } //FP This is used for debugging purposes, but we could decide to make it public if needed.
15+
1416
/// <summary>
1517
/// Returns whether the given type has any discriminators registered for any of its subclasses.
1618
/// </summary>

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToPipelineTranslators/AppendStageMethodToPipelineTranslator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static TranslatedPipeline Translate(TranslationContext context, MethodCal
3939

4040
var sourceSerializer = pipeline.OutputSerializer;
4141
var stageExpression = arguments[1];
42-
var renderedStage = TranslateStage(expression, stageExpression, sourceSerializer, context.SerializationDomain.SerializerRegistry, context.TranslationOptions);
42+
var renderedStage = TranslateStage(expression, stageExpression, sourceSerializer, context.SerializationDomain, context.TranslationOptions);
4343
var stage = AstStage.Universal(renderedStage.Document);
4444

4545
var resultSerializerExpression = arguments[2];
@@ -57,11 +57,11 @@ private static IRenderedPipelineStageDefinition TranslateStage(
5757
Expression expression,
5858
Expression stageExpression,
5959
IBsonSerializer inputSerializer,
60-
IBsonSerializerRegistry serializerRegistry,
60+
IBsonSerializationDomain serializationDomain,
6161
ExpressionTranslationOptions translationOptions)
6262
{
63-
var stageDefinition = stageExpression.GetConstantValue<IPipelineStageDefinition>(stageExpression);
64-
return stageDefinition.Render(inputSerializer, serializerRegistry, translationOptions);
63+
var stageDefinition = stageExpression.GetConstantValue<IPipelineStageStageDefinitionInternal>(stageExpression);
64+
return stageDefinition.Render(inputSerializer, serializationDomain, translationOptions);
6565
}
6666
}
6767
}

src/MongoDB.Driver/MongoClientSettings.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -474,11 +474,6 @@ public ReadPreference ReadPreference
474474
}
475475
}
476476

477-
/// <summary>
478-
/// //TODO
479-
/// </summary>
480-
/// <exception cref="InvalidOperationException"></exception>
481-
/// <exception cref="ArgumentNullException"></exception>
482477
IBsonSerializationDomain IInheritableMongoClientSettings.SerializationDomain
483478
{
484479
get => _serializationDomain;

src/MongoDB.Driver/PipelineDefinition.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
using MongoDB.Bson.Serialization.Serializers;
2222
using MongoDB.Driver.Core.Misc;
2323
using MongoDB.Driver.Linq;
24+
using MongoDB.Driver.Support;
2425

2526
namespace MongoDB.Driver
2627
{
@@ -329,7 +330,7 @@ public override RenderedPipelineDefinition<TOutput> Render(RenderArgs<TInput> ar
329330
IBsonSerializer currentSerializer = args.DocumentSerializer;
330331
foreach (var stage in _stages)
331332
{
332-
var renderedStage = stage.Render(currentSerializer, args.SerializerRegistry, args.TranslationOptions);
333+
var renderedStage = stage.RenderInternal(currentSerializer, args.SerializationDomain, args.SerializerRegistry, args.TranslationOptions);
333334
currentSerializer = renderedStage.OutputSerializer;
334335
foreach (var document in renderedStage.Documents)
335336
{

src/MongoDB.Driver/PipelineStageDefinition.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
using System;
1717
using System.Collections.Generic;
1818
using System.Linq;
19-
using System.Transactions;
2019
using MongoDB.Bson;
2120
using MongoDB.Bson.Serialization;
2221
using MongoDB.Driver.Core.Misc;
@@ -168,12 +167,17 @@ public interface IPipelineStageDefinition
168167
string ToString(IBsonSerializer inputSerializer, IBsonSerializerRegistry serializerRegistry);
169168
}
170169

170+
internal interface IPipelineStageStageDefinitionInternal : IPipelineStageDefinition
171+
{
172+
IRenderedPipelineStageDefinition Render(IBsonSerializer inputSerializer, IBsonSerializationDomain serializationDomain, ExpressionTranslationOptions translationOptions);
173+
}
174+
171175
/// <summary>
172176
/// Base class for pipeline stages.
173177
/// </summary>
174178
/// <typeparam name="TInput">The type of the input.</typeparam>
175179
/// <typeparam name="TOutput">The type of the output.</typeparam>
176-
public abstract class PipelineStageDefinition<TInput, TOutput> : IPipelineStageDefinition
180+
public abstract class PipelineStageDefinition<TInput, TOutput> : IPipelineStageStageDefinitionInternal
177181
{
178182
/// <summary>
179183
/// Gets the type of the input.
@@ -293,6 +297,12 @@ IRenderedPipelineStageDefinition IPipelineStageDefinition.Render(IBsonSerializer
293297
{
294298
return Render(new((IBsonSerializer<TInput>)inputSerializer, serializerRegistry, translationOptions: translationOptions));
295299
}
300+
301+
IRenderedPipelineStageDefinition IPipelineStageStageDefinitionInternal.Render(IBsonSerializer inputSerializer, IBsonSerializationDomain serializationDomain,
302+
ExpressionTranslationOptions translationOptions)
303+
{
304+
return Render(new((IBsonSerializer<TInput>)inputSerializer, serializationDomain, translationOptions: translationOptions));
305+
}
296306
}
297307

298308
/// <summary>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using MongoDB.Bson.Serialization;
17+
18+
namespace MongoDB.Driver.Support
19+
{
20+
internal static class InternalExtensions
21+
{
22+
#region IPipelineStageDefinition
23+
24+
public static IRenderedPipelineStageDefinition RenderInternal(this IPipelineStageDefinition pipelineStageDefinition, IBsonSerializer inputSerializer,
25+
IBsonSerializationDomain serializationDomain, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
26+
{
27+
if (pipelineStageDefinition is IPipelineStageStageDefinitionInternal pipelineStageStageDefinitionInternal)
28+
{
29+
return pipelineStageStageDefinitionInternal
30+
.Render(inputSerializer, serializationDomain, translationOptions);
31+
}
32+
33+
return pipelineStageDefinition
34+
.Render(inputSerializer, serializerRegistry, translationOptions);
35+
}
36+
37+
#endregion
38+
}
39+
}

tests/MongoDB.Driver.Tests/MultipleRegistriesTests.cs

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using MongoDB.Bson.Serialization.Conventions;
2121
using MongoDB.Bson.Serialization.Serializers;
2222
using MongoDB.Driver.Core.TestHelpers.XunitExtensions;
23+
using MongoDB.Driver.Linq;
2324
using Xunit;
2425

2526
namespace MongoDB.Driver.Tests
@@ -169,31 +170,68 @@ public void TestConventions()
169170
}
170171

171172
[Fact]
172-
public void TestAggregate()
173+
public void TestDiscriminators()
173174
{
174175
RequireServer.Check();
175176

176177
var customDomain = BsonSerializer.CreateSerializationDomain();
177-
customDomain.RegisterSerializer(new CustomStringSerializer());
178+
179+
customDomain.BsonClassMap.RegisterClassMap<BasePerson>(cm =>
180+
{
181+
cm.AutoMap();
182+
cm.SetIsRootClass(true);
183+
});
184+
185+
customDomain.BsonClassMap.RegisterClassMap<DerivedPerson1>(cm =>
186+
{
187+
cm.AutoMap();
188+
cm.SetDiscriminator("dp1");
189+
});
190+
191+
customDomain.BsonClassMap.RegisterClassMap<DerivedPerson2>(cm =>
192+
{
193+
cm.AutoMap();
194+
cm.SetDiscriminator("dp2");
195+
});
178196

179197
var client = DriverTestConfiguration.CreateMongoClient((MongoClientSettings c) => (c as IInheritableMongoClientSettings).SerializationDomain = customDomain);
180198
var db = client.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName);
181199
db.DropCollection(DriverTestConfiguration.CollectionNamespace.CollectionName);
182-
var collection = db.GetCollection<Person>(DriverTestConfiguration.CollectionNamespace.CollectionName);
200+
var collection = db.GetCollection<BasePerson>(DriverTestConfiguration.CollectionNamespace.CollectionName);
183201
var untypedCollection = db.GetCollection<BsonDocument>(DriverTestConfiguration.CollectionNamespace.CollectionName);
184202

185-
var person = new Person { Id = ObjectId.Parse("6797b56bf5495bf53aa3078f"), Name = "Mario", Age = 24 };
186-
collection.InsertOne(person);
203+
var bp1 = new DerivedPerson1 { Name = "Alice", Age = 30, ExtraField1 = "Field1" };
204+
var bp2 = new DerivedPerson2 { Name = "Bob", Age = 40, ExtraField2 = "Field2" };
205+
collection.InsertMany(new BasePerson[] { bp1, bp2 });
187206

188-
var retrievedAsBson = untypedCollection.FindSync("{}").ToList().Single();
189-
var toString = retrievedAsBson.ToString();
207+
var test1 = collection.Aggregate().OfType<DerivedPerson1>().Single();
208+
var test2 = collection.Aggregate().OfType<DerivedPerson2>().Single();
190209

191-
var expectedVal =
192-
"""{ "_id" : { "$oid" : "6797b56bf5495bf53aa3078f" }, "Name" : "Mariotest", "Age" : 24 }""";
193-
Assert.Equal(expectedVal, toString);
210+
Assert.Equal(bp1.Id, test1.Id);
211+
Assert.Equal(bp2.Id, test2.Id);
194212

195-
var retrievedTyped = collection.AsQueryable().Where(x => x.Name == "Mario").ToList(); //The string serializer is correctly serializing "Mario" to "Mariotest"
196-
Assert.NotEmpty(retrievedTyped);
213+
var a1 = collection.AsQueryable().AppendStage(PipelineStageDefinitionBuilder.OfType<BasePerson, DerivedPerson1>())
214+
.OfType<DerivedPerson1>().Single();
215+
var a2 = collection.AsQueryable().AppendStage(PipelineStageDefinitionBuilder.OfType<BasePerson, DerivedPerson2>())
216+
.OfType<DerivedPerson2>().Single();
217+
218+
Assert.Equal(bp1.Id, a1.Id);
219+
Assert.Equal(bp2.Id, a2.Id);
220+
221+
var res1 = collection.AsQueryable().OfType<DerivedPerson1>().Single();
222+
var res2 = collection.AsQueryable().OfType<DerivedPerson2>().Single();
223+
224+
Assert.Equal(bp1.Id, res1.Id);
225+
Assert.Equal(bp2.Id, res2.Id);
226+
227+
var filter1 = Builders<BasePerson>.Filter.OfType<DerivedPerson1>();
228+
var dp1 = collection.FindSync(filter1).Single();
229+
230+
var filter2 = Builders<BasePerson>.Filter.OfType<DerivedPerson2>();
231+
var dp2 = collection.FindSync(filter2).Single();
232+
233+
Assert.Equal(bp1.Id, dp1.Id);
234+
Assert.Equal(bp2.Id, dp2.Id);
197235
}
198236

199237
public class Person
@@ -212,15 +250,22 @@ public class Person1
212250

213251
public class BasePerson
214252
{
215-
[BsonId] public ObjectId Id { get; set; }
253+
[BsonId] public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
216254
public string Name { get; set; }
217255
public int Age { get; set; }
218256
}
219257

220-
public class DerivedPerson : BasePerson
258+
public class DerivedPerson1 : BasePerson
221259
{
260+
public string ExtraField1 { get; set; }
222261
}
223262

263+
public class DerivedPerson2 : BasePerson
264+
{
265+
public string ExtraField2 { get; set; }
266+
}
267+
268+
224269
public class CustomStringSerializer : SealedClassSerializerBase<string> //This serializer just adds "test" to any serialised string
225270
{
226271
/// <inheritdoc/>

0 commit comments

Comments
 (0)