Skip to content

Commit cf65611

Browse files
committed
CSHARP-4776: Support additional array length comparisons.
1 parent 08d4906 commit cf65611

File tree

3 files changed

+540
-3
lines changed

3 files changed

+540
-3
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToFilterTranslators/ExpressionTranslators/ArrayLengthComparisonExpressionToFilterTranslator.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
using System.Linq.Expressions;
17+
using MongoDB.Bson.Serialization.Serializers;
1718
using MongoDB.Driver.Linq.Linq3Implementation.Ast.Filters;
1819
using MongoDB.Driver.Linq.Linq3Implementation.ExtensionMethods;
1920
using MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators;
@@ -50,13 +51,27 @@ public static AstFilter Translate(TranslationContext context, BinaryExpression e
5051
case ExpressionType.Equal:
5152
return AstFilter.Size(arrayField, size);
5253

54+
case ExpressionType.GreaterThan:
55+
return AstFilter.Exists(ItemField(arrayField, size));
56+
57+
case ExpressionType.GreaterThanOrEqual:
58+
return AstFilter.Exists(ItemField(arrayField, size - 1));
59+
60+
case ExpressionType.LessThan:
61+
return AstFilter.NotExists(ItemField(arrayField, size - 1));
62+
63+
case ExpressionType.LessThanOrEqual:
64+
return AstFilter.NotExists(ItemField(arrayField, size));
65+
5366
case ExpressionType.NotEqual:
5467
return AstFilter.Not(AstFilter.Size(arrayField, size));
5568
}
5669

5770
}
5871

5972
throw new ExpressionNotSupportedException(expression);
73+
74+
static AstFilterField ItemField(AstFilterField field, int index) => field.SubField(index.ToString(), BsonValueSerializer.Instance);
6075
}
6176
}
6277
}

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToFilterTranslators/ExpressionTranslators/CountComparisonExpressionToFilterTranslator.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using System.Linq.Expressions;
1717
using System.Reflection;
1818
using MongoDB.Bson;
19+
using MongoDB.Bson.Serialization.Serializers;
1920
using MongoDB.Driver.Linq.Linq3Implementation.Ast.Filters;
2021
using MongoDB.Driver.Linq.Linq3Implementation.Misc;
2122
using MongoDB.Driver.Linq.Linq3Implementation.Reflection;
@@ -73,15 +74,31 @@ public static AstFilter Translate(TranslationContext context, BinaryExpression e
7374

7475
if (TryConvertSizeExpressionToBsonValue(sizeExpression, out var size))
7576
{
76-
var compareCountFilter = AstFilter.Size(field, size);
7777
switch (expression.NodeType)
7878
{
79-
case ExpressionType.Equal: return compareCountFilter;
80-
case ExpressionType.NotEqual: return AstFilter.Not(compareCountFilter);
79+
case ExpressionType.Equal:
80+
return AstFilter.Size(field, size);
81+
82+
case ExpressionType.GreaterThan:
83+
return AstFilter.Exists(ItemField(field, size.ToInt64()));
84+
85+
case ExpressionType.GreaterThanOrEqual:
86+
return AstFilter.Exists(ItemField(field, size.ToInt64() - 1));
87+
88+
case ExpressionType.LessThan:
89+
return AstFilter.NotExists(ItemField(field, size.ToInt64() - 1));
90+
91+
case ExpressionType.LessThanOrEqual:
92+
return AstFilter.NotExists(ItemField(field, size.ToInt64()));
93+
94+
case ExpressionType.NotEqual:
95+
return AstFilter.Not(AstFilter.Size(field, size));
8196
}
8297
}
8398

8499
throw new ExpressionNotSupportedException(expression);
100+
101+
static AstFilterField ItemField(AstFilterField field, long index) => field.SubField(index.ToString(), BsonValueSerializer.Instance);
85102
}
86103

87104
private static bool TryConvertSizeExpressionToBsonValue(Expression sizeExpression, out BsonValue size)

0 commit comments

Comments
 (0)