Skip to content

Commit a61c243

Browse files
committed
Work in progress.
1 parent 5ec9ef1 commit a61c243

File tree

9 files changed

+52
-17
lines changed

9 files changed

+52
-17
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinder.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,27 @@ namespace MongoDB.Driver.Linq.Linq3Implementation.KnownSerializerFinders;
2121
internal static class KnownSerializerFinder
2222
{
2323
public static KnownSerializerMap FindKnownSerializers(
24-
Expression expression)
24+
Expression expression,
25+
ExpressionTranslationOptions translationOptions)
2526
{
2627
var knownSerializers = new KnownSerializerMap();
27-
return FindKnownSerializers(expression, knownSerializers);
28+
return FindKnownSerializers(expression, translationOptions, knownSerializers);
2829
}
2930

3031
public static KnownSerializerMap FindKnownSerializers(
3132
Expression expression,
33+
ExpressionTranslationOptions translationOptions,
3234
Expression initialNode,
3335
IBsonSerializer knownSerializer)
3436
{
3537
var knownSerializers = new KnownSerializerMap();
3638
knownSerializers.AddSerializer(initialNode, knownSerializer);
37-
return FindKnownSerializers(expression, knownSerializers);
39+
return FindKnownSerializers(expression, translationOptions, knownSerializers);
3840
}
3941

4042
public static KnownSerializerMap FindKnownSerializers(
4143
Expression expression,
44+
ExpressionTranslationOptions translationOptions,
4245
(Expression Node, IBsonSerializer KnownSerializer)[] initialNodes)
4346
{
4447
var knownSerializers = new KnownSerializerMap();
@@ -47,14 +50,15 @@ public static KnownSerializerMap FindKnownSerializers(
4750
knownSerializers.AddSerializer(initialNode, knownSerializer);
4851

4952
}
50-
return FindKnownSerializers(expression, knownSerializers);
53+
return FindKnownSerializers(expression, translationOptions, knownSerializers);
5154
}
5255

5356
public static KnownSerializerMap FindKnownSerializers(
5457
Expression expression,
58+
ExpressionTranslationOptions translationOptions,
5559
KnownSerializerMap knownSerializers)
5660
{
57-
var visitor = new KnownSerializerFinderVisitor(knownSerializers);
61+
var visitor = new KnownSerializerFinderVisitor(translationOptions, knownSerializers);
5862

5963
int oldSerializerCount;
6064
int newSerializerCount;

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderHelperMethods.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
using MongoDB.Bson.Serialization.Serializers;
2222
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
2323
using MongoDB.Driver.Linq.Linq3Implementation.Serializers;
24+
using IOrderedEnumerableSerializer=MongoDB.Driver.Linq.Linq3Implementation.Serializers.IOrderedEnumerableSerializer;
2425

2526
namespace MongoDB.Driver.Linq.Linq3Implementation.KnownSerializerFinders;
2627

@@ -93,6 +94,7 @@ IBsonSerializer CreateCollectionSerializerFromItemSerializer(Type type, IBsonSer
9394
{
9495
_ when type.IsArray => ArraySerializer.Create(itemSerializer),
9596
_ when type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>) => IEnumerableSerializer.Create(itemSerializer),
97+
_ when type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(IOrderedEnumerable<>) => IOrderedEnumerableSerializer.Create(itemSerializer),
9698
_ when type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(IQueryable<>) => IQueryableSerializer.Create(itemSerializer),
9799
_ => (BsonSerializer.LookupSerializer(type) as IChildSerializerConfigurable)?.WithChildSerializer(itemSerializer)
98100
};

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitMethodCall.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,25 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
654654
var arguments = node.Arguments;
655655

656656
DeduceMethodCallSerializers();
657-
base.VisitMethodCall(node);
657+
try
658+
{
659+
base.VisitMethodCall(node);
660+
}
661+
catch
662+
{
663+
if (node.Method.Is(QueryableMethod.Select) && (_translationOptions.EnableClientSideProjections ?? false))
664+
{
665+
var sourceExpression = arguments[0];
666+
if (IsItemSerializerKnown(sourceExpression, out var sourceItemSerializer))
667+
{
668+
AddKnownSerializer(node, IgnoreSubtreeSerializer.Create(node.Type));
669+
}
670+
}
671+
else
672+
{
673+
throw;
674+
}
675+
}
658676
DeduceMethodCallSerializers();
659677

660678
return node;
@@ -820,6 +838,9 @@ void DeduceMethodCallSerializers()
820838
case "ToUpperInvariant":
821839
DeduceToLowerOrToUpperSerializers();
822840
break;
841+
842+
default:
843+
throw new ExpressionNotSupportedException(node, because: $"method {method.Name} is not supported");
823844
}
824845
}
825846

@@ -1965,7 +1986,7 @@ void DeduceOrderByMethodSerializers()
19651986
var keySelectorParameter = keySelectorLambda.Parameters.Single();
19661987

19671988
DeduceItemAndCollectionSerializers(keySelectorParameter, sourceExpression);
1968-
DeduceSerializers(node, sourceExpression);
1989+
DeduceCollectionAndCollectionSerializers(node, sourceExpression);
19691990
}
19701991
}
19711992

