Skip to content

Commit a275180

Browse files
committed
Added serialization domain to LINQ
1 parent 9c80b06 commit a275180

File tree

44 files changed

+156
-129
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+156
-129
lines changed

src/MongoDB.Driver/AggregateExpressionDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ internal ExpressionAggregateExpressionDefinition(
140140
public override BsonValue Render(RenderArgs<TSource> args)
141141
{
142142
var contextData = _contextData?.With("SerializerRegistry", args.SerializerRegistry);
143-
return LinqProviderAdapter.TranslateExpressionToAggregateExpression(_expression, args.DocumentSerializer, args.SerializerRegistry, args.TranslationOptions, contextData);
143+
return LinqProviderAdapter.TranslateExpressionToAggregateExpression(_expression, args.DocumentSerializer, args.SerializationDomain, args.TranslationOptions, contextData);
144144
}
145145
}
146146

src/MongoDB.Driver/FieldDefinition.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ public LambdaExpression Expression
242242
/// <inheritdoc />
243243
public override RenderedFieldDefinition Render(RenderArgs<TDocument> args)
244244
{
245-
return LinqProviderAdapter.TranslateExpressionToField(_expression, args.DocumentSerializer, args.SerializerRegistry, args.TranslationOptions);
245+
return LinqProviderAdapter.TranslateExpressionToField(_expression, args.DocumentSerializer, args.SerializationDomain, args.TranslationOptions);
246246
}
247247
}
248248

@@ -275,7 +275,7 @@ public Expression<Func<TDocument, TField>> Expression
275275
/// <inheritdoc />
276276
public override RenderedFieldDefinition<TField> Render(RenderArgs<TDocument> args)
277277
{
278-
return LinqProviderAdapter.TranslateExpressionToField(_expression, args.DocumentSerializer, args.SerializerRegistry, args.TranslationOptions, args.PathRenderArgs.AllowScalarValueForArray);
278+
return LinqProviderAdapter.TranslateExpressionToField(_expression, args.DocumentSerializer, args.SerializationDomain, args.TranslationOptions, args.PathRenderArgs.AllowScalarValueForArray);
279279
}
280280
}
281281

src/MongoDB.Driver/FilterDefinition.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,11 @@ public override BsonDocument Render(RenderArgs<TDocument> args)
205205
{
206206
if (args.RenderForElemMatch)
207207
{
208-
return LinqProviderAdapter.TranslateExpressionToElemMatchFilter(_expression, elementSerializer: args.DocumentSerializer, args.SerializerRegistry, args.TranslationOptions);
208+
return LinqProviderAdapter.TranslateExpressionToElemMatchFilter(_expression, elementSerializer: args.DocumentSerializer, args.SerializationDomain, args.TranslationOptions);
209209
}
210210
else
211211
{
212-
return LinqProviderAdapter.TranslateExpressionToFilter(_expression, args.DocumentSerializer, args.SerializerRegistry, args.TranslationOptions);
212+
return LinqProviderAdapter.TranslateExpressionToFilter(_expression, args.DocumentSerializer, args.SerializationDomain, args.TranslationOptions);
213213
}
214214
}
215215
}

