Skip to content

Commit 98882b2

Browse files
committed
Translator.Expressions: less wasted operations
+ renames in PartialIndexFilterBuilder
1 parent da2efc9 commit 98882b2

File tree

2 files changed

+41
-37
lines changed

2 files changed

+41
-37
lines changed

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,29 @@ public static void BuildFilter(IndexInfo index)
4747
protected override Expression VisitBinary(BinaryExpression b)
4848
{
4949
if (EnumRewritableOperations(b)) {
50-
var rawLeft = b.Left.StripCasts();
51-
var rawLeftType = rawLeft.Type.StripNullable();
52-
var rawRight = b.Right.StripCasts();
53-
var rawRightType = rawRight.Type.StripNullable();
50+
var bareLeft = b.Left.StripCasts();
51+
var bareLeftType = bareLeft.Type.StripNullable();
52+
var bareRight = b.Right.StripCasts();
53+
var bareRightType = bareRight.Type.StripNullable();
5454

55-
if (rawLeftType.IsEnum && rawRight.NodeType == ExpressionType.Constant) {
56-
var typeToCast = rawLeft.Type.IsNullable()
57-
? rawLeftType.GetEnumUnderlyingType().ToNullable()
58-
: rawLeft.Type.GetEnumUnderlyingType();
55+
if (bareLeftType.IsEnum && bareRight.NodeType == ExpressionType.Constant) {
56+
var typeToCast = bareLeft.Type.IsNullable()
57+
? bareLeftType.GetEnumUnderlyingType().ToNullable()
58+
: bareLeft.Type.GetEnumUnderlyingType();
5959

6060
return base.VisitBinary(Expression.MakeBinary(
6161
b.NodeType,
62-
Expression.Convert(rawLeft, typeToCast),
62+
Expression.Convert(bareLeft, typeToCast),
6363
Expression.Convert(b.Right, typeToCast)));
6464
}
65-
else if (rawRightType.IsEnum && rawLeft.NodeType == ExpressionType.Constant) {
66-
var typeToCast = rawRight.Type.IsNullable()
67-
? rawRightType.GetEnumUnderlyingType().ToNullable()
68-
: rawRight.Type.GetEnumUnderlyingType();
65+
else if (bareRightType.IsEnum && bareLeft.NodeType == ExpressionType.Constant) {
66+
var typeToCast = bareRight.Type.IsNullable()
67+
? bareRightType.GetEnumUnderlyingType().ToNullable()
68+
: bareRight.Type.GetEnumUnderlyingType();
6969

7070
return base.VisitBinary(Expression.MakeBinary(
7171
b.NodeType,
72-
Expression.Convert(rawRight, typeToCast),
72+
Expression.Convert(bareRight, typeToCast),
7373
Expression.Convert(b.Left, typeToCast)));
7474
}
7575
}

Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -207,29 +207,33 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
207207
right = Visit(binaryExpression.Right);
208208
}
209209
}
210-
// Following two checks for enums are here to improve result query
211-
// performance because they let not to cast columns to integer.
212-
else if (EnumRewritableOperations(binaryExpression)
213-
&& binaryExpression.Left.StripCasts() is var rawLeft1 && rawLeft1.Type.StripNullable().IsEnum
214-
&& binaryExpression.Right.StripCasts() is var rawRight1 && rawRight1.NodeType == ExpressionType.Constant) {
215-
var rawEnum = rawLeft1;
216-
217-
var typeToCast = (rawEnum.Type.IsNullable())
218-
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
219-
: rawEnum.Type.GetEnumUnderlyingType();
220-
left = Visit(Expression.Convert(rawEnum, typeToCast));
221-
right = Visit(Expression.Convert(binaryExpression.Right, typeToCast));
222-
}
223-
else if (EnumRewritableOperations(binaryExpression)
224-
&& binaryExpression.Right.StripCasts() is var rawRight2 && rawRight2.Type.StripNullable().IsEnum
225-
&& binaryExpression.Left.StripCasts() is var rawLeft2 && rawLeft2.NodeType == ExpressionType.Constant) {
226-
var rawEnum = rawRight2;
227-
228-
var typeToCast = (rawEnum.Type.IsNullable())
229-
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
230-
: rawEnum.Type.GetEnumUnderlyingType();
231-
left = Visit(Expression.Convert(rawEnum, typeToCast));
232-
right = Visit(Expression.Convert(binaryExpression.Left, typeToCast));
210+
else if (EnumRewritableOperations(binaryExpression)) {
211+
// Following two checks for enums are here to improve result query
212+
// performance because they let not to cast columns to integer.
213+
214+
var bareLeft = binaryExpression.Left.StripCasts();
215+
var bareLeftType = bareLeft.Type.StripNullable();
216+
var bareRight = binaryExpression.Right.StripCasts();
217+
var bareRightType = bareRight.Type.StripNullable();
218+
219+
if (bareLeftType.IsEnum && bareRight.NodeType == ExpressionType.Constant) {
220+
var typeToCast = bareLeft.Type.IsNullable()
221+
? bareLeftType.GetEnumUnderlyingType().ToNullable()
222+
: bareLeft.Type.GetEnumUnderlyingType();
223+
left = Visit(Expression.Convert(bareLeft, typeToCast));
224+
right = Visit(Expression.Convert(binaryExpression.Right, typeToCast));
225+
}
226+
else if (bareRightType.IsEnum && bareLeft.NodeType == ExpressionType.Constant) {
227+
var typeToCast = (bareRight.Type.IsNullable())
228+
? bareRightType.GetEnumUnderlyingType().ToNullable()
229+
: bareRight.Type.GetEnumUnderlyingType();
230+
left = Visit(Expression.Convert(bareRight, typeToCast));
231+
right = Visit(Expression.Convert(binaryExpression.Left, typeToCast));
232+
}
233+
else {
234+
left = Visit(binaryExpression.Left);
235+
right = Visit(binaryExpression.Right);
236+
}
233237
}
234238
else {
235239
left = Visit(binaryExpression.Left);

0 commit comments

Comments
 (0)