Skip to content

Commit b7c0e4a

Browse files
committed
Modify test to avoid simplification
1 parent 6ba1bab commit b7c0e4a

File tree

5 files changed

+58
-15
lines changed

5 files changed

+58
-15
lines changed

Diff for: src/EFCore.Cosmos/Query/Internal/SqlExpressionFactory.cs

+31-4
Original file line numberDiff line numberDiff line change
@@ -685,10 +685,37 @@ public virtual SqlExpression Condition(SqlExpression test, SqlExpression ifTrue,
685685
{
686686
var typeMapping = ExpressionExtensions.InferTypeMapping(ifTrue, ifFalse);
687687

688-
return new SqlConditionalExpression(
689-
ApplyTypeMapping(test, _boolTypeMapping),
690-
ApplyTypeMapping(ifTrue, typeMapping),
691-
ApplyTypeMapping(ifFalse, typeMapping));
688+
test = ApplyTypeMapping(test, _boolTypeMapping);
689+
ifTrue = ApplyTypeMapping(ifTrue, typeMapping);
690+
ifFalse = ApplyTypeMapping(ifFalse, typeMapping);
691+
692+
// Simplify:
693+
// a == b ? b : a -> a
694+
// a != b ? a : b -> a
695+
if (test is SqlBinaryExpression
696+
{
697+
OperatorType: ExpressionType.Equal or ExpressionType.NotEqual,
698+
Left: var left,
699+
Right: var right
700+
} binary)
701+
{
702+
// Reverse ifEqual/ifNotEqual for ExpressionType.NotEqual for easier reasoning below
703+
var (ifEqual, ifNotEqual) = binary.OperatorType is ExpressionType.Equal ? (ifTrue, ifFalse) : (ifFalse, ifTrue);
704+
705+
// a == b ? b : a -> a
706+
if (left.Equals(ifNotEqual) && right.Equals(ifEqual))
707+
{
708+
return left;
709+
}
710+
711+
// b == a ? b : a -> a
712+
if (right.Equals(ifNotEqual) && left.Equals(ifEqual))
713+
{
714+
return right;
715+
}
716+
}
717+
718+
return new SqlConditionalExpression(test, ifTrue, ifFalse);
692719
}
693720

694721
/// <summary>

Diff for: src/EFCore.Relational/Query/SqlExpressionFactory.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -835,13 +835,16 @@ public virtual SqlExpression Case(
835835
&& typeMappedWhenClauses is
836836
[
837837
{
838-
Test: SqlBinaryExpression { OperatorType: ExpressionType.Equal or ExpressionType.NotEqual } binary,
838+
Test: SqlBinaryExpression
839+
{
840+
OperatorType: ExpressionType.Equal or ExpressionType.NotEqual,
841+
Left: var left,
842+
Right: var right
843+
} binary,
839844
Result: var result
840845
}
841846
])
842847
{
843-
var (left, right) = (binary.Left, binary.Right);
844-
845848
// Reverse ifEqual/ifNotEqual for ExpressionType.NotEqual for easier reasoning below
846849
var (ifEqual, ifNotEqual) = binary.OperatorType is ExpressionType.Equal
847850
? (result, elseResult ?? Constant(null, result.Type, result.TypeMapping))

Diff for: test/EFCore.Cosmos.FunctionalTests/Query/Translations/OperatorTranslationsCosmosTest.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ public override Task Conditional_simplifiable_equality(bool async)
1919
{
2020
await base.Conditional_simplifiable_equality(a);
2121

22-
// TODO: Simplify this away, as per #35327 for relational
2322
AssertSql(
2423
"""
2524
SELECT VALUE c
2625
FROM root c
27-
WHERE (((c["Int"] = 9) ? 9 : c["Int"]) > 1)
26+
WHERE (c["Int"] > 1)
2827
""");
2928
});
3029

@@ -34,12 +33,11 @@ public override Task Conditional_simplifiable_inequality(bool async)
3433
{
3534
await base.Conditional_simplifiable_inequality(a);
3635

37-
// TODO: Simplify this away, as per #35327 for relational
3836
AssertSql(
3937
"""
4038
SELECT VALUE c
4139
FROM root c
42-
WHERE (((c["Int"] != 8) ? c["Int"] : 8) > 1)
40+
WHERE (c["Int"] > 1)
4341
""");
4442
});
4543

Diff for: test/EFCore.Relational.Specification.Tests/Query/NullSemanticsQueryTestBase.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ public virtual Task Where_equal_with_conditional(bool async)
753753
ss => ss.Set<NullSemanticsEntity1>().Where(
754754
e => (e.NullableStringA == e.NullableStringB
755755
? e.NullableStringA
756-
: e.NullableStringB)
756+
: e.NullableStringC)
757757
== e.NullableStringC).Select(e => e.Id));
758758

759759
[ConditionalTheory]
@@ -765,7 +765,7 @@ public virtual Task Where_not_equal_with_conditional(bool async)
765765
e => e.NullableStringC
766766
!= (e.NullableStringA == e.NullableStringB
767767
? e.NullableStringA
768-
: e.NullableStringB)).Select(e => e.Id));
768+
: e.NullableStringC)).Select(e => e.Id));
769769

770770
[ConditionalTheory]
771771
[MemberData(nameof(IsAsyncData))]

Diff for: test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs

+17-2
Original file line numberDiff line numberDiff line change
@@ -2205,7 +2205,13 @@ public override async Task Where_equal_with_conditional(bool async)
22052205
"""
22062206
SELECT [e].[Id]
22072207
FROM [Entities1] AS [e]
2208-
WHERE [e].[NullableStringB] = [e].[NullableStringC] OR ([e].[NullableStringB] IS NULL AND [e].[NullableStringC] IS NULL)
2208+
WHERE CASE
2209+
WHEN [e].[NullableStringA] = [e].[NullableStringB] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA]
2210+
ELSE [e].[NullableStringC]
2211+
END = [e].[NullableStringC] OR (CASE
2212+
WHEN [e].[NullableStringA] = [e].[NullableStringB] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA]
2213+
ELSE [e].[NullableStringC]
2214+
END IS NULL AND [e].[NullableStringC] IS NULL)
22092215
""");
22102216
}
22112217

@@ -2217,7 +2223,16 @@ public override async Task Where_not_equal_with_conditional(bool async)
22172223
"""
22182224
SELECT [e].[Id]
22192225
FROM [Entities1] AS [e]
2220-
WHERE ([e].[NullableStringC] <> [e].[NullableStringB] OR [e].[NullableStringC] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringC] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL)
2226+
WHERE ([e].[NullableStringC] <> CASE
2227+
WHEN [e].[NullableStringA] = [e].[NullableStringB] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA]
2228+
ELSE [e].[NullableStringC]
2229+
END OR [e].[NullableStringC] IS NULL OR CASE
2230+
WHEN [e].[NullableStringA] = [e].[NullableStringB] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA]
2231+
ELSE [e].[NullableStringC]
2232+
END IS NULL) AND ([e].[NullableStringC] IS NOT NULL OR CASE
2233+
WHEN [e].[NullableStringA] = [e].[NullableStringB] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA]
2234+
ELSE [e].[NullableStringC]
2235+
END IS NOT NULL)
22212236
""");
22222237
}
22232238

0 commit comments

Comments
 (0)