Skip to content

Commit 4a55bf3

Browse files
committed
Work in progress.
1 parent 377b6c4 commit 4a55bf3

File tree

13 files changed

+716
-88
lines changed

13 files changed

+716
-88
lines changed

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,13 @@ public static KnownSerializerMap FindKnownSerializers(
6060
{
6161
var visitor = new KnownSerializerFinderVisitor(translationOptions, knownSerializers);
6262

63-
int oldSerializerCount;
64-
int newSerializerCount;
6563
do
6664
{
67-
visitor.StartNextPass();
68-
oldSerializerCount = knownSerializers.Count;
65+
visitor.StartPass();
6966
visitor.Visit(expression);
70-
newSerializerCount = knownSerializers.Count;
71-
72-
// TODO: prevent infinite loop, throw after 100000 passes?
67+
visitor.EndPass();
7368
}
74-
while (visitor.Pass == 1 || newSerializerCount > oldSerializerCount); // I don't know yet if this can be done in a single pass
69+
while (visitor.IsMakingProgress);
7570

7671
//#if DEBUG
7772
var expressionWithUnknownSerializer = UnknownSerializerFinder.FindExpressionWithUnknownSerializer(expression, knownSerializers);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ protected override Expression VisitConditional(ConditionalExpression node)
3030
base.VisitConditional(node);
3131

3232
DeduceSerializers(ifTrue, ifFalse);
33-
DeduceSerializers(ifFalse, ifTrue);
3433
DeduceSerializers(node, ifTrue);
3534

3635
return node;

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

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,17 @@ internal partial class KnownSerializerFinderVisitor
2323
{
2424
protected override Expression VisitConstant(ConstantExpression node)
2525
{
26-
if (IsNotKnown(node))
26+
if (IsNotKnown(node) && _useDefaultSerializerForConstants)
2727
{
28-
var value = node.Value;
29-
IBsonSerializer constantSerializer = null;
30-
31-
if (_pass > 1)
28+
if (StandardSerializers.TryGetSerializer(node.Type, out var standardSerializer))
3229
{
33-
if (StandardSerializers.TryGetSerializer(node.Type, out constantSerializer))
34-
{
35-
// constant => node: standardSerializer
36-
}
37-
else
38-
{
39-
// constant => node: registeredSerializer
40-
constantSerializer = BsonSerializer.LookupSerializer(node.Type); // TODO: don't use static registry
41-
}
30+
AddKnownSerializer(node, standardSerializer);
4231
}
43-
44-
if (constantSerializer != null)
32+
else
4533
{
46-
AddKnownSerializer(node, constantSerializer);
34+
// constant => node: registeredSerializer
35+
var registeredSerializer = BsonSerializer.LookupSerializer(node.Type); // TODO: don't use static registry
36+
AddKnownSerializer(node, registeredSerializer);
4737
}
4838
}
4939

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

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,49 +27,39 @@ protected override Expression VisitIndex(IndexExpression node)
2727
{
2828
base.VisitIndex(node);
2929

30-
var containerExpression = node.Object;
30+
var collectionExpression = node.Object;
3131
var indexer = node.Indexer;
3232
var arguments = node.Arguments;
3333

3434
if (IsBsonValueIndexer())
3535
{
36-
var keyExpression = arguments[0];
37-
38-
DeduceSerializer(keyExpression, keyExpression.Type == typeof(string) ? StringSerializer.Instance : Int32Serializer.Instance);
3936
DeduceSerializer(node, BsonValueSerializer.Instance);
4037
}
4138
else if (IsDictionaryIndexer())
4239
{
43-
var keyExpression = arguments[0];
44-
45-
if (IsKnown(containerExpression, out var containerSerializer) &&
46-
containerSerializer is IBsonDictionarySerializer dictionarySerializer)
40+
if (IsKnown(collectionExpression, out var collectionSerializer) &&
41+
collectionSerializer is IBsonDictionarySerializer dictionarySerializer)
4742
{
48-
var keySerializer = dictionarySerializer.KeySerializer;
4943
var valueSerializer = dictionarySerializer.ValueSerializer;
50-
51-
DeduceSerializer(keyExpression, keySerializer);
5244
DeduceSerializer(node, valueSerializer);
5345
}
5446
}
5547
// check array indexer AFTER dictionary indexer
56-
else if (IsArrayIndexer())
48+
else if (IsCollectionIndexer())
5749
{
58-
var indexExpression = arguments[0];
59-
60-
if (IsKnown(containerExpression, out var containerSerializer) &&
61-
containerSerializer is IBsonArraySerializer arraySerializer)
50+
if (IsKnown(collectionExpression, out var collectionSerializer) &&
51+
collectionSerializer is IBsonArraySerializer arraySerializer)
6252
{
6353
var itemSerializer = arraySerializer.GetItemSerializer();
64-
65-
DeduceSerializer(indexExpression, Int32Serializer.Instance);
6654
DeduceSerializer(node, itemSerializer);
6755
}
6856
}
57+
// TODO: Deduce UnknowableSerializer???
58+
// handle generic cases?
6959

7060
return node;
7161

72-
bool IsArrayIndexer()
62+
bool IsCollectionIndexer()
7363
{
7464
return
7565
arguments.Count == 1 &&

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ IBsonSerializer GetBsonValuePropertySerializer()
101101
"AsRegex" => RegexSerializer.RegularExpressionInstance,
102102
"AsString" => StringSerializer.Instance,
103103
"AsUniversalTime" => DateTimeSerializer.UtcInstance,
104+
// TODO: return UnknowableSerializer???
104105
_ => throw new ExpressionNotSupportedException(node, because: $"Unexpected member name: {memberName}")
105106
};
106107
}
@@ -129,6 +130,7 @@ IBsonSerializer GetDateTimePropertySerializer()
129130
"Today" => DateTimeSerializer.Instance,
130131
"UtcNow" => DateTimeSerializer.Instance,
131132
"Year" => Int32Serializer.Instance,
133+
// TODO: return UnknowableSerializer???
132134
_ => throw new ExpressionNotSupportedException(node, because: $"Unexpected member name: {memberName}")
133135
};
134136
}
@@ -139,6 +141,7 @@ IBsonSerializer GetNullablePropertySerializer()
139141
{
140142
"HasValue" => BooleanSerializer.Instance,
141143
"Value" => (containingSerializer as INullableSerializer)?.ValueSerializer,
144+
// TODO: return UnknowableSerializer???
142145
_ => throw new ExpressionNotSupportedException(node, because: $"Unexpected member name: {memberName}")
143146
};
144147
}
@@ -147,13 +150,16 @@ IBsonSerializer GetPropertySerializer()
147150
{
148151
if (containingSerializer is not IBsonDocumentSerializer documentSerializer)
149152
{
153+
// TODO: return UnknowableSerializer???
150154
throw new ExpressionNotSupportedException(node, because: $"serializer type {containingSerializer.GetType()} does not implement the {nameof(IBsonDocumentSerializer)} interface");
151155
}
152156

153157
if (!documentSerializer.TryGetMemberSerializationInfo(memberName, out var memberSerializationInfo))
154158
{
159+
// TODO: return UnknowableSerializer???
155160
throw new ExpressionNotSupportedException(node, because: $"serializer type {containingSerializer.GetType()} does not support a member named: {memberName}");
156161
}
162+
157163
return memberSerializationInfo.Serializer;
158164
}
159165

@@ -174,6 +180,7 @@ IBsonSerializer GetTupleOrValueTuplePropertySerializer()
174180
"Item6" => tupleSerializer.GetItemSerializer(6),
175181
"Item7" => tupleSerializer.GetItemSerializer(7),
176182
"Rest" => tupleSerializer.GetItemSerializer(8),
183+
// TODO: return UnknowableSerializer???
177184
_ => throw new ExpressionNotSupportedException(node, because: $"Unexpected member name: {memberName}")
178185
};
179186
}

0 commit comments

Comments
 (0)