1616using System . Collections . Generic ;
1717using System . Linq ;
1818using FluentAssertions ;
19+ using MongoDB . Driver . Core . Misc ;
1920using MongoDB . Driver . Linq ;
2021using MongoDB . Driver . TestHelpers ;
2122using Xunit ;
@@ -24,6 +25,8 @@ namespace MongoDB.Driver.Tests.Linq.Linq3Implementation.Jira
2425{
2526 public class CSharp4048Tests : LinqIntegrationTest < CSharp4048Tests . ClassFixture >
2627 {
28+ private static readonly bool FilterLimitIsSupported = Feature . FilterLimit . IsSupported ( CoreTestConfiguration . MaxWireVersion ) ;
29+
2730 public CSharp4048Tests ( ClassFixture fixture )
2831 : base ( fixture )
2932 {
@@ -118,7 +121,7 @@ public void List_get_Item_of_scalar_should_work()
118121 var expectedStages = new [ ]
119122 {
120123 "{ $group : { _id : '$_id', _elements : { $push: '$X' } } }" ,
121- "{ $project : { _id : '$_id' Result : { $arrayElemAt : ['$_elements', 0] } } }" ,
124+ "{ $project : { _id : '$_id', Result : { $arrayElemAt : ['$_elements', 0] } } }" ,
122125 "{ $sort : { _id : 1 } }"
123126 } ;
124127 AssertStages ( stages , expectedStages ) ;
@@ -1040,12 +1043,21 @@ public void IGrouping_First_with_predicate_of_root_should_work()
10401043 . OrderBy ( x => x . Id ) ;
10411044
10421045 var stages = Translate ( collection , queryable ) ;
1043- var expectedStages = new [ ]
1044- {
1045- "{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }" ,
1046- "{ $project : { _id : '$_id', Result : { $arrayElemAt : [{ $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e.X', 1] } } }, 0] } } }" ,
1047- "{ $sort : { _id : 1 } }"
1048- } ;
1046+
1047+ var expectedStages = FilterLimitIsSupported
1048+ ? new [ ]
1049+ {
1050+ "{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }" ,
1051+ "{ $project : { _id : '$_id', Result : { $arrayElemAt : [{ $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e.X', 1] }, limit : 1 } }, 0] } } }" ,
1052+ "{ $sort : { _id : 1 } }"
1053+ }
1054+ : new [ ]
1055+ {
1056+ "{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }" ,
1057+ "{ $project : { _id : '$_id', Result : { $arrayElemAt : [{ $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e.X', 1] } } }, 0] } } }" ,
1058+ "{ $sort : { _id : 1 } }"
1059+ } ;
1060+
10491061 AssertStages ( stages , expectedStages ) ;
10501062
10511063 var results = queryable . ToList ( ) ;
@@ -1065,12 +1077,21 @@ public void IGrouping_First_with_predicate_of_scalar_should_work()
10651077 . OrderBy ( x => x . Id ) ;
10661078
10671079 var stages = Translate ( collection , queryable ) ;
1068- var expectedStages = new [ ]
1069- {
1070- "{ $group : { _id : '$_id', _elements : { $push : '$X' } } }" ,
1071- "{ $project : { _id : '$_id', Result : { $arrayElemAt : [{ $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e', 1] } } }, 0] } } }" ,
1072- "{ $sort : { _id : 1 } }"
1073- } ;
1080+
1081+ var expectedStages = FilterLimitIsSupported
1082+ ? new [ ]
1083+ {
1084+ "{ $group : { _id : '$_id', _elements : { $push : '$X' } } }" ,
1085+ "{ $project : { _id : '$_id', Result : { $arrayElemAt : [{ $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e', 1] }, limit : 1 } }, 0] } } }" ,
1086+ "{ $sort : { _id : 1 } }"
1087+ }
1088+ : new [ ]
1089+ {
1090+ "{ $group : { _id : '$_id', _elements : { $push : '$X' } } }" ,
1091+ "{ $project : { _id : '$_id', Result : { $arrayElemAt : [{ $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e', 1] } } }, 0] } } }" ,
1092+ "{ $sort : { _id : 1 } }"
1093+ } ;
1094+
10741095 AssertStages ( stages , expectedStages ) ;
10751096
10761097 var results = queryable . ToList ( ) ;
@@ -1140,12 +1161,21 @@ public void IGrouping_FirstOrDefault_with_predicate_of_root_should_work()
11401161 . OrderBy ( x => x . Id ) ;
11411162
11421163 var stages = Translate ( collection , queryable ) ;
1143- var expectedStages = new [ ]
1144- {
1145- "{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }" ,
1146- "{ $project : { _id : '$_id', Result : { $let : { vars : { values : { $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e.X', 1] } } } }, in : { $cond : { if : { $eq : [{ $size : '$$values' }, 0] }, then : null, else : { $arrayElemAt : ['$$values', 0] } } } } } } }" ,
1147- "{ $sort : { _id : 1 } }"
1148- } ;
1164+
1165+ var expectedStages = FilterLimitIsSupported
1166+ ? new [ ]
1167+ {
1168+ "{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }" ,
1169+ "{ $project : { _id : '$_id', Result : { $let : { vars : { values : { $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e.X', 1] }, limit : 1 } } }, in : { $cond : { if : { $eq : [{ $size : '$$values' }, 0] }, then : null, else : { $arrayElemAt : ['$$values', 0] } } } } } } }" ,
1170+ "{ $sort : { _id : 1 } }"
1171+ }
1172+ : new [ ]
1173+ {
1174+ "{ $group : { _id : '$_id', _elements : { $push : '$$ROOT' } } }" ,
1175+ "{ $project : { _id : '$_id', Result : { $let : { vars : { values : { $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e.X', 1] } } } }, in : { $cond : { if : { $eq : [{ $size : '$$values' }, 0] }, then : null, else : { $arrayElemAt : ['$$values', 0] } } } } } } }" ,
1176+ "{ $sort : { _id : 1 } }"
1177+ } ;
1178+
11491179 AssertStages ( stages , expectedStages ) ;
11501180
11511181 var results = queryable . ToList ( ) ;
@@ -1166,12 +1196,21 @@ public void IGrouping_FirstOrDefault_with_predicate_of_scalar_should_work()
11661196 . OrderBy ( x => x . Id ) ;
11671197
11681198 var stages = Translate ( collection , queryable ) ;
1169- var expectedStages = new [ ]
1170- {
1171- "{ $group : { _id : '$_id', _elements : { $push : '$X' } } }" ,
1172- "{ $project : { _id : '$_id', Result : { $let : { vars : { values : { $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e', 1] } } } }, in : { $cond : { if : { $eq : [{ $size : '$$values' }, 0] }, then : 0, else : { $arrayElemAt : ['$$values', 0] } } } } } } }" ,
1173- "{ $sort : { _id : 1 } }"
1174- } ;
1199+
1200+ var expectedStages = FilterLimitIsSupported
1201+ ? new [ ]
1202+ {
1203+ "{ $group : { _id : '$_id', _elements : { $push : '$X' } } }" ,
1204+ "{ $project : { _id : '$_id', Result : { $let : { vars : { values : { $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e', 1] }, limit : 1 } } }, in : { $cond : { if : { $eq : [{ $size : '$$values' }, 0] }, then : 0, else : { $arrayElemAt : ['$$values', 0] } } } } } } }" ,
1205+ "{ $sort : { _id : 1 } }"
1206+ }
1207+ : new [ ]
1208+ {
1209+ "{ $group : { _id : '$_id', _elements : { $push : '$X' } } }" ,
1210+ "{ $project : { _id : '$_id', Result : { $let : { vars : { values : { $filter : { input : '$_elements', as : 'e', cond : { $ne : ['$$e', 1] } } } }, in : { $cond : { if : { $eq : [{ $size : '$$values' }, 0] }, then : 0, else : { $arrayElemAt : ['$$values', 0] } } } } } } }" ,
1211+ "{ $sort : { _id : 1 } }"
1212+ } ;
1213+
11751214 AssertStages ( stages , expectedStages ) ;
11761215
11771216 var results = queryable . ToList ( ) ;
0 commit comments