Skip to content

Commit

Permalink
simplify visitor for easier extension
Browse files Browse the repository at this point in the history
  • Loading branch information
jogibear9988 committed Jul 13, 2023
1 parent e5f595b commit 118a69c
Showing 1 changed file with 34 additions and 60 deletions.
94 changes: 34 additions & 60 deletions Client.Linq/Internal/QueryExpressionTreeVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -190,75 +190,49 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)

if (expression.Method.DeclaringType == typeof(string))
{
if (expression.Method.Name.Equals("ToLower"))
{
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
_expressionParts.Add(new ToLower(part));
return expression;
}
else if (expression.Method.Name.Equals("ToUpper"))
{
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
_expressionParts.Add(new ToUpper(part));
return expression;
}
else if (expression.Method.Name.Equals("Contains"))
{
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
partsCount = _expressionParts.Count;
Visit(expression.Arguments[0]);
var part2 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
_expressionParts.Add(new Contains(part, part2));
return expression;
}
else if (expression.Method.Name.Equals("StartsWith"))
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
IEnumerable<IExpressionPart> part2 = null;
IEnumerable<IExpressionPart> part3 = null;
if (expression.Arguments.Count > 0)
{
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
partsCount = _expressionParts.Count;
Visit(expression.Arguments[0]);
var part2 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
_expressionParts.Add(new StartsWith(part, part2));
return expression;
part2 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
}
else if (expression.Method.Name.Equals("EndsWith"))

if (expression.Arguments.Count > 1)
{
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
partsCount = _expressionParts.Count;
Visit(expression.Arguments[0]);
var part2 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
_expressionParts.Add(new EndsWith(part, part2));
return expression;
Visit(expression.Arguments[1]);
part3 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
}
else if (expression.Method.Name.Equals("Replace"))

switch (expression.Method.Name)
{
_context.QueryAggregator.AddImport("strings");
var partsCount = _expressionParts.Count;
Visit(expression.Object);
var part = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
partsCount = _expressionParts.Count;
Visit(expression.Arguments[0]);
var part2 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
partsCount = _expressionParts.Count;
Visit(expression.Arguments[1]);
var part3 = GetAndRemoveExpressionParts(partsCount, _expressionParts.Count);
_expressionParts.Add(new Replace(part, part2, part3));
return expression;
case "ToLower":
_expressionParts.Add(new ToLower(part));
return expression;
case "ToUpper":
_expressionParts.Add(new ToUpper(part));
return expression;
case "Contains":
_expressionParts.Add(new Contains(part, part2));
return expression;
case "StartsWith":
_expressionParts.Add(new StartsWith(part, part2));
return expression;
case "EndsWith":
_expressionParts.Add(new EndsWith(part, part2));
return expression;
case "Replace":
_expressionParts.Add(new Replace(part, part2, part3));
return expression;
}

throw new NotSupportedException(expression.Method.Name + " of String class is not yet supported.");
}

if (expression.Method.Name.Equals("ToString"))
Expand Down

0 comments on commit 118a69c

Please sign in to comment.