Skip to content

Commit 68d0d64

Browse files
committed
PartialIndexFilterBuilder:Fixed operations to rewrite enums
1 parent 3613fc4 commit 68d0d64

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

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

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -46,31 +46,33 @@ public static void BuildFilter(IndexInfo index)
4646

4747
protected override Expression VisitBinary(BinaryExpression b)
4848
{
49-
if (b.Left.StripCasts().Type.StripNullable().IsEnum
50-
&& b.Right.StripCasts().NodeType == ExpressionType.Constant) {
51-
52-
var rawEnum = b.Left.StripCasts();
53-
var typeToCast = (rawEnum.Type.IsNullable())
54-
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
55-
: rawEnum.Type.GetEnumUnderlyingType();
56-
57-
return base.VisitBinary(Expression.MakeBinary(
58-
b.NodeType,
59-
Expression.Convert(rawEnum, typeToCast),
60-
Expression.Convert(b.Right, typeToCast)));
61-
}
62-
else if (b.Right.StripCasts().Type.StripNullable().IsEnum
63-
&& b.Left.StripCasts().NodeType == ExpressionType.Constant) {
64-
65-
var rawEnum = b.Right.StripCasts();
66-
var typeToCast = (rawEnum.Type.IsNullable())
67-
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
68-
: rawEnum.Type.GetEnumUnderlyingType();
69-
70-
return base.VisitBinary(Expression.MakeBinary(
71-
b.NodeType,
72-
Expression.Convert(rawEnum, typeToCast),
73-
Expression.Convert(b.Left, typeToCast)));
49+
if (EnumRewritableOperations(b)) {
50+
if (b.Left.StripCasts().Type.StripNullable().IsEnum
51+
&& b.Right.StripCasts().NodeType == ExpressionType.Constant) {
52+
53+
var rawEnum = b.Left.StripCasts();
54+
var typeToCast = (rawEnum.Type.IsNullable())
55+
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
56+
: rawEnum.Type.GetEnumUnderlyingType();
57+
58+
return base.VisitBinary(Expression.MakeBinary(
59+
b.NodeType,
60+
Expression.Convert(rawEnum, typeToCast),
61+
Expression.Convert(b.Right, typeToCast)));
62+
}
63+
else if (b.Right.StripCasts().Type.StripNullable().IsEnum
64+
&& b.Left.StripCasts().NodeType == ExpressionType.Constant) {
65+
66+
var rawEnum = b.Right.StripCasts();
67+
var typeToCast = (rawEnum.Type.IsNullable())
68+
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
69+
: rawEnum.Type.GetEnumUnderlyingType();
70+
71+
return base.VisitBinary(Expression.MakeBinary(
72+
b.NodeType,
73+
Expression.Convert(rawEnum, typeToCast),
74+
Expression.Convert(b.Left, typeToCast)));
75+
}
7476
}
7577

7678
// Detect f!=null and f==null for entity fields
@@ -81,13 +83,19 @@ protected override Expression VisitBinary(BinaryExpression b)
8183
var left = Visit(b.Left);
8284
var right = Visit(b.Right);
8385

84-
FieldInfo field;
85-
if (entityAccessMap.TryGetValue(left, out field) && IsNull(right))
86+
if (entityAccessMap.TryGetValue(left, out var field) && IsNull(right))
8687
return BuildEntityCheck(field, b.NodeType);
8788
if (entityAccessMap.TryGetValue(right, out field) && IsNull(left))
8889
return BuildEntityCheck(field, b.NodeType);
8990

9091
return base.VisitBinary(b);
92+
93+
static bool EnumRewritableOperations(BinaryExpression b)
94+
{
95+
return b.NodeType.In(ExpressionType.Equal, ExpressionType.NotEqual,
96+
ExpressionType.GreaterThan, ExpressionType.GreaterThanOrEqual,
97+
ExpressionType.LessThan, ExpressionType.LessThanOrEqual);
98+
}
9199
}
92100

93101
protected override Expression VisitMemberAccess(MemberExpression originalMemberAccess)

0 commit comments

Comments
 (0)