src/MongoDB.Driver/Linq/Linq3Implementation/GroupingWithOutputExpressionStageDefinitions.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public override RenderedPipelineStageDefinition<TOutput> Render(RenderArgs<TInpu
4343
{
4444
var inputSerializer = args.DocumentSerializer;
4545
var serializerRegistry = args.SerializerRegistry;
46-
var groupingStage = RenderGroupingStage(inputSerializer, serializerRegistry, args.TranslationOptions, out var groupingSerializer);
47-
var projectStage = RenderProjectStage(groupingSerializer, serializerRegistry, args.TranslationOptions, out var outputSerializer);
46+
var groupingStage = RenderGroupingStage(inputSerializer, args.SerializationDomain, args.TranslationOptions, out var groupingSerializer);
47+
var projectStage = RenderProjectStage(groupingSerializer, args.SerializationDomain, args.TranslationOptions, out var outputSerializer);
4848
var optimizedStages = OptimizeGroupingStages(groupingStage, projectStage, inputSerializer, outputSerializer);
4949
var renderedStages = optimizedStages.Select(x => x.Render().AsBsonDocument);
5050

@@ -53,18 +53,18 @@ public override RenderedPipelineStageDefinition<TOutput> Render(RenderArgs<TInpu
5353

5454
protected abstract AstStage RenderGroupingStage(
5555
IBsonSerializer<TInput> inputSerializer,
56-
IBsonSerializerRegistry serializerRegistry,
56+
IBsonSerializationDomain serializationDomain,
5757
ExpressionTranslationOptions translationOptions,
5858
out IBsonSerializer<TGrouping> groupingOutputSerializer);
5959

6060
private AstStage RenderProjectStage(
6161
IBsonSerializer<TGrouping> inputSerializer,
62-
IBsonSerializerRegistry serializerRegistry,
62+
IBsonSerializationDomain serializationDomain,
6363
ExpressionTranslationOptions translationOptions,
6464
out IBsonSerializer<TOutput> outputSerializer)
6565
{
6666
var partiallyEvaluatedOutput = (Expression<Func<TGrouping, TOutput>>)PartialEvaluator.EvaluatePartially(_output);
67-
var context = TranslationContext.Create(partiallyEvaluatedOutput, translationOptions);
67+
var context = TranslationContext.Create(partiallyEvaluatedOutput, translationOptions, serializationDomain);
6868
var outputTranslation = ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(context, partiallyEvaluatedOutput, inputSerializer, asRoot: true);
6969
var (projectStage, projectSerializer) = ProjectionHelper.CreateProjectStage(outputTranslation);
7070
outputSerializer = (IBsonSerializer<TOutput>)projectSerializer;
@@ -101,12 +101,12 @@ public BucketWithOutputExpressionStageDefinition(
101101

102102
protected override AstStage RenderGroupingStage(
103103
IBsonSerializer<TInput> inputSerializer,
104-
IBsonSerializerRegistry serializerRegistry,
104+
IBsonSerializationDomain serializationDomain,
105105
ExpressionTranslationOptions translationOptions,
106106
out IBsonSerializer<IGrouping<TValue, TInput>> groupingOutputSerializer)
107107
{
108108
var partiallyEvaluatedGroupBy = (Expression<Func<TInput, TValue>>)PartialEvaluator.EvaluatePartially(_groupBy);
109-
var context = TranslationContext.Create(partiallyEvaluatedGroupBy, translationOptions);
109+
var context = TranslationContext.Create(partiallyEvaluatedGroupBy, translationOptions, serializationDomain);
110110
var groupByTranslation = ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(context, partiallyEvaluatedGroupBy, inputSerializer, asRoot: true);
111111

112112
var valueSerializer = (IBsonSerializer<TValue>)groupByTranslation.Serializer;
@@ -145,12 +145,12 @@ public BucketAutoWithOutputExpressionStageDefinition(
145145

146146
protected override AstStage RenderGroupingStage(
147147
IBsonSerializer<TInput> inputSerializer,
148-
IBsonSerializerRegistry serializerRegistry,
148+
IBsonSerializationDomain serializationDomain,
149149
ExpressionTranslationOptions translationOptions,
150150
out IBsonSerializer<IGrouping<AggregateBucketAutoResultId<TValue>, TInput>> groupingOutputSerializer)
151151
{
152152
var partiallyEvaluatedGroupBy = (Expression<Func<TInput, TValue>>)PartialEvaluator.EvaluatePartially(_groupBy);
153-
var context = TranslationContext.Create(partiallyEvaluatedGroupBy, translationOptions);
153+
var context = TranslationContext.Create(partiallyEvaluatedGroupBy, translationOptions, serializationDomain);
154154
var groupByTranslation = ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(context, partiallyEvaluatedGroupBy, inputSerializer, asRoot: true);
155155

156156
var valueSerializer = (IBsonSerializer<TValue>)groupByTranslation.Serializer;
@@ -183,12 +183,12 @@ public GroupWithOutputExpressionStageDefinition(
183183

184184
protected override AstStage RenderGroupingStage(
185185
IBsonSerializer<TInput> inputSerializer,
186-
IBsonSerializerRegistry serializerRegistry,
186+
IBsonSerializationDomain serializationDomain,
187187
ExpressionTranslationOptions translationOptions,
188188
out IBsonSerializer<IGrouping<TValue, TInput>> groupingOutputSerializer)
189189
{
190190
var partiallyEvaluatedGroupBy = (Expression<Func<TInput, TValue>>)PartialEvaluator.EvaluatePartially(_groupBy);
191-
var context = TranslationContext.Create(partiallyEvaluatedGroupBy, translationOptions);
191+
var context = TranslationContext.Create(partiallyEvaluatedGroupBy, translationOptions, serializationDomain);
192192
var groupByTranslation = ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(context, partiallyEvaluatedGroupBy, inputSerializer, asRoot: true);
193193
var pushElements = AstExpression.AccumulatorField("_elements", AstUnaryAccumulatorOperator.Push, AstExpression.Var("ROOT", isCurrent: true));
194194
var groupBySerializer = (IBsonSerializer<TValue>)groupByTranslation.Serializer;

src/MongoDB.Driver/Linq/Linq3Implementation/Serializers/ISetWindowFieldsPartitionSerializer.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,11 @@ public void Serialize(BsonSerializationContext context, BsonSerializationArgs ar
6161
throw new InvalidOperationException("This serializer is not intended to be used.");
6262
}
6363

64-
6564
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
6665
{
6766
throw new InvalidOperationException("This serializer is not intended to be used.");
6867
}
6968

70-
7169
object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
7270
{
7371
throw new InvalidOperationException("This serializer is not intended to be used.");

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/ArrayLengthExpressionToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static AggregationExpression Translate(TranslationContext context, UnaryE
2828
var arrayExpression = expression.Operand;
2929
var arrayTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, arrayExpression);
3030
var ast = AstExpression.Size(arrayTranslation.Ast);
31-
var serializer = BsonSerializer.LookupSerializer(expression.Type);
31+
var serializer = context.SerializationDomain.LookupSerializer(expression.Type);
3232
return new AggregationExpression(expression, ast, serializer);
3333
}
3434

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/ConstantExpressionToAggregationExpressionTranslator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ namespace MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggreg
2323
{
2424
internal static class ConstantExpressionToAggregationExpressionTranslator
2525
{
26-
public static AggregationExpression Translate(ConstantExpression constantExpression)
26+
public static AggregationExpression Translate(TranslationContext context, ConstantExpression constantExpression)
2727
{
2828
var constantType = constantExpression.Type;
29-
var constantSerializer = StandardSerializers.TryGetSerializer(constantType, out var serializer) ? serializer : BsonSerializer.LookupSerializer(constantType);
29+
var constantSerializer = StandardSerializers.TryGetSerializer(constantType, out var serializer) ? serializer : context.SerializationDomain.LookupSerializer(constantType);
3030
return Translate(constantExpression, constantSerializer);
3131
}
3232

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/ConvertExpressionToAggregationExpressionTranslator.cs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ sourceExpression is UnaryExpression unarySourceExpression &&
4444
}
4545

4646
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
47-
return Translate(expression, sourceType, targetType, sourceTranslation);
47+
return Translate(context, expression, sourceType, targetType, sourceTranslation);
4848
}
4949

5050
throw new ExpressionNotSupportedException(expression);
5151
}
5252

53-
private static AggregationExpression Translate(UnaryExpression expression, Type sourceType, Type targetType, AggregationExpression sourceTranslation)
53+
private static AggregationExpression Translate(TranslationContext context, UnaryExpression expression, Type sourceType, Type targetType, AggregationExpression sourceTranslation)
5454
{
5555
if (targetType == sourceType)
5656
{
@@ -60,12 +60,12 @@ private static AggregationExpression Translate(UnaryExpression expression, Type
6060
// from Nullable<T> must be handled before to Nullable<T>
6161
if (IsConvertFromNullableType(sourceType))
6262
{
63-
return TranslateConvertFromNullableType(expression, sourceType, targetType, sourceTranslation);
63+
return TranslateConvertFromNullableType(context, expression, sourceType, targetType, sourceTranslation);
6464
}
6565

6666
if (IsConvertToNullableType(targetType))
6767
{
68-
return TranslateConvertToNullableType(expression, sourceType, targetType, sourceTranslation);
68+
return TranslateConvertToNullableType(context, expression, sourceType, targetType, sourceTranslation);
6969
}
7070

7171
// from here on we know there are no longer any Nullable<T> types involved
@@ -97,7 +97,7 @@ private static AggregationExpression Translate(UnaryExpression expression, Type
9797

9898
if (IsConvertToDerivedType(sourceType, targetType))
9999
{
100-
return TranslateConvertToDerivedType(expression, targetType, sourceTranslation);
100+
return TranslateConvertToDerivedType(context, expression, targetType, sourceTranslation);
101101
}
102102

103103
var ast = sourceTranslation.Ast;
@@ -177,10 +177,9 @@ private static AggregationExpression TranslateConvertToBaseType(UnaryExpression
177177
return new AggregationExpression(expression, sourceTranslation.Ast, downcastingSerializer);
178178
}
179179

180-
private static AggregationExpression TranslateConvertToDerivedType(UnaryExpression expression, Type targetType, AggregationExpression sourceTranslation)
180+
private static AggregationExpression TranslateConvertToDerivedType(TranslationContext context, UnaryExpression expression, Type targetType, AggregationExpression sourceTranslation)
181181
{
182-
var serializer = BsonSerializer.LookupSerializer(targetType);
183-
182+
var serializer = context.SerializationDomain.LookupSerializer(targetType);
184183
return new AggregationExpression(expression, sourceTranslation.Ast, serializer);
185184
}
186185

@@ -218,15 +217,15 @@ private static AggregationExpression TranslateConvertEnumToUnderlyingType(UnaryE
218217
return new AggregationExpression(expression, sourceTranslation.Ast, targetSerializer);
219218
}
220219

221-
private static AggregationExpression TranslateConvertFromNullableType(UnaryExpression expression, Type sourceType, Type targetType, AggregationExpression sourceTranslation)
220+
private static AggregationExpression TranslateConvertFromNullableType(TranslationContext context, UnaryExpression expression, Type sourceType, Type targetType, AggregationExpression sourceTranslation)
222221
{
223222
if (sourceType.IsNullable(out var sourceValueType))
224223
{
225224
var (sourceVarBinding, sourceAst) = AstExpression.UseVarIfNotSimple("source", sourceTranslation.Ast);
226225
var sourceNullableSerializer = (INullableSerializer)sourceTranslation.Serializer;
227226
var sourceValueSerializer = sourceNullableSerializer.ValueSerializer;
228227
var sourceValueAggregationExpression = new AggregationExpression(expression.Operand, sourceAst, sourceValueSerializer);
229-
var convertTranslation = Translate(expression, sourceValueType, targetType, sourceValueAggregationExpression);
228+
var convertTranslation = Translate(context, expression, sourceValueType, targetType, sourceValueAggregationExpression);
230229

231230
// note: we would have liked to throw a query execution error here if the value is null and the target type is not nullable but there is no way to do that in MQL
232231
// so we just return null instead and the user must check for null themselves if they want to define what happens when the value is null
@@ -242,7 +241,7 @@ private static AggregationExpression TranslateConvertFromNullableType(UnaryExpre
242241
throw new ExpressionNotSupportedException(expression, because: "sourceType is not nullable");
243242
}
244243

245-
private static AggregationExpression TranslateConvertToNullableType(UnaryExpression expression, Type sourceType, Type targetType, AggregationExpression sourceTranslation)
244+
private static AggregationExpression TranslateConvertToNullableType(TranslationContext context, UnaryExpression expression, Type sourceType, Type targetType, AggregationExpression sourceTranslation)
246245
{
247246
if (sourceType.IsNullable())
248247
{
@@ -252,7 +251,7 @@ private static AggregationExpression TranslateConvertToNullableType(UnaryExpress
252251

253252
if (targetType.IsNullable(out var targetValueType))
254253
{
255-
var convertTranslation = Translate(expression, sourceType, targetValueType, sourceTranslation);
254+
var convertTranslation = Translate(context, expression, sourceType, targetValueType, sourceTranslation);
256255
var nullableSerializer = NullableSerializer.Create(convertTranslation.Serializer);
257256
return new AggregationExpression(expression, convertTranslation.Ast, nullableSerializer);
258257
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/ExpressionToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static AggregationExpression Translate(TranslationContext context, Expres
6767
case ExpressionType.Conditional:
6868
return ConditionalExpressionToAggregationExpressionTranslator.Translate(context, (ConditionalExpression)expression);
6969
case ExpressionType.Constant:
70-
return ConstantExpressionToAggregationExpressionTranslator.Translate((ConstantExpression)expression);
70+
return ConstantExpressionToAggregationExpressionTranslator.Translate(context, (ConstantExpression)expression);
7171
case ExpressionType.Index:
7272
return IndexExpressionToAggregationExpressionTranslator.Translate(context, (IndexExpression)expression);
7373
case ExpressionType.ListInit:

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MemberInitExpressionToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public static AggregationExpression Translate(
7070
var constructorArgumentExpression = constructorArguments[i];
7171
var constructorArgumentTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, constructorArgumentExpression);
7272
var constructorArgumentType = constructorArgumentExpression.Type;
73-
var constructorArgumentSerializer = constructorArgumentTranslation.Serializer ?? BsonSerializer.LookupSerializer(constructorArgumentType);
73+
var constructorArgumentSerializer = constructorArgumentTranslation.Serializer ?? context.SerializationDomain.LookupSerializer(constructorArgumentType);
7474
var memberMap = EnsureMemberMap(expression, classMap, creatorMapParameter);
7575
EnsureDefaultValue(memberMap);
7676
var memberSerializer = CoerceSourceSerializerToMemberSerializer(memberMap, constructorArgumentSerializer);

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/CeilingMethodToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static AggregationExpression Translate(TranslationContext context, Method
3636

3737
var argumentAst = ConvertHelper.RemoveWideningConvert(argumentTranslation);
3838
var ast = AstExpression.Ceil(argumentAst);
39-
var serializer = BsonSerializer.LookupSerializer(expression.Type);
39+
var serializer = context.SerializationDomain.LookupSerializer(expression.Type);
4040

4141
return new AggregationExpression(expression, ast, serializer);
4242
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/ConstantMethodToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static AggregationExpression Translate(TranslationContext context, Method
4040
{
4141
var representationExpression = arguments[1];
4242
var representation = representationExpression.GetConstantValue<BsonType>(expression);
43-
var registeredSerializer = BsonSerializer.LookupSerializer(valueExpression.Type);
43+
var registeredSerializer = context.SerializationDomain.LookupSerializer(valueExpression.Type);
4444
if (registeredSerializer is IRepresentationConfigurable representationConfigurableSerializer)
4545
{
4646
serializer = representationConfigurableSerializer.WithRepresentation(representation);

0 commit comments

Comments
 (0)