@@ -52,68 +52,9 @@ from rest in Parse.LetterOrDigit.XOr(Parse.Char('_')).Many()
5252 . Or ( Parse . String ( ComparisonOperator . InOperator ( ) . Operator ( ) ) . Text ( ) )
5353 . SelectMany ( op => Parse . Char ( ComparisonOperator . CaseSensitiveAppendix ) . Optional ( ) , ( op , caseInsensitive ) => new { op , caseInsensitive } )
5454 . Select ( x => ComparisonOperator . GetByOperatorString ( x . op , x . caseInsensitive . IsDefined ) ) ;
55-
56- private static Parser < Expression > ComparisonExprParser < T > ( ParameterExpression parameter , IQueryKitConfiguration ? config )
57- {
58- var comparisonOperatorParser = ComparisonOperatorParser . Token ( ) ;
59- var rightSideValueParser = RightSideValueParser . Token ( ) ;
60-
61- return CreateLeftExprParser ( parameter , config )
62- . SelectMany ( leftExpr => comparisonOperatorParser , ( leftExpr , op ) => new { leftExpr , op } )
63- . SelectMany ( temp => rightSideValueParser , ( temp , right ) => new { temp . leftExpr , temp . op , right } )
64- . Select ( temp =>
65- {
66- if ( temp . leftExpr . NodeType == ExpressionType . Constant && ( ( ConstantExpression ) temp . leftExpr ) . Value ! . Equals ( true ) )
67- {
68- return Expression . Equal ( Expression . Constant ( true ) , Expression . Constant ( true ) ) ;
69- }
70-
71- var rightExpr = CreateRightExpr ( temp . leftExpr , temp . right ) ;
72- return temp . op . GetExpression < T > ( temp . leftExpr , rightExpr ) ;
73- } ) ;
74- }
75-
76- private static Parser < Expression ? > ? CreateLeftExprParser ( ParameterExpression parameter , IQueryKitConfiguration ? config )
77- {
78- var leftIdentifierParser = Identifier . DelimitedBy ( Parse . Char ( '.' ) ) . Token ( ) ;
79-
80- return leftIdentifierParser ? . Select ( left =>
81- {
82- var leftList = left . ToList ( ) ;
83-
84- var fullPropPath = leftList ? . First ( ) ;
85- var propertyExpression = leftList ? . Aggregate ( ( Expression ) parameter , ( expr , propName ) =>
86- {
87- var propertyInfo = GetPropertyInfo ( expr . Type , propName ) ;
88- var actualPropertyName = propertyInfo ? . Name ?? propName ;
89- try
90- {
91- return Expression . PropertyOrField ( expr , actualPropertyName ) ;
92- }
93- catch ( ArgumentException )
94- {
95- if ( config ? . AllowUnknownProperties == true )
96- {
97- return Expression . Constant ( true , typeof ( bool ) ) ;
98- }
99- throw new UnknownFilterPropertyException ( actualPropertyName ) ;
100- }
101- } ) ;
102-
103- var propertyConfig = config ? . PropertyMappings ? . GetPropertyInfo ( fullPropPath ) ;
104- if ( propertyConfig != null && ! propertyConfig . CanFilter )
105- {
106- return Expression . Constant ( true , typeof ( bool ) ) ;
107- }
108-
109- return propertyExpression ;
110- } ) ;
111- }
11255
11356 private static PropertyInfo ? GetPropertyInfo ( Type type , string propertyName )
114- {
115- return type . GetProperty ( propertyName , BindingFlags . IgnoreCase | BindingFlags . Public | BindingFlags . Instance ) ;
116- }
57+ => type . GetProperty ( propertyName , BindingFlags . IgnoreCase | BindingFlags . Public | BindingFlags . Instance ) ;
11758
11859 public static Parser < LogicalOperator > LogicalOperatorParser =>
11960 from leadingSpaces in Parse . WhiteSpace . Many ( )
@@ -124,7 +65,6 @@ from trailingSpaces in Parse.WhiteSpace.Many()
12465 private static Parser < string > DoubleQuoteParser
12566 => Parse . Char ( '"' ) . Then ( _ => Parse . AnyChar . Except ( Parse . Char ( '"' ) ) . Many ( ) . Text ( ) . Then ( innerValue => Parse . Char ( '"' ) . Return ( innerValue ) ) ) ;
12667
127-
12868 private static Parser < string > TimeFormatParser => Parse . Regex ( @"\d{2}:\d{2}:\d{2}" ) . Text ( ) ;
12969 private static Parser < string > DateTimeFormatParser =>
13070 from dateFormat in Parse . Regex ( @"\d{4}-\d{2}-\d{2}" ) . Text ( )
@@ -255,6 +195,63 @@ private static Type TransformTargetTypeIfNullable(Type targetType)
255195 return targetType ;
256196 }
257197
198+ private static Parser < Expression > ComparisonExprParser < T > ( ParameterExpression parameter , IQueryKitConfiguration ? config )
199+ {
200+ var comparisonOperatorParser = ComparisonOperatorParser . Token ( ) ;
201+ var rightSideValueParser = RightSideValueParser . Token ( ) ;
202+
203+ return CreateLeftExprParser ( parameter , config )
204+ . SelectMany ( leftExpr => comparisonOperatorParser , ( leftExpr , op ) => new { leftExpr , op } )
205+ . SelectMany ( temp => rightSideValueParser , ( temp , right ) => new { temp . leftExpr , temp . op , right } )
206+ . Select ( temp =>
207+ {
208+ if ( temp . leftExpr . NodeType == ExpressionType . Constant && ( ( ConstantExpression ) temp . leftExpr ) . Value ! . Equals ( true ) )
209+ {
210+ return Expression . Equal ( Expression . Constant ( true ) , Expression . Constant ( true ) ) ;
211+ }
212+
213+ var rightExpr = CreateRightExpr ( temp . leftExpr , temp . right ) ;
214+ return temp . op . GetExpression < T > ( temp . leftExpr , rightExpr ) ;
215+ } ) ;
216+ }
217+
218+ private static Parser < Expression ? > ? CreateLeftExprParser ( ParameterExpression parameter , IQueryKitConfiguration ? config )
219+ {
220+ var leftIdentifierParser = Identifier . DelimitedBy ( Parse . Char ( '.' ) ) . Token ( ) ;
221+
222+ return leftIdentifierParser ? . Select ( left =>
223+ {
224+ var leftList = left . ToList ( ) ;
225+
226+ var fullPropPath = leftList ? . First ( ) ;
227+ var propertyExpression = leftList ? . Aggregate ( ( Expression ) parameter , ( expr , propName ) =>
228+ {
229+ var propertyInfo = GetPropertyInfo ( expr . Type , propName ) ;
230+ var actualPropertyName = propertyInfo ? . Name ?? propName ;
231+ try
232+ {
233+ return Expression . PropertyOrField ( expr , actualPropertyName ) ;
234+ }
235+ catch ( ArgumentException )
236+ {
237+ if ( config ? . AllowUnknownProperties == true )
238+ {
239+ return Expression . Constant ( true , typeof ( bool ) ) ;
240+ }
241+ throw new UnknownFilterPropertyException ( actualPropertyName ) ;
242+ }
243+ } ) ;
244+
245+ var propertyConfig = config ? . PropertyMappings ? . GetPropertyInfo ( fullPropPath ) ;
246+ if ( propertyConfig != null && ! propertyConfig . CanFilter )
247+ {
248+ return Expression . Constant ( true , typeof ( bool ) ) ;
249+ }
250+
251+ return propertyExpression ;
252+ } ) ;
253+ }
254+
258255 private static Parser < Expression > AtomicExprParser < T > ( ParameterExpression parameter ,
259256 IQueryKitConfiguration ? config = null )
260257 => ComparisonExprParser < T > ( parameter , config )
0 commit comments