Skip to content

Commit a6c995c

Browse files
author
Robert Stam
committed
Finished implementing CSHARP-431. Allow constant on the left in BuildModQuery.
1 parent f5f7c86 commit a6c995c

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

Driver/Linq/Translators/SelectQuery.cs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -598,26 +598,40 @@ private IMongoQuery BuildMethodCallQuery(MethodCallExpression methodCallExpressi
598598

599599
private IMongoQuery BuildModQuery(BinaryExpression binaryExpression)
600600
{
601-
var leftBinaryExpression = binaryExpression.Left as BinaryExpression;
602-
if (leftBinaryExpression != null && leftBinaryExpression.NodeType == ExpressionType.Modulo)
601+
// the constant could be on either side
602+
var variableExpression = binaryExpression.Left;
603+
var constantExpression = binaryExpression.Right as ConstantExpression;
604+
if (constantExpression == null)
605+
{
606+
constantExpression = binaryExpression.Left as ConstantExpression;
607+
variableExpression = binaryExpression.Right;
608+
}
609+
610+
if (constantExpression == null || constantExpression.Type != typeof(int))
611+
{
612+
return null;
613+
}
614+
var value = ToInt32(constantExpression);
615+
616+
var modBinaryExpression = variableExpression as BinaryExpression;
617+
if (modBinaryExpression != null && modBinaryExpression.NodeType == ExpressionType.Modulo)
603618
{
604-
var serializationInfo = GetSerializationInfo(leftBinaryExpression.Left);
605-
var modulusExpression = leftBinaryExpression.Right as ConstantExpression;
606-
var equalsExpression = binaryExpression.Right as ConstantExpression;
607-
if (serializationInfo != null && modulusExpression != null && equalsExpression != null)
619+
var serializationInfo = GetSerializationInfo(modBinaryExpression.Left);
620+
var modulusExpression = modBinaryExpression.Right as ConstantExpression;
621+
if (serializationInfo != null && modulusExpression != null)
608622
{
609-
var modulus = Convert.ToInt32(modulusExpression.Value);
610-
var equals = Convert.ToInt32(equalsExpression.Value);
623+
var modulus = ToInt32(modulusExpression);
611624
if (binaryExpression.NodeType == ExpressionType.Equal)
612625
{
613-
return Query.Mod(serializationInfo.ElementName, modulus, equals);
626+
return Query.Mod(serializationInfo.ElementName, modulus, value);
614627
}
615628
else
616629
{
617-
return Query.Not(serializationInfo.ElementName).Mod(modulus, equals);
630+
return Query.Not(serializationInfo.ElementName).Mod(modulus, value);
618631
}
619632
}
620633
}
634+
621635
return null;
622636
}
623637

@@ -1000,7 +1014,7 @@ private int ToInt32(Expression expression)
10001014
throw new ArgumentOutOfRangeException("expression", "Expected a ConstantExpression.");
10011015
}
10021016

1003-
return (int) constantExpression.Value;
1017+
return (int)constantExpression.Value;
10041018
}
10051019

10061020
private void TranslateAny(MethodCallExpression methodCallExpression)

DriverUnitTests/Linq/SelectQueryTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5368,6 +5368,29 @@ public void TestWhereXModTwoEquals1Not()
53685368
Assert.AreEqual(2, Consume(query));
53695369
}
53705370

5371+
[Test]
5372+
public void TestWhereXModTwoEquals1Reversed()
5373+
{
5374+
var query = from c in _collection.AsQueryable<C>()
5375+
where 1 == c.X % 2
5376+
select c;
5377+
5378+
var translatedQuery = MongoQueryTranslator.Translate(query);
5379+
Assert.IsInstanceOf<SelectQuery>(translatedQuery);
5380+
Assert.AreSame(_collection, translatedQuery.Collection);
5381+
Assert.AreSame(typeof(C), translatedQuery.DocumentType);
5382+
5383+
var selectQuery = (SelectQuery)translatedQuery;
5384+
Assert.AreEqual("(C c) => (1 == (c.X % 2))", ExpressionFormatter.ToString(selectQuery.Where));
5385+
Assert.IsNull(selectQuery.OrderBy);
5386+
Assert.IsNull(selectQuery.Projection);
5387+
Assert.IsNull(selectQuery.Skip);
5388+
Assert.IsNull(selectQuery.Take);
5389+
5390+
Assert.AreEqual("{ \"x\" : { \"$mod\" : [2, 1] } }", selectQuery.BuildQuery().ToJson());
5391+
Assert.AreEqual(3, Consume(query));
5392+
}
5393+
53715394
[Test]
53725395
public void TestWhereXModTwoNotEquals1()
53735396
{

0 commit comments

Comments
 (0)