Skip to content

Commit 75fa450

Browse files
committed
feat: more condition handling
1 parent f0203d5 commit 75fa450

1 file changed

Lines changed: 130 additions & 9 deletions

File tree

QueryKit/QueryKitPropertyMappings.cs

Lines changed: 130 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,6 @@ public string ReplaceAliasesWithPropertyPaths(string input)
7070
}
7171
}
7272

73-
// foreach (var alias in _derivedPropertyMappings.Values)
74-
// {
75-
// foreach (var op in operators)
76-
// {
77-
// // Use regular expression to isolate left side of the expression
78-
// var regex = new Regex($@"\b{alias.QueryName}\b(?=\s*{op})", RegexOptions.IgnoreCase);
79-
// input = regex.Replace(input, $"~||~||~{alias.QueryName}");
80-
// }
81-
// }
8273
return input;
8374
}
8475

@@ -126,6 +117,10 @@ private static string GetFullPropertyPath(Expression? expression)
126117
case ExpressionType.GreaterThanOrEqual:
127118
case ExpressionType.LessThanOrEqual:
128119
case ExpressionType.Equal:
120+
case ExpressionType.NotEqual:
121+
case ExpressionType.AddChecked:
122+
case ExpressionType.MultiplyChecked:
123+
case ExpressionType.SubtractChecked:
129124
var binary = (BinaryExpression)expression;
130125
var left = GetFullPropertyPath(binary.Left);
131126
var right = GetFullPropertyPath(binary.Right);
@@ -134,6 +129,132 @@ private static string GetFullPropertyPath(Expression? expression)
134129
case ExpressionType.Constant:
135130
var constant = (ConstantExpression)expression;
136131
return constant.Value?.ToString() ?? "";
132+
133+
case ExpressionType.Conditional:
134+
var conditional = (ConditionalExpression)expression;
135+
var test = GetFullPropertyPath(conditional.Test);
136+
var ifTrue = GetFullPropertyPath(conditional.IfTrue);
137+
var ifFalse = GetFullPropertyPath(conditional.IfFalse);
138+
return $"({test}) ? ({ifTrue}) : ({ifFalse})";
139+
140+
case ExpressionType.New:
141+
var newExpression = (NewExpression)expression;
142+
var arguments = newExpression.Arguments.Select(GetFullPropertyPath);
143+
return $"{newExpression.Constructor.DeclaringType.Name}({string.Join(", ", arguments)})";
144+
145+
case ExpressionType.Invoke:
146+
var invocation = (InvocationExpression)expression;
147+
var invocationArguments = invocation.Arguments.Select(GetFullPropertyPath);
148+
return $"{GetFullPropertyPath(invocation.Expression)}({string.Join(", ", invocationArguments)})";
149+
150+
case ExpressionType.ListInit:
151+
var listInit = (ListInitExpression)expression;
152+
var newExpr = GetFullPropertyPath(listInit.NewExpression);
153+
var initializers = listInit.Initializers.Select(init => string.Join(", ", init.Arguments.Select(GetFullPropertyPath)));
154+
return $"{newExpr} {{ {string.Join(", ", initializers)} }}";
155+
156+
case ExpressionType.MemberInit:
157+
var memberInit = (MemberInitExpression)expression;
158+
var newExpressionPath = GetFullPropertyPath(memberInit.NewExpression);
159+
var bindings = memberInit.Bindings.Select(binding => $"{binding.Member.Name} = {GetFullPropertyPath(((MemberAssignment)binding).Expression)}");
160+
return $"{newExpressionPath} {{ {string.Join(", ", bindings)} }}";
161+
162+
163+
case ExpressionType.ArrayLength:
164+
var unaryArrayLength = (UnaryExpression)expression;
165+
return $"Length({GetFullPropertyPath(unaryArrayLength.Operand)})";
166+
167+
case ExpressionType.ArrayIndex:
168+
var binaryArrayIndex = (BinaryExpression)expression;
169+
return $"{GetFullPropertyPath(binaryArrayIndex.Left)}[{GetFullPropertyPath(binaryArrayIndex.Right)}]";
170+
171+
case ExpressionType.TypeAs:
172+
case ExpressionType.TypeIs:
173+
var typeBinary = (TypeBinaryExpression)expression;
174+
return $"{GetFullPropertyPath(typeBinary.Expression)} is {typeBinary.TypeOperand.Name}";
175+
176+
case ExpressionType.Coalesce:
177+
var binaryCoalesce = (BinaryExpression)expression;
178+
return $"{GetFullPropertyPath(binaryCoalesce.Left)} ?? {GetFullPropertyPath(binaryCoalesce.Right)}";
179+
180+
case ExpressionType.Block:
181+
var block = (BlockExpression)expression;
182+
var blockExpressions = block.Expressions.Select(GetFullPropertyPath);
183+
return $"{{ {string.Join("; ", blockExpressions)} }}";
184+
185+
case ExpressionType.Throw:
186+
var unaryThrow = (UnaryExpression)expression;
187+
return $"throw {GetFullPropertyPath(unaryThrow.Operand)}";
188+
189+
case ExpressionType.Try:
190+
var tryExpression = (TryExpression)expression;
191+
var body = GetFullPropertyPath(tryExpression.Body);
192+
var handlers = string.Join(" ", tryExpression.Handlers.Select(handler => $"catch ({handler.Test.Name}) {{ {GetFullPropertyPath(handler.Body)} }}"));
193+
var @finally = tryExpression.Finally != null ? $"finally {{ {GetFullPropertyPath(tryExpression.Finally)} }}" : "";
194+
return $"try {{ {body} }} {handlers} {@finally}";
195+
196+
case ExpressionType.Index:
197+
var index = (IndexExpression)expression;
198+
var objectPath = GetFullPropertyPath(index.Object);
199+
var argumentsPath = string.Join(", ", index.Arguments.Select(GetFullPropertyPath));
200+
return $"{objectPath}[{argumentsPath}]";
201+
202+
case ExpressionType.NewArrayInit:
203+
var newArrayInit = (NewArrayExpression)expression;
204+
var arrayInitElements = newArrayInit.Expressions.Select(GetFullPropertyPath);
205+
return $"new {newArrayInit.Type.GetElementType().Name}[] {{ {string.Join(", ", arrayInitElements)} }}";
206+
207+
case ExpressionType.NewArrayBounds:
208+
var newArrayBounds = (NewArrayExpression)expression;
209+
var arrayBounds = newArrayBounds.Expressions.Select(GetFullPropertyPath);
210+
return $"new {newArrayBounds.Type.GetElementType().Name}[{string.Join(", ", arrayBounds)}]";
211+
212+
case ExpressionType.ConvertChecked:
213+
case ExpressionType.ExclusiveOr:
214+
case ExpressionType.LeftShift:
215+
case ExpressionType.Negate:
216+
case ExpressionType.UnaryPlus:
217+
case ExpressionType.NegateChecked:
218+
case ExpressionType.Not:
219+
case ExpressionType.Parameter:
220+
case ExpressionType.Power:
221+
case ExpressionType.Quote:
222+
case ExpressionType.RightShift:
223+
case ExpressionType.Assign:
224+
case ExpressionType.DebugInfo:
225+
case ExpressionType.Decrement:
226+
case ExpressionType.Dynamic:
227+
case ExpressionType.Default:
228+
case ExpressionType.Extension:
229+
case ExpressionType.Goto:
230+
case ExpressionType.Increment:
231+
case ExpressionType.Label:
232+
case ExpressionType.RuntimeVariables:
233+
case ExpressionType.Loop:
234+
case ExpressionType.Switch:
235+
case ExpressionType.Unbox:
236+
case ExpressionType.AddAssign:
237+
case ExpressionType.AndAssign:
238+
case ExpressionType.DivideAssign:
239+
case ExpressionType.ExclusiveOrAssign:
240+
case ExpressionType.LeftShiftAssign:
241+
case ExpressionType.ModuloAssign:
242+
case ExpressionType.MultiplyAssign:
243+
case ExpressionType.OrAssign:
244+
case ExpressionType.PowerAssign:
245+
case ExpressionType.RightShiftAssign:
246+
case ExpressionType.SubtractAssign:
247+
case ExpressionType.AddAssignChecked:
248+
case ExpressionType.MultiplyAssignChecked:
249+
case ExpressionType.SubtractAssignChecked:
250+
case ExpressionType.PreIncrementAssign:
251+
case ExpressionType.PreDecrementAssign:
252+
case ExpressionType.PostIncrementAssign:
253+
case ExpressionType.PostDecrementAssign:
254+
case ExpressionType.TypeEqual:
255+
case ExpressionType.OnesComplement:
256+
case ExpressionType.IsTrue:
257+
case ExpressionType.IsFalse:
137258
default:
138259
throw new NotSupportedException($"Expression type '{expression.NodeType}' is not supported.");
139260
}

0 commit comments

Comments
 (0)