@@ -22,6 +22,44 @@ public static BooleanExpression Parse(ParserContext context)
2222 case Operator { Character : '=' } :
2323 context . MoveNextRequired ( ) ;
2424 return new EqualityExpression ( left , Expression . Parse ( context ) ) ;
25+ case Operator { Character : '>' } :
26+ if ( context . GetNextRequired ( ) is Operator { Character : '=' } )
27+ {
28+ context . MoveNextRequired ( ) ;
29+ return new GreaterThanOrEqualExpression ( left , Expression . Parse ( context ) ) ;
30+ }
31+ return new GreaterThanExpression ( left , Expression . Parse ( context ) ) ;
32+ case Operator { Character : '<' } :
33+ switch ( context . GetNextRequired ( ) )
34+ {
35+ case Operator { Character : '=' } :
36+ context . MoveNextRequired ( ) ;
37+ return new LessThanOrEqualExpression ( left , Expression . Parse ( context ) ) ;
38+ case Operator { Character : '>' } :
39+ context . MoveNextRequired ( ) ;
40+ return new InequalityExpression ( left , Expression . Parse ( context ) ) ;
41+ }
42+
43+ if ( context . GetNextRequired ( ) is Operator { Character : '=' } )
44+ {
45+ context . MoveNextRequired ( ) ;
46+ return new LessThanOrEqualExpression ( left , Expression . Parse ( context ) ) ;
47+ }
48+ return new LessThanExpression ( left , Expression . Parse ( context ) ) ;
49+ case Operator { Character : '!' } :
50+ switch ( context . GetNextRequired ( ) )
51+ {
52+ case Operator { Character : '=' } :
53+ context . MoveNextRequired ( ) ;
54+ return new InequalityExpression ( left , Expression . Parse ( context ) ) ;
55+ case Operator { Character : '>' } :
56+ context . MoveNextRequired ( ) ;
57+ return new LessThanOrEqualExpression ( left , Expression . Parse ( context ) ) ;
58+ case Operator { Character : '<' } :
59+ context . MoveNextRequired ( ) ;
60+ return new GreaterThanOrEqualExpression ( left , Expression . Parse ( context ) ) ;
61+ }
62+ break ;
2563 }
2664
2765 throw SimulatedSqlException . SyntaxErrorNear ( context ) ;
@@ -45,6 +83,56 @@ public override bool Run(Func<List<string>, DataValue> getColumnValue) =>
4583
4684#if DEBUG
4785 public override string ToString ( ) => $ "{ left } = { right } ";
86+ #endif
87+ }
88+
89+ private sealed class InequalityExpression ( Expression left , Expression right ) : BooleanExpression
90+ {
91+ public override bool Run ( Func < List < string > , DataValue > getColumnValue ) =>
92+ ! ( left . Run ( getColumnValue ) . Value ? . Equals ( right . Run ( getColumnValue ) . Value ) ) . GetValueOrDefault ( ) ;
93+
94+ #if DEBUG
95+ public override string ToString ( ) => $ "{ left } <> { right } ";
96+ #endif
97+ }
98+
99+ private sealed class GreaterThanExpression ( Expression left , Expression right ) : BooleanExpression
100+ {
101+ public override bool Run ( Func < List < string > , DataValue > getColumnValue ) =>
102+ left . Run ( getColumnValue ) . CompareTo ( right . Run ( getColumnValue ) ) > 0 ;
103+
104+ #if DEBUG
105+ public override string ToString ( ) => $ "{ left } > { right } ";
106+ #endif
107+ }
108+
109+ private sealed class GreaterThanOrEqualExpression ( Expression left , Expression right ) : BooleanExpression
110+ {
111+ public override bool Run ( Func < List < string > , DataValue > getColumnValue ) =>
112+ left . Run ( getColumnValue ) . CompareTo ( right . Run ( getColumnValue ) ) >= 0 ;
113+
114+ #if DEBUG
115+ public override string ToString ( ) => $ "{ left } >= { right } ";
116+ #endif
117+ }
118+
119+ private sealed class LessThanExpression ( Expression left , Expression right ) : BooleanExpression
120+ {
121+ public override bool Run ( Func < List < string > , DataValue > getColumnValue ) =>
122+ left . Run ( getColumnValue ) . CompareTo ( right . Run ( getColumnValue ) ) < 0 ;
123+
124+ #if DEBUG
125+ public override string ToString ( ) => $ "{ left } < { right } ";
126+ #endif
127+ }
128+
129+ private sealed class LessThanOrEqualExpression ( Expression left , Expression right ) : BooleanExpression
130+ {
131+ public override bool Run ( Func < List < string > , DataValue > getColumnValue ) =>
132+ left . Run ( getColumnValue ) . CompareTo ( right . Run ( getColumnValue ) ) <= 0 ;
133+
134+ #if DEBUG
135+ public override string ToString ( ) => $ "{ left } <= { right } ";
48136#endif
49137 }
50138}
0 commit comments