44// Created by: Denis Krjuchkov
55// Created: 2009.08.17
66
7+ using System . Collections . Generic ;
78using System . Linq ;
89using Xtensive . Reflection ;
910using Xtensive . Sql ;
@@ -13,46 +14,36 @@ namespace Xtensive.Orm.Providers
1314{
1415 internal sealed class BooleanExpressionConverter
1516 {
17+ private static readonly object IntToBooleanTag = new ( ) ;
18+ private static readonly object BooleanToIntTag = new ( ) ;
19+
1620 private readonly SqlValueType booleanType ;
1721
1822 public SqlExpression IntToBoolean ( SqlExpression expression )
1923 {
2024 // optimization: omitting IntToBoolean(BooleanToInt(x)) sequences
21- if ( expression . NodeType == SqlNodeType . Cast ) {
22- var operand = ( ( SqlCast ) expression ) . Operand ;
23- if ( operand . NodeType == SqlNodeType . Case ) {
24- var _case = ( SqlCase ) operand ;
25- if ( _case . Count == 1 ) {
26- var firstCaseItem = _case . First ( ) ;
27- var whenTrue = firstCaseItem . Value as SqlLiteral < int > ;
28- var whenFalse = _case . Else as SqlLiteral < int > ;
29- if ( ! ReferenceEquals ( whenTrue , null )
30- && ! ReferenceEquals ( whenFalse , null )
31- && whenTrue . Value == 1
32- && whenFalse . Value == 0 )
33- return firstCaseItem . Key ;
34- }
35- }
25+ if ( expression . NodeType == SqlNodeType . Metadata &&
26+ expression is SqlMetadata metadata &&
27+ metadata . Value == BooleanToIntTag ) {
28+ return ( ( SqlCase ) ( ( SqlCast ) metadata . Expression ) . Operand ) . First ( ) . Key ;
3629 }
3730
38- return SqlDml . Equals ( expression , 1 ) ;
31+ return SqlDml . Metadata ( SqlDml . Equals ( expression , 1 ) , IntToBooleanTag ) ;
3932 }
4033
4134 public SqlExpression BooleanToInt ( SqlExpression expression )
4235 {
4336 // optimization: omitting BooleanToInt(IntToBoolean(x)) sequences
44- if ( expression . NodeType == SqlNodeType . Equals ) {
45- var binary = ( SqlBinary ) expression ;
46- var left = binary . Left ;
47- var right = binary . Right as SqlLiteral < int > ;
48- if ( ! ReferenceEquals ( right , null ) && right . Value == 1 )
49- return left ;
37+ if ( expression . NodeType == SqlNodeType . Metadata &&
38+ expression is SqlMetadata metadata &&
39+ metadata . Value == IntToBooleanTag ) {
40+ return ( ( SqlBinary ) metadata . Expression ) . Left ;
5041 }
5142
5243 var result = SqlDml . Case ( ) ;
5344 result . Add ( expression , 1 ) ;
5445 result . Else = 0 ;
55- return SqlDml . Cast ( result , booleanType ) ;
46+ return SqlDml . Metadata ( SqlDml . Cast ( result , booleanType ) , BooleanToIntTag ) ;
5647 }
5748
5849 public BooleanExpressionConverter ( StorageDriver driver )
0 commit comments