Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,8 @@ private bool DoesTypeApply(NamedTypeNode? typeCondition, IObjectTypeDefinition t

private static bool IsInternal(FieldNode fieldNode)
{
const string isInternal = "fusion__requirement";
const string requirementDirective = "fusion__requirement";
const string emptyDirective = "fusion__empty";
var directives = fieldNode.Directives;

if (directives.Count == 0)
Expand All @@ -347,27 +348,41 @@ private static bool IsInternal(FieldNode fieldNode)

if (directives.Count == 1)
{
return directives[0].Name.Value.Equals(isInternal, StringComparison.Ordinal);
var name = directives[0].Name.Value;
return name.Equals(requirementDirective, StringComparison.Ordinal)
|| name.Equals(emptyDirective, StringComparison.Ordinal);
}

if (directives.Count == 2)
{
return directives[0].Name.Value.Equals(isInternal, StringComparison.Ordinal)
|| directives[1].Name.Value.Equals(isInternal, StringComparison.Ordinal);
var name1 = directives[0].Name.Value;
var name2 = directives[1].Name.Value;
return name1.Equals(requirementDirective, StringComparison.Ordinal)
|| name1.Equals(emptyDirective, StringComparison.Ordinal)
|| name2.Equals(requirementDirective, StringComparison.Ordinal)
|| name2.Equals(emptyDirective, StringComparison.Ordinal);
}

if (directives.Count == 3)
{
return directives[0].Name.Value.Equals(isInternal, StringComparison.Ordinal)
|| directives[1].Name.Value.Equals(isInternal, StringComparison.Ordinal)
|| directives[2].Name.Value.Equals(isInternal, StringComparison.Ordinal);
var name1 = directives[0].Name.Value;
var name2 = directives[1].Name.Value;
var name3 = directives[2].Name.Value;
return name1.Equals(requirementDirective, StringComparison.Ordinal)
|| name1.Equals(emptyDirective, StringComparison.Ordinal)
|| name2.Equals(requirementDirective, StringComparison.Ordinal)
|| name2.Equals(emptyDirective, StringComparison.Ordinal)
|| name3.Equals(requirementDirective, StringComparison.Ordinal)
|| name3.Equals(emptyDirective, StringComparison.Ordinal);
}

for (var i = 0; i < directives.Count; i++)
{
var directive = directives[i];
var name = directive.Name.Value;

if (directive.Name.Value.Equals(isInternal, StringComparison.Ordinal))
if (name.Equals(requirementDirective, StringComparison.Ordinal)
|| name.Equals(emptyDirective, StringComparison.Ordinal))
{
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Immutable;
using HotChocolate.Fusion.Planning.Partitioners;

namespace HotChocolate.Fusion.Planning;

Expand Down Expand Up @@ -52,7 +53,7 @@ public Backlog Pop(out WorkItem workItem)
/// their own operation steps on other schemas.
/// </summary>
public Backlog PushUnresolvable(
ImmutableStack<SelectionSet> unresolvable,
ImmutableStack<ConditionedSelectionSet> unresolvable,
string fromSchema,
int parentDepth)
{
Expand All @@ -63,16 +64,18 @@ public Backlog PushUnresolvable(

var backlog = this;

foreach (var selectionSet in unresolvable.Reverse())
foreach (var entry in unresolvable.Reverse())
{
var selectionSet = entry.SelectionSet;
var workItem = new OperationWorkItem(
selectionSet.Path.IsRoot
? OperationWorkItemKind.Root
: OperationWorkItemKind.Lookup,
selectionSet,
FromSchema: fromSchema)
{
ParentDepth = parentDepth
ParentDepth = parentDepth,
Conditions = entry.Conditions
};
backlog = backlog.Push(workItem);
}
Expand All @@ -85,7 +88,7 @@ public Backlog PushUnresolvable(
/// which may need lookup steps to satisfy.
/// </summary>
public Backlog PushRequirements(
ImmutableStack<FieldSelection> fieldsWithRequirements,
ImmutableStack<ConditionedFieldSelection> fieldsWithRequirements,
int stepId,
int parentDepth)
{
Expand All @@ -96,11 +99,12 @@ public Backlog PushRequirements(

var backlog = this;

foreach (var selection in fieldsWithRequirements.Reverse())
foreach (var entry in fieldsWithRequirements.Reverse())
{
var workItem = new FieldRequirementWorkItem(selection, stepId)
var workItem = new FieldRequirementWorkItem(entry.FieldSelection, stepId)
{
ParentDepth = parentDepth
ParentDepth = parentDepth,
Conditions = entry.Conditions
};
backlog = backlog.Push(workItem);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using HotChocolate.Fusion.Execution.Nodes;
using HotChocolate.Fusion.Types.Metadata;

namespace HotChocolate.Fusion.Planning;
Expand All @@ -8,6 +9,8 @@ internal sealed record FieldRequirementWorkItem(
Lookup? Lookup = null)
: WorkItem
{
public ExecutionNodeCondition[] Conditions { get; init; } = [];

public int StepIndex => StepId - 1;

public override double Cost => Lookup is null ? 1 : 2;
Expand Down
Loading
Loading