Skip to content

Commit ea0f70e

Browse files
authored
Optimization: avoid redundant entityAccessMap.TryGetValue() invocations (#337)
* Optimization: avoid redundant `entityAccessMap.TryGetValue()` * Fix () * nodeType
1 parent cfa9916 commit ea0f70e

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

Orm/Xtensive.Orm/Orm/Building/Builders/PartialIndexFilterBuilder.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public static void BuildFilter(IndexInfo index)
4949

5050
protected override Expression VisitBinary(BinaryExpression b)
5151
{
52-
if (EnumRewritableOperations(b)) {
52+
var nodeType = b.NodeType;
53+
if (EnumRewritableOperations(nodeType)) {
5354
var leftNoCasts = b.Left.StripCasts();
5455
var leftNoCastsType = leftNoCasts.Type;
5556
var bareLeftType = leftNoCastsType.StripNullable();
@@ -63,7 +64,7 @@ protected override Expression VisitBinary(BinaryExpression b)
6364
: leftNoCastsType.GetEnumUnderlyingType();
6465

6566
return base.VisitBinary(Expression.MakeBinary(
66-
b.NodeType,
67+
nodeType,
6768
Expression.Convert(leftNoCasts, typeToCast),
6869
Expression.Convert(b.Right, typeToCast)));
6970
}
@@ -73,31 +74,30 @@ protected override Expression VisitBinary(BinaryExpression b)
7374
: rightNoCastsType.GetEnumUnderlyingType();
7475

7576
return base.VisitBinary(Expression.MakeBinary(
76-
b.NodeType,
77+
nodeType,
7778
Expression.Convert(rightNoCasts, typeToCast),
7879
Expression.Convert(b.Left, typeToCast)));
7980
}
8081
}
8182

8283
// Detect f!=null and f==null for entity fields
8384

84-
if (!(b.NodeType is ExpressionType.Equal or ExpressionType.NotEqual))
85-
return base.VisitBinary(b);
86-
87-
var left = Visit(b.Left);
88-
var right = Visit(b.Right);
89-
90-
if (entityAccessMap.TryGetValue(left, out var field) && IsNull(right))
91-
return BuildEntityCheck(field, b.NodeType);
92-
if (entityAccessMap.TryGetValue(right, out field) && IsNull(left))
93-
return BuildEntityCheck(field, b.NodeType);
94-
if (entityAccessMap.TryGetValue(left, out var _) && entityAccessMap.TryGetValue(right, out var _))
95-
throw UnableToTranslate(b, Strings.ComparisonOfTwoEntityFieldsIsNotSupported);
85+
if (nodeType is ExpressionType.Equal or ExpressionType.NotEqual) {
86+
var left = Visit(b.Left);
87+
var right = Visit(b.Right);
9688

89+
bool hasLeftField, hasRightField;
90+
if ((hasLeftField = entityAccessMap.TryGetValue(left, out var field)) && IsNull(right)
91+
|| (hasRightField = entityAccessMap.TryGetValue(right, out field)) && IsNull(left)) {
92+
return BuildEntityCheck(field, nodeType);
93+
}
94+
if (hasLeftField && hasRightField)
95+
throw UnableToTranslate(b, Strings.ComparisonOfTwoEntityFieldsIsNotSupported);
96+
}
9797
return base.VisitBinary(b);
9898

99-
static bool EnumRewritableOperations(BinaryExpression b) =>
100-
b.NodeType is ExpressionType.Equal or ExpressionType.NotEqual or ExpressionType.GreaterThan or ExpressionType.GreaterThanOrEqual
99+
static bool EnumRewritableOperations(ExpressionType nodeType) =>
100+
nodeType is ExpressionType.Equal or ExpressionType.NotEqual or ExpressionType.GreaterThan or ExpressionType.GreaterThanOrEqual
101101
or ExpressionType.LessThan or ExpressionType.LessThanOrEqual;
102102
}
103103

0 commit comments

Comments
 (0)