Skip to content

Commit 018d7da

Browse files
author
Robert Stam
committed
Minor refactoring. Only check for constant on the left of comparison operator in one place.
1 parent a6c995c commit 018d7da

File tree

1 file changed

+30
-41
lines changed

1 file changed

+30
-41
lines changed

Driver/Linq/Translators/SelectQuery.cs

Lines changed: 30 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -238,18 +238,14 @@ private IMongoQuery BuildAnyQuery(MethodCallExpression methodCallExpression)
238238
return null;
239239
}
240240

241-
private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
241+
private IMongoQuery BuildArrayLengthQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)
242242
{
243-
// the constant could be on either side (but only == and != are supported and they don't need to be flipped)
244-
var variableExpression = binaryExpression.Left;
245-
var constantExpression = binaryExpression.Right as ConstantExpression;
246-
if (constantExpression == null)
243+
if (operatorType != ExpressionType.Equal && operatorType != ExpressionType.NotEqual)
247244
{
248-
constantExpression = binaryExpression.Left as ConstantExpression;
249-
variableExpression = binaryExpression.Right;
245+
return null;
250246
}
251-
252-
if (constantExpression == null || constantExpression.Type != typeof(int))
247+
248+
if (constantExpression.Type != typeof(int))
253249
{
254250
return null;
255251
}
@@ -302,7 +298,7 @@ private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
302298

303299
if (serializationInfo != null)
304300
{
305-
if (binaryExpression.NodeType == ExpressionType.Equal)
301+
if (operatorType == ExpressionType.Equal)
306302
{
307303
return Query.Size(serializationInfo.ElementName, value);
308304
}
@@ -330,36 +326,21 @@ private IMongoQuery BuildBooleanQuery(Expression expression)
330326

331327
private IMongoQuery BuildComparisonQuery(BinaryExpression binaryExpression)
332328
{
333-
var operatorNodeType = binaryExpression.NodeType;
334-
if (operatorNodeType == ExpressionType.Equal || operatorNodeType == ExpressionType.NotEqual)
335-
{
336-
var query = BuildArrayLengthQuery(binaryExpression);
337-
if (query != null)
338-
{
339-
return query;
340-
}
341-
342-
query = BuildModQuery(binaryExpression);
343-
if (query != null)
344-
{
345-
return query;
346-
}
347-
}
348-
349329
// the constant could be on either side
350330
var variableExpression = binaryExpression.Left;
351331
var constantExpression = binaryExpression.Right as ConstantExpression;
332+
var operatorType = binaryExpression.NodeType;
352333
if (constantExpression == null)
353334
{
354335
constantExpression = binaryExpression.Left as ConstantExpression;
355336
variableExpression = binaryExpression.Right;
356337
// if the constant was on the left some operators need to be flipped
357-
switch (operatorNodeType)
338+
switch (operatorType)
358339
{
359-
case ExpressionType.LessThan: operatorNodeType = ExpressionType.GreaterThan; break;
360-
case ExpressionType.LessThanOrEqual: operatorNodeType = ExpressionType.GreaterThanOrEqual; break;
361-
case ExpressionType.GreaterThan: operatorNodeType = ExpressionType.LessThan; break;
362-
case ExpressionType.GreaterThanOrEqual: operatorNodeType = ExpressionType.LessThanOrEqual; break;
340+
case ExpressionType.LessThan: operatorType = ExpressionType.GreaterThan; break;
341+
case ExpressionType.LessThanOrEqual: operatorType = ExpressionType.GreaterThanOrEqual; break;
342+
case ExpressionType.GreaterThan: operatorType = ExpressionType.LessThan; break;
343+
case ExpressionType.GreaterThanOrEqual: operatorType = ExpressionType.LessThanOrEqual; break;
363344
}
364345
}
365346

@@ -368,6 +349,18 @@ private IMongoQuery BuildComparisonQuery(BinaryExpression binaryExpression)
368349
return null;
369350
}
370351

352+
var query = BuildArrayLengthQuery(variableExpression, operatorType, constantExpression);
353+
if (query != null)
354+
{
355+
return query;
356+
}
357+
358+
query = BuildModQuery(variableExpression, operatorType, constantExpression);
359+
if (query != null)
360+
{
361+
return query;
362+
}
363+
371364
BsonSerializationInfo serializationInfo = null;
372365
var value = constantExpression.Value;
373366

@@ -389,7 +382,7 @@ private IMongoQuery BuildComparisonQuery(BinaryExpression binaryExpression)
389382
if (serializationInfo != null)
390383
{
391384
var serializedValue = SerializeValue(serializationInfo, value);
392-
switch (operatorNodeType)
385+
switch (operatorType)
393386
{
394387
case ExpressionType.Equal: return Query.EQ(serializationInfo.ElementName, serializedValue);
395388
case ExpressionType.GreaterThan: return Query.GT(serializationInfo.ElementName, serializedValue);
@@ -596,18 +589,14 @@ private IMongoQuery BuildMethodCallQuery(MethodCallExpression methodCallExpressi
596589
return null;
597590
}
598591

599-
private IMongoQuery BuildModQuery(BinaryExpression binaryExpression)
592+
private IMongoQuery BuildModQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)
600593
{
601-
// the constant could be on either side
602-
var variableExpression = binaryExpression.Left;
603-
var constantExpression = binaryExpression.Right as ConstantExpression;
604-
if (constantExpression == null)
594+
if (operatorType != ExpressionType.Equal && operatorType != ExpressionType.NotEqual)
605595
{
606-
constantExpression = binaryExpression.Left as ConstantExpression;
607-
variableExpression = binaryExpression.Right;
596+
return null;
608597
}
609598

610-
if (constantExpression == null || constantExpression.Type != typeof(int))
599+
if (constantExpression.Type != typeof(int))
611600
{
612601
return null;
613602
}
@@ -621,7 +610,7 @@ private IMongoQuery BuildModQuery(BinaryExpression binaryExpression)
621610
if (serializationInfo != null && modulusExpression != null)
622611
{
623612
var modulus = ToInt32(modulusExpression);
624-
if (binaryExpression.NodeType == ExpressionType.Equal)
613+
if (operatorType == ExpressionType.Equal)
625614
{
626615
return Query.Mod(serializationInfo.ElementName, modulus, value);
627616
}

0 commit comments

Comments
 (0)