Skip to content

Commit f788452

Browse files
authored
CSHARP-5446: Linq Aggregte Group(...) not support AddToSet (#1599)
1 parent dd00b43 commit f788452

File tree

6 files changed

+27
-14
lines changed

6 files changed

+27
-14
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,11 @@ public static AstExpression SetEquals(AstExpression arg1, AstExpression arg2)
707707
return new AstNaryExpression(AstNaryOperator.SetEquals, arg1, arg2);
708708
}
709709

710+
public static AstExpression SetIntersection(AstExpression arg)
711+
{
712+
return new AstUnaryExpression(AstUnaryOperator.SetIntersection, arg);
713+
}
714+
710715
public static AstExpression SetIntersection(params AstExpression[] args)
711716
{
712717
return new AstNaryExpression(AstNaryOperator.SetIntersection, args);
@@ -717,6 +722,11 @@ public static AstExpression SetIsSubset(AstExpression arg1, AstExpression arg2)
717722
return new AstBinaryExpression(AstBinaryOperator.SetIsSubset, arg1, arg2);
718723
}
719724

725+
public static AstExpression SetUnion(AstExpression arg)
726+
{
727+
return new AstUnaryExpression(AstUnaryOperator.SetUnion, arg);
728+
}
729+
720730
public static AstExpression SetUnion(params AstExpression[] args)
721731
{
722732
return new AstNaryExpression(AstNaryOperator.SetUnion, args);

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ internal enum AstUnaryOperator
2222
Abs,
2323
Acos,
2424
Acosh,
25-
AddToSet,
2625
AllElementsTrue,
2726
AnyElementTrue,
2827
ArrayToObject,
@@ -57,6 +56,8 @@ internal enum AstUnaryOperator
5756
RadiansToDegrees,
5857
ReverseArray,
5958
Round,
59+
SetIntersection,
60+
SetUnion,
6061
Sin,
6162
Sinh,
6263
Size,
@@ -88,13 +89,14 @@ public static bool IsAccumulator(this AstUnaryOperator @operator, out AstUnaryAc
8889
{
8990
switch (@operator)
9091
{
91-
case AstUnaryOperator.AddToSet: accumulatorOperator = AstUnaryAccumulatorOperator.AddToSet; return true;
9292
case AstUnaryOperator.Avg: accumulatorOperator = AstUnaryAccumulatorOperator.Avg; return true;
9393
case AstUnaryOperator.First: accumulatorOperator = AstUnaryAccumulatorOperator.First; return true;
9494
case AstUnaryOperator.Last: accumulatorOperator = AstUnaryAccumulatorOperator.Last; return true;
9595
case AstUnaryOperator.Max: accumulatorOperator = AstUnaryAccumulatorOperator.Max; return true;
9696
case AstUnaryOperator.Min: accumulatorOperator = AstUnaryAccumulatorOperator.Min; return true;
9797
case AstUnaryOperator.Push: accumulatorOperator = AstUnaryAccumulatorOperator.Push; return true;
98+
case AstUnaryOperator.SetIntersection: accumulatorOperator = AstUnaryAccumulatorOperator.AddToSet; return true;
99+
case AstUnaryOperator.SetUnion: accumulatorOperator = AstUnaryAccumulatorOperator.AddToSet; return true;
98100
case AstUnaryOperator.StdDevPop: accumulatorOperator = AstUnaryAccumulatorOperator.StdDevPop; return true;
99101
case AstUnaryOperator.StdDevSamp: accumulatorOperator = AstUnaryAccumulatorOperator.StdDevSamp; return true;
100102
case AstUnaryOperator.Sum: accumulatorOperator = AstUnaryAccumulatorOperator.Sum; return true;
@@ -123,7 +125,6 @@ public static string Render(this AstUnaryOperator @operator)
123125
AstUnaryOperator.Abs => "$abs",
124126
AstUnaryOperator.Acos => "$acos",
125127
AstUnaryOperator.Acosh => "$acosh",
126-
AstUnaryOperator.AddToSet => "$addToSet",
127128
AstUnaryOperator.AllElementsTrue => "$allElementsTrue",
128129
AstUnaryOperator.AnyElementTrue => "$anyElementTrue",
129130
AstUnaryOperator.ArrayToObject => "$arrayToObject",
@@ -158,6 +159,8 @@ public static string Render(this AstUnaryOperator @operator)
158159
AstUnaryOperator.RadiansToDegrees => "$radiansToDegrees",
159160
AstUnaryOperator.ReverseArray => "$reverseArray",
160161
AstUnaryOperator.Round => "$round",
162+
AstUnaryOperator.SetIntersection => "$setIntersection",
163+
AstUnaryOperator.SetUnion => "$setUnion",
161164
AstUnaryOperator.Sin => "$sin",
162165
AstUnaryOperator.Sinh => "$sinh",
163166
AstUnaryOperator.Size => "$size",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static TranslatedExpression Translate(TranslationContext context, MethodC
4242
NestedAsQueryableHelper.EnsureQueryableMethodHasNestedAsQueryableSource(expression, sourceTranslation);
4343
var itemSerializer = ArraySerializerHelper.GetItemSerializer(sourceTranslation.Serializer);
4444

45-
var ast = AstExpression.SetIntersection(sourceTranslation.Ast);
45+
var ast = AstExpression.SetUnion(sourceTranslation.Ast);
4646
var serializer = NestedAsQueryableSerializer.CreateIEnumerableOrNestedAsQueryableSerializer(expression.Type, itemSerializer);
4747
return new TranslatedExpression(expression, ast, serializer);
4848
}

tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Jira/CSharp4048Tests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -786,8 +786,8 @@ public void IGrouping_Distinct_of_root_should_work()
786786
var stages = Translate(collection, queryable);
787787
var expectedStages = new[]
788788
{
789-
"{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }", // MQL could be optimized further
790-
"{ $project : { _id : '$_id', Result : { $setIntersection : '$_elements' } } }",
789+
"{ $group : { _id : '$_id', __agg0 : { $addToSet : '$$ROOT' } } }",
790+
"{ $project : { _id : '$_id', Result : '$__agg0' } }",
791791
"{ $sort : { _id : 1 } }"
792792
};
793793
AssertStages(stages, expectedStages);
@@ -811,8 +811,8 @@ public void IGrouping_Distinct_of_scalar_should_work()
811811
var stages = Translate(collection, queryable);
812812
var expectedStages = new[]
813813
{
814-
"{ $group : { _id : '$_id', _elements : { $push : '$X' } } }", // MQL could be optimized further
815-
"{ $project : { _id : '$_id', Result : { $setIntersection : '$_elements' } } }",
814+
"{ $group : { _id : '$_id', __agg0 : { $addToSet : '$X' } } }",
815+
"{ $project : { _id : '$_id', Result : '$__agg0' } }",
816816
"{ $sort : { _id : 1 } }"
817817
};
818818
AssertStages(stages, expectedStages);

tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/DistinctMethodToAggregationExpressionTranslatorTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void Enumerable_Distinct_should_work()
3030
var queryable = collection.AsQueryable().Select(x => x.A.Distinct());
3131

3232
var stages = Translate(collection, queryable);
33-
AssertStages(stages, "{ $project : { _v : { $setIntersection : '$A' }, _id : 0 } }");
33+
AssertStages(stages, "{ $project : { _v : { $setUnion : '$A' }, _id : 0 } }");
3434

3535
var results = queryable.ToList();
3636
results.Should().HaveCount(4);
@@ -48,7 +48,7 @@ public void Queryable_Distinct_should_work()
4848
var queryable = collection.AsQueryable().Select(x => x.A.AsQueryable().Distinct());
4949

5050
var stages = Translate(collection, queryable);
51-
AssertStages(stages, "{ $project : { _v : { $setIntersection : '$A' }, _id : 0 } }");
51+
AssertStages(stages, "{ $project : { _v : { $setUnion : '$A' }, _id : 0 } }");
5252

5353
var results = queryable.ToList();
5454
results.Should().HaveCount(4);

tests/MongoDB.Driver.Tests/Linq/Linq3ImplementationWithLinq2Tests/Translators/AggregateGroupTranslatorTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ public void Should_translate_addToSet()
9393

9494
AssertStages(
9595
result.Stages,
96-
"{ $group : { _id : '$A', __agg0 : { $push : '$C.E.F' } } }",
97-
"{ $project : { Result : { $setUnion : '$__agg0' }, _id : 0 } }");
96+
"{ $group : { _id : '$A', __agg0 : { $addToSet : '$C.E.F' } } }",
97+
"{ $project : { Result : '$__agg0', _id : 0 } }");
9898

9999
result.Value.Result.Should().Equal(111);
100100
}
@@ -106,8 +106,8 @@ public void Should_translate_addToSet_using_Distinct()
106106

107107
AssertStages(
108108
result.Stages,
109-
"{ $group : { _id : '$A', __agg0 : { $push : '$C.E.F' } } }",
110-
"{ $project : { Result : { $setIntersection : '$__agg0' }, _id : 0 } }");
109+
"{ $group : { _id : '$A', __agg0 : { $addToSet : '$C.E.F' } } }",
110+
"{ $project : { Result : '$__agg0', _id : 0 } }");
111111

112112
result.Value.Result.Should().Equal(111);
113113
}

0 commit comments

Comments
 (0)