Skip to content

Commit ee644c9

Browse files
authored
Restructured Fusion Projects (#7755)
1 parent 80ecfc3 commit ee644c9

21 files changed

+314
-240
lines changed

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/IOperationNode.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/ISelection.cs

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/InlineFragment.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/Nodes/FieldPlanNode.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
using System.Collections.Immutable;
2+
using System.Diagnostics;
13
using HotChocolate.Fusion.Types;
24
using HotChocolate.Language;
35

4-
namespace HotChocolate.Fusion.Planning;
6+
namespace HotChocolate.Fusion.Planning.Nodes;
57

6-
public class FieldPlanNode : SelectionPlanNode
8+
public sealed class FieldPlanNode : SelectionPlanNode
79
{
10+
private List<ArgumentAssignment>? _arguments;
11+
812
public FieldPlanNode(
913
FieldNode fieldNode,
1014
CompositeOutputField field)
@@ -20,4 +24,24 @@ public FieldPlanNode(
2024
public FieldNode FieldNode { get; }
2125

2226
public CompositeOutputField Field { get; }
27+
28+
public IReadOnlyList<ArgumentAssignment> Arguments
29+
=> _arguments ?? (IReadOnlyList<ArgumentAssignment>)Array.Empty<ArgumentAssignment>();
30+
31+
public void AddArgument(ArgumentAssignment argument)
32+
{
33+
ArgumentNullException.ThrowIfNull(argument);
34+
_arguments ??= [];
35+
_arguments.Add(argument);
36+
}
37+
38+
public FieldNode ToSyntaxNode()
39+
{
40+
return new FieldNode(
41+
new NameNode(Field.Name),
42+
Field.Name.Equals(ResponseName) ? null : new NameNode(ResponseName),
43+
Directives.ToSyntaxNode(),
44+
Arguments.ToSyntaxNode(),
45+
Selections.Count == 0 ? null : Selections.ToSyntaxNode());
46+
}
2347
}

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/Nodes/IOperationPlanNodeProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace HotChocolate.Fusion.Planning;
1+
namespace HotChocolate.Fusion.Planning.Nodes;
22

33
public interface IOperationPlanNodeProvider
44
{
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using HotChocolate.Fusion.Types;
2+
using HotChocolate.Language;
3+
4+
namespace HotChocolate.Fusion.Planning.Nodes;
5+
6+
public sealed class InlineFragmentPlanNode : SelectionPlanNode
7+
{
8+
public InlineFragmentPlanNode(
9+
ICompositeNamedType declaringType,
10+
IReadOnlyList<ISelectionNode> selectionNodes)
11+
: base(declaringType, selectionNodes)
12+
{
13+
}
14+
15+
public InlineFragmentNode ToSyntaxNode()
16+
{
17+
return new InlineFragmentNode(
18+
null,
19+
new NamedTypeNode(DeclaringType.Name),
20+
Directives.ToSyntaxNode(),
21+
Selections.ToSyntaxNode());
22+
}
23+
}

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/Nodes/OperationPlanNode.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using HotChocolate.Fusion.Types;
22
using HotChocolate.Language;
33

4-
namespace HotChocolate.Fusion.Planning;
4+
namespace HotChocolate.Fusion.Planning.Nodes;
55

66
/// <summary>
77
/// Represents an operation to resolve data from a specific source schema.
@@ -34,6 +34,9 @@ public OperationPlanNode(
3434

3535
public string SchemaName { get; }
3636

37+
// todo: variable representations are missing.
38+
// todo: how to we represent state?
39+
3740
public IReadOnlyList<OperationPlanNode> Operations
3841
=> _operations ?? (IReadOnlyList<OperationPlanNode>)Array.Empty<OperationPlanNode>();
3942

@@ -43,4 +46,15 @@ public void AddOperation(OperationPlanNode operation)
4346
(_operations ??= []).Add(operation);
4447
operation.Parent = this;
4548
}
49+
50+
public OperationDefinitionNode ToSyntaxNode()
51+
{
52+
return new OperationDefinitionNode(
53+
null,
54+
null,
55+
OperationType.Query,
56+
Array.Empty<VariableDefinitionNode>(),
57+
Directives.ToSyntaxNode(),
58+
Selections.ToSyntaxNode());
59+
}
4660
}

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/Nodes/PlanNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace HotChocolate.Fusion.Planning;
1+
namespace HotChocolate.Fusion.Planning.Nodes;
22

33
public abstract class PlanNode
44
{

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/Nodes/RootPlanNode.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
namespace HotChocolate.Fusion.Planning;
1+
using System.Collections.Immutable;
2+
using HotChocolate.Language;
23

3-
public class RootPlanNode : PlanNode, IOperationPlanNodeProvider
4+
namespace HotChocolate.Fusion.Planning.Nodes;
5+
6+
public sealed class RootPlanNode : PlanNode, IOperationPlanNodeProvider
47
{
58
private readonly List<OperationPlanNode> _operations = new();
69

@@ -13,4 +16,27 @@ public void AddOperation(OperationPlanNode operation)
1316
_operations.Add(operation);
1417
operation.Parent = this;
1518
}
19+
20+
public DocumentNode ToSyntaxNode()
21+
{
22+
var backlog = new Queue<OperationPlanNode>();
23+
var definitions = ImmutableArray.CreateBuilder<IDefinitionNode>();
24+
25+
foreach(var operation in _operations)
26+
{
27+
backlog.Enqueue(operation);
28+
}
29+
30+
while(backlog.TryDequeue(out var operation))
31+
{
32+
definitions.Add(operation.ToSyntaxNode());
33+
34+
foreach(var child in operation.Operations)
35+
{
36+
backlog.Enqueue(child);
37+
}
38+
}
39+
40+
return new DocumentNode(definitions.ToImmutable());
41+
}
1642
}

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Planning/Nodes/SelectionPlanNode.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using HotChocolate.Fusion.Types;
22
using HotChocolate.Language;
33

4-
namespace HotChocolate.Fusion.Planning;
4+
namespace HotChocolate.Fusion.Planning.Nodes;
55

66
/// <summary>
77
/// The base class for plan nodes that can have child selections.
@@ -65,6 +65,13 @@ public IReadOnlyList<SelectionPlanNode> Selections
6565
public void AddSelection(SelectionPlanNode selection)
6666
{
6767
ArgumentNullException.ThrowIfNull(selection);
68+
69+
if(selection is OperationPlanNode)
70+
{
71+
throw new NotSupportedException(
72+
"An operation cannot be a child of a selection.");
73+
}
74+
6875
(_selections ??= []).Add(selection);
6976
selection.Parent = this;
7077
}

0 commit comments

Comments
 (0)