src/MongoDB.Driver/Linq/Linq3Implementation/KnownSerializerFinders/KnownSerializerFinderVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ internal partial class KnownSerializerFinderVisitor : ExpressionVisitor
2727
{
2828
private readonly KnownSerializerMap _knownSerializers;
2929
private int _pass = 0;
30+
private readonly ExpressionTranslationOptions _translationOptions;
3031

31-
public KnownSerializerFinderVisitor(KnownSerializerMap knownSerializers)
32+
public KnownSerializerFinderVisitor(ExpressionTranslationOptions translationOptions, KnownSerializerMap knownSerializers)
3233
{
3334
_knownSerializers = knownSerializers;
35+
_translationOptions = translationOptions;
3436
}
3537

3638
public int Pass => _pass;

src/MongoDB.Driver/Linq/Linq3Implementation/Misc/IBsonSerializerExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public static bool CanBeAssignedTo(this IBsonSerializer sourceSerializer, IBsonS
3535
return true;
3636
}
3737

38+
if (targetSerializer.ValueType.IsAssignableFrom(sourceSerializer.ValueType))
39+
{
40+
return true;
41+
}
42+
3843
return false;
3944
}
4045

src/MongoDB.Driver/Linq/Linq3Implementation/Reflection/TupleOrValueTupleConstructor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ internal static class TupleOrValueTupleConstructor
2222
{
2323
public static bool IsTupleOrValueTupleConstructor(ConstructorInfo constructor)
2424
{
25-
var declaringType = constructor.DeclaringType;
2625
return
26+
constructor != null &&
27+
constructor.DeclaringType is var declaringType &&
2728
declaringType.Namespace == "System" &&
2829
(declaringType.Name.StartsWith("Tuple") || declaringType.Name.StartsWith("ValueTuple"));
2930
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public static TranslatedExpression Translate(TranslationContext context, MethodC
7070
@as: predicateSymbol.Var.Name,
7171
limitTranslation?.Ast);
7272

73-
var resultSerializer = NestedAsQueryableSerializer.CreateIEnumerableOrNestedAsQueryableSerializer(expression.Type, itemSerializer);
73+
// var resultSerializer = NestedAsQueryableSerializer.CreateIEnumerableOrNestedAsQueryableSerializer(expression.Type, itemSerializer);
74+
var resultSerializer = context.KnownSerializers.GetSerializer(expression);
7475
return new TranslatedExpression(expression, ast, resultSerializer);
7576
}
7677

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/TranslationContext.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static TranslationContext Create(
3434
ExpressionTranslationOptions translationOptions,
3535
TranslationContextData data = null)
3636
{
37-
var knownSerializers = KnownSerializerFinder.FindKnownSerializers(expression);
37+
var knownSerializers = KnownSerializerFinder.FindKnownSerializers(expression, translationOptions);
3838
return Create(translationOptions, knownSerializers, data);
3939
}
4040

@@ -56,7 +56,7 @@ public static TranslationContext Create(
5656
ExpressionTranslationOptions translationOptions,
5757
TranslationContextData data = null)
5858
{
59-
var knownSerializers = KnownSerializerFinder.FindKnownSerializers(expression, initialNode, initialSerializer);
59+
var knownSerializers = KnownSerializerFinder.FindKnownSerializers(expression, translationOptions, initialNode, initialSerializer);
6060
return Create(translationOptions, knownSerializers, data);
6161
}
6262

@@ -66,7 +66,7 @@ public static TranslationContext Create(
6666
ExpressionTranslationOptions translationOptions,
6767
TranslationContextData data = null)
6868
{
69-
var knownSerializers = KnownSerializerFinder.FindKnownSerializers(expression, initialKnownSerializers);
69+
var knownSerializers = KnownSerializerFinder.FindKnownSerializers(expression, translationOptions, initialKnownSerializers);
7070
return Create(translationOptions, knownSerializers, data);
7171
}
7272

src/MongoDB.Driver/Linq/LinqProviderAdapter.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,11 @@ internal static BsonDocument TranslateExpressionToSetStage<TDocument, TFields>(
224224

225225
var knownSerializers = new KnownSerializerMap();
226226
knownSerializers.AddSerializer(parameter, documentSerializer);
227-
if (body is MemberInitExpression memberInitExpression &&
228-
memberInitExpression.Type == typeof(TDocument))
227+
if (body.Type == typeof(TDocument))
229228
{
230-
knownSerializers.AddSerializer(memberInitExpression, documentSerializer);
229+
knownSerializers.AddSerializer(body, documentSerializer);
231230
}
232-
KnownSerializerFinder.FindKnownSerializers(expression, knownSerializers);
231+
KnownSerializerFinder.FindKnownSerializers(expression, translationOptions, knownSerializers);
233232

234233
var context = TranslationContext.Create(translationOptions, knownSerializers); // do not partially evaluate expression
235234
var symbol = context.CreateRootSymbol(parameter, documentSerializer);

0 commit comments

Comments
 (0)