Skip to content

Commit cf219a7

Browse files
Igor Toporetcraiggwilson
authored andcommitted
added support for true "And" and "Or" expressions
- renamed 2 existing unit-tests - added 2 corresponding unit-tests per each case - renamed corresponding private methods to be more semantically correct
1 parent 357e25f commit cf219a7

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

Driver/Linq/Translators/PredicateTranslator.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ public IMongoQuery BuildQuery(Expression expression)
6060

6161
switch (expression.NodeType)
6262
{
63+
case ExpressionType.And:
6364
case ExpressionType.AndAlso:
64-
query = BuildAndAlsoQuery((BinaryExpression)expression);
65+
query = BuildAndQuery((BinaryExpression)expression);
6566
break;
6667
case ExpressionType.ArrayIndex:
6768
query = BuildBooleanQuery(expression);
@@ -86,8 +87,9 @@ public IMongoQuery BuildQuery(Expression expression)
8687
case ExpressionType.Not:
8788
query = BuildNotQuery((UnaryExpression)expression);
8889
break;
90+
case ExpressionType.Or:
8991
case ExpressionType.OrElse:
90-
query = BuildOrElseQuery((BinaryExpression)expression);
92+
query = BuildOrQuery((BinaryExpression)expression);
9193
break;
9294
case ExpressionType.TypeIs:
9395
query = BuildTypeIsQuery((TypeBinaryExpression)expression);
@@ -104,7 +106,7 @@ public IMongoQuery BuildQuery(Expression expression)
104106
}
105107

106108
// private methods
107-
private IMongoQuery BuildAndAlsoQuery(BinaryExpression binaryExpression)
109+
private IMongoQuery BuildAndQuery(BinaryExpression binaryExpression)
108110
{
109111
return Query.And(BuildQuery(binaryExpression.Left), BuildQuery(binaryExpression.Right));
110112
}
@@ -773,7 +775,7 @@ private IMongoQuery BuildNotQuery(UnaryExpression unaryExpression)
773775
return Query.Not(queryDocument);
774776
}
775777

776-
private IMongoQuery BuildOrElseQuery(BinaryExpression binaryExpression)
778+
private IMongoQuery BuildOrQuery(BinaryExpression binaryExpression)
777779
{
778780
return Query.Or(BuildQuery(binaryExpression.Left), BuildQuery(binaryExpression.Right));
779781
}

DriverUnitTests/Linq/SelectQueryTests.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
using System;
1717
using System.Collections.Generic;
1818
using System.Linq;
19-
using System.Text;
2019
using System.Text.RegularExpressions;
2120
using NUnit.Framework;
2221

@@ -6012,6 +6011,29 @@ public void TestWhereXEquals1()
60126011

60136012
[Test]
60146013
public void TestWhereXEquals1AndYEquals11()
6014+
{
6015+
var query = from c in _collection.AsQueryable<C>()
6016+
where c.X == 1 & c.Y == 11
6017+
select c;
6018+
6019+
var translatedQuery = MongoQueryTranslator.Translate(query);
6020+
Assert.IsInstanceOf<SelectQuery>(translatedQuery);
6021+
Assert.AreSame(_collection, translatedQuery.Collection);
6022+
Assert.AreSame(typeof(C), translatedQuery.DocumentType);
6023+
6024+
var selectQuery = (SelectQuery)translatedQuery;
6025+
Assert.AreEqual("(C c) => ((c.X == 1) & (c.Y == 11))", ExpressionFormatter.ToString(selectQuery.Where));
6026+
Assert.IsNull(selectQuery.OrderBy);
6027+
Assert.IsNull(selectQuery.Projection);
6028+
Assert.IsNull(selectQuery.Skip);
6029+
Assert.IsNull(selectQuery.Take);
6030+
6031+
Assert.AreEqual("{ \"x\" : 1, \"y\" : 11 }", selectQuery.BuildQuery().ToJson());
6032+
Assert.AreEqual(1, Consume(query));
6033+
}
6034+
6035+
[Test]
6036+
public void TestWhereXEquals1AndAlsoYEquals11()
60156037
{
60166038
var query = from c in _collection.AsQueryable<C>()
60176039
where c.X == 1 && c.Y == 11
@@ -6126,6 +6148,29 @@ public void TestWhereXEquals1Not()
61266148

61276149
[Test]
61286150
public void TestWhereXEquals1OrYEquals33()
6151+
{
6152+
var query = from c in _collection.AsQueryable<C>()
6153+
where c.X == 1 | c.Y == 33
6154+
select c;
6155+
6156+
var translatedQuery = MongoQueryTranslator.Translate(query);
6157+
Assert.IsInstanceOf<SelectQuery>(translatedQuery);
6158+
Assert.AreSame(_collection, translatedQuery.Collection);
6159+
Assert.AreSame(typeof(C), translatedQuery.DocumentType);
6160+
6161+
var selectQuery = (SelectQuery)translatedQuery;
6162+
Assert.AreEqual("(C c) => ((c.X == 1) | (c.Y == 33))", ExpressionFormatter.ToString(selectQuery.Where));
6163+
Assert.IsNull(selectQuery.OrderBy);
6164+
Assert.IsNull(selectQuery.Projection);
6165+
Assert.IsNull(selectQuery.Skip);
6166+
Assert.IsNull(selectQuery.Take);
6167+
6168+
Assert.AreEqual("{ \"$or\" : [{ \"x\" : 1 }, { \"y\" : 33 }] }", selectQuery.BuildQuery().ToJson());
6169+
Assert.AreEqual(2, Consume(query));
6170+
}
6171+
6172+
[Test]
6173+
public void TestWhereXEquals1OrElseYEquals33()
61296174
{
61306175
var query = from c in _collection.AsQueryable<C>()
61316176
where c.X == 1 || c.Y == 33

0 commit comments

Comments
 (0)