Skip to content

Commit 91b54b7

Browse files
rstamBorisDog
authored andcommitted
CSHARP-4048: Test ALL IEnumerable extension methods against IGrouping.
1 parent e235279 commit 91b54b7

21 files changed

+2334
-32
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Ast/Expressions/AstNaryExpression.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,20 @@ public override AstNode Accept(AstNodeVisitor visitor)
4949

5050
public override BsonValue Render()
5151
{
52-
return new BsonDocument(_operator.Render(), new BsonArray(_args.Select(e => e.Render())));
52+
BsonValue renderedArgs;
53+
if (_args.Count == 1)
54+
{
55+
renderedArgs = _args[0].Render();
56+
if (renderedArgs.BsonType == BsonType.Array)
57+
{
58+
renderedArgs = new BsonArray { renderedArgs };
59+
}
60+
}
61+
else
62+
{
63+
renderedArgs = new BsonArray(_args.Select(e => e.Render()));
64+
}
65+
return new BsonDocument(_operator.Render(), renderedArgs);
5366
}
5467

5568
public AstNaryExpression Update(IEnumerable<AstExpression> args)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Linq.Linq3Implementation.Reflection
2424
internal static class EnumerableMethod
2525
{
2626
// private static fields
27-
private static readonly MethodInfo __aggregate;
27+
private static readonly MethodInfo __aggregateWithFunc;
2828
private static readonly MethodInfo __aggregateWithSeedAndFunc;
2929
private static readonly MethodInfo __aggregateWithSeedFuncAndResultSelector;
3030
private static readonly MethodInfo __all;
@@ -173,7 +173,7 @@ internal static class EnumerableMethod
173173
// static constructor
174174
static EnumerableMethod()
175175
{
176-
__aggregate = ReflectionInfo.Method((IEnumerable<object> source, Func<object, object, object> func) => source.Aggregate(func));
176+
__aggregateWithFunc = ReflectionInfo.Method((IEnumerable<object> source, Func<object, object, object> func) => source.Aggregate(func));
177177
__aggregateWithSeedAndFunc = ReflectionInfo.Method((IEnumerable<object> source, object seed, Func<object, object, object> func) => source.Aggregate(seed, func));
178178
__aggregateWithSeedFuncAndResultSelector = ReflectionInfo.Method((IEnumerable<object> source, object seed, Func<object, object, object> func, Func<object, object> resultSelector) => source.Aggregate(seed, func, resultSelector));
179179
__all = ReflectionInfo.Method((IEnumerable<object> source, Func<object, bool> predicate) => source.All(predicate));
@@ -321,7 +321,7 @@ static EnumerableMethod()
321321
}
322322

323323
// public properties
324-
public static MethodInfo Aggregate => __aggregate;
324+
public static MethodInfo AggregateWithFunc => __aggregateWithFunc;
325325
public static MethodInfo AggregateWithSeedAndFunc => __aggregateWithSeedAndFunc;
326326
public static MethodInfo AggregateWithSeedFuncAndResultSelector => __aggregateWithSeedFuncAndResultSelector;
327327
public static MethodInfo All => __all;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static AggregationExpression Translate(TranslationContext context, Binary
2626
if (expression.NodeType == ExpressionType.ArrayIndex)
2727
{
2828
var arrayExpression = expression.Left;
29-
var arrayTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, arrayExpression);
29+
var arrayTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, arrayExpression);
3030
var indexExpression = expression.Right;
3131
var indexTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, indexExpression);
3232
var ast = AstExpression.ArrayElemAt(arrayTranslation.Ast, indexTranslation.Ast);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal static class AggregateMethodToAggregationExpressionTranslator
2626
{
2727
private static readonly MethodInfo[] __aggregateMethods =
2828
{
29-
EnumerableMethod.Aggregate,
29+
EnumerableMethod.AggregateWithFunc,
3030
EnumerableMethod.AggregateWithSeedAndFunc,
3131
EnumerableMethod.AggregateWithSeedFuncAndResultSelector
3232
};
@@ -39,10 +39,10 @@ public static AggregationExpression Translate(TranslationContext context, Method
3939
if (method.IsOneOf(__aggregateMethods))
4040
{
4141
var sourceExpression = arguments[0];
42-
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
42+
var sourceTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, sourceExpression);
4343
var itemSerializer = ArraySerializerHelper.GetItemSerializer(sourceTranslation.Serializer);
4444

45-
if (method.Is(EnumerableMethod.Aggregate))
45+
if (method.Is(EnumerableMethod.AggregateWithFunc))
4646
{
4747
var funcLambda = (LambdaExpression)arguments[1];
4848
var funcParameters = funcLambda.Parameters;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static AggregationExpression Translate(TranslationContext context, Method
3131
if (method.Is(EnumerableMethod.All))
3232
{
3333
var sourceExpression = arguments[0];
34-
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
34+
var sourceTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, sourceExpression);
3535

3636
var predicateLambda = (LambdaExpression)arguments[1];
3737
var predicateParameter = predicateLambda.Parameters[0];

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static AggregationExpression Translate(TranslationContext context, Method
2929
var arguments = expression.Arguments;
3030

3131
var sourceExpression = arguments[0];
32-
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
32+
var sourceTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, sourceExpression);
3333

3434
if (method.Is(EnumerableMethod.Any))
3535
{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public static AggregationExpression Translate(TranslationContext context, Method
3131
if (method.Is(EnumerableMethod.Concat))
3232
{
3333
var firstExpression = arguments[0];
34-
var firstTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, firstExpression);
34+
var firstTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, firstExpression);
3535
var secondExpression = arguments[1];
36-
var secondTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, secondExpression);
36+
var secondTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, secondExpression);
3737
var ast = AstExpression.ConcatArrays(firstTranslation.Ast, secondTranslation.Ast);
3838
var itemSerializer = ArraySerializerHelper.GetItemSerializer(firstTranslation.Serializer);
3939
var serializer = IEnumerableSerializer.Create(itemSerializer);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ private static bool IsEnumerableContainsMethod(MethodCallExpression expression,
8282

8383
private static AggregationExpression TranslateEnumerableContains(TranslationContext context, Expression expression, Expression sourceExpression, Expression valueExpression)
8484
{
85-
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
85+
var sourceTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, sourceExpression);
8686
var valueTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, valueExpression);
8787
var ast = AstExpression.In(valueTranslation.Ast, sourceTranslation.Ast);
8888
return new AggregationExpression(expression, ast, new BooleanSerializer());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static AggregationExpression Translate(TranslationContext context, Method
3232
if (method.IsOneOf(EnumerableMethod.DefaultIfEmpty, EnumerableMethod.DefaultIfEmptyWithDefaultValue))
3333
{
3434
var sourceExpression = arguments[0];
35-
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
35+
var sourceTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, sourceExpression);
3636
var sourceVar = AstExpression.Var("source");
3737
var sourceVarBinding = AstExpression.VarBinding(sourceVar, sourceTranslation.Ast);
3838
AstExpression defaultValueAst;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static AggregationExpression Translate(TranslationContext context, Method
3030
if (method.Is(EnumerableMethod.Distinct))
3131
{
3232
var sourceExpression = arguments[0];
33-
var sourceTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, sourceExpression);
33+
var sourceTranslation = ExpressionToAggregationExpressionTranslator.TranslateEnumerable(context, sourceExpression);
3434
var ast = AstExpression.SetIntersection(sourceTranslation.Ast);
3535
return new AggregationExpression(expression, ast, sourceTranslation.Serializer);
3636
}

0 commit comments

Comments
 (0)