Skip to content

Commit 78ff318

Browse files
committed
refactor: reorganize methods
1 parent f8427b4 commit 78ff318

1 file changed

Lines changed: 58 additions & 61 deletions

File tree

QueryKit/FilterParser.cs

Lines changed: 58 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)