Skip to content

Rewrite expression parser #53

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Mar 19, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Fiex include top node
  • Loading branch information
joadan committed Mar 19, 2025
commit 59583721a4de7c06e84406f78c8e9529f4b087c6
11 changes: 11 additions & 0 deletions src/Linq2GraphQL.Client/GraphBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,17 @@ public GraphBase(GraphClient client, string name, OperationType operationType, L

public QueryNode QueryNode { get; }


/// <summary>
/// Include top node
/// </summary>
/// <returns></returns>
public TGraph Include()
{
QueryNode.IncludePrimitive = true;
return (TGraph)(object)this;
}

public TGraph Include<TProperty>(Expression<Func<T, TProperty>> path)
{
Utilities.ParseExpression(path, QueryNode);
Expand Down
3 changes: 1 addition & 2 deletions src/Linq2GraphQL.Client/Utilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ public static void ParseExpression(Expression body, QueryNode parent)
{
var parameterVisitor = new ParameterVisitor(new MemberNode(null, null));
var topNode = parameterVisitor.ParseExpression(body);
var tree = topNode.PrintMemberTree();


topNode.PopulateChildQueryNodes(parent);

}
Expand Down
6 changes: 2 additions & 4 deletions src/Linq2GraphQL.Client/Visitors/MemberNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@

namespace Linq2GraphQL.Client.Visitors
{
public class MemberNode(MemberInfo memberInfo, List<ArgumentValue> arguments = null, ParameterExpression parameterExpression = null)
internal class MemberNode(MemberInfo memberInfo, List<ArgumentValue> arguments = null, ParameterExpression parameterExpression = null)
{

public string ParameterName => parameterExpression?.Name;

public MemberInfo MemberInfo => memberInfo;
Expand Down Expand Up @@ -67,15 +66,14 @@ private static List<MemberInfo> GetMembers(Expression expression)
members.Add(memberExpression.Member);
members.AddRange(GetMembers(memberExpression.Expression));
}

return members;
}

public void PopulateChildQueryNodes(QueryNode queryNode)
{
foreach (var child in Children)
{

var childNode = new QueryNode(child.MemberInfo, null, child.Arguments);
childNode.IncludePrimitive = child.Children.Count == 0;
var addedNode = queryNode.AddChildNode(childNode);
Expand Down
29 changes: 24 additions & 5 deletions src/Linq2GraphQL.Client/Visitors/ParameterVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Linq2GraphQL.Client.Visitors
{
public class ParameterVisitor(MemberNode memberNode) : ExpressionVisitor
internal class ParameterVisitor(MemberNode memberNode) : ExpressionVisitor
{

public MemberNode ParseExpression(Expression expression)
Expand Down Expand Up @@ -52,9 +52,7 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)
{
var arg = expression.Arguments[i];
var v = GetArgumentValue(arg);

argumentValues.Add(new ArgumentValue(graphQLArgumentAttribute.GraphQLName, graphQLArgumentAttribute.GraphQLType, GetArgumentValue(arg)));

}
i++;
}
Expand All @@ -74,11 +72,9 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)
if (attr != null)
{
var parameter = GetParameterExpression(expression.Arguments[1]);

var child = memberNode.AddMembers(memberExp);
child.SetParameterExpression(parameter);


var visitor = new ParameterVisitor(child);
visitor.ParseExpression(expression.Arguments[1]);
return expression;
Expand All @@ -88,6 +84,29 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)
return base.VisitMethodCall(expression);
}



protected override Expression VisitLambda<T>(Expression<T> node)
{
var newExp = node.Body as NewExpression;
return base.VisitLambda(node);
}

//protected override Expression VisitNew(NewExpression node)
//{

// if (memberNode.ParameterName != null && node.Arguments.Any(e=> e.NodeType == ExpressionType.Parameter))
// {



// }


// return base.VisitNew(node);
//}


private static object GetArgumentValue(Expression element)
{
if (element is ConstantExpression)
Expand Down
12 changes: 5 additions & 7 deletions test/Linq2GraphQL.Tests/QueryProjectionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,23 +67,21 @@ public async Task Project_SelectMany()

}


[Fact]
public async Task Project_Complex()
public async Task Project_TopLevelAllPrimitive()
{


var query = sampleClient
.Query
.Customers()
.Select(e => new { Customers = e, Orders = e.SelectMany(e=> e.Orders) });
.Include()
.Select(e => new { Customers = e, Orders = e.SelectMany(f => f.Orders) });

var request = await query.GetRequestAsync();

var result = await query.ExecuteAsync();

var t = result.Customers.All(e => e.CustomerId != default);

Assert.True(result.Customers.All(e => e.CustomerId != default));

}
Expand Down