Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -252,23 +252,20 @@ public void SkipNode(OperationPlanContext context, ExecutionNode node)

public bool EnqueueNextNodes(OperationPlanContext context, CancellationToken cancellationToken)
{
_stack.Clear();

if (_ready.Count == 0)
{
return false;
}

var isSorted = true;
var previousId = int.MinValue;
var readyCount = _ready.Count;

foreach (var node in _ready)
{
if ((uint)node.Id < (uint)_remainingDependencies.Length
&& _remainingDependencies[node.Id] == 0)
{
_stack.Push(node);

if (node.Id < previousId)
{
isSorted = false;
Expand All @@ -278,14 +275,47 @@ public bool EnqueueNextNodes(OperationPlanContext context, CancellationToken can
}
}

if (isSorted)
{
var enqueuedAny = false;

for (var i = 0; i < readyCount; i++)
{
var node = _ready[i];

if ((uint)node.Id < (uint)_remainingDependencies.Length
&& _remainingDependencies[node.Id] == 0)
{
StartNode(context, node, cancellationToken);
enqueuedAny = true;
}
}

_ready.Clear();
return enqueuedAny;
}

_stack.Clear();

for (var i = 0; i < readyCount; i++)
{
var node = _ready[i];

if ((uint)node.Id < (uint)_remainingDependencies.Length
&& _remainingDependencies[node.Id] == 0)
{
_stack.Push(node);
}
}

_ready.Clear();

if (_stack.Count == 0)
{
return false;
}

if (!isSorted && _stack.Count > 1)
if (_stack.Count > 1)
{
_stack.Sort(static (a, b) => a.Id.CompareTo(b.Id));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -507,9 +507,9 @@ public ImmutableArray<VariableValues> CreateVariableValueSets(
{
var segment = selectionSet.Segments[i];

foreach (var element in current)
if (segment.Kind is SelectionPathSegmentKind.InlineFragment)
{
if (segment.Kind is SelectionPathSegmentKind.InlineFragment)
foreach (var element in current)
{
if (element.TryGetProperty(IntrospectionFieldNames.TypeNameSpan, out var value)
&& value.ValueKind is JsonValueKind.String
Expand All @@ -518,7 +518,10 @@ public ImmutableArray<VariableValues> CreateVariableValueSets(
next.Add(element);
}
}
else if (segment.Kind is SelectionPathSegmentKind.Field)
}
else if (segment.Kind is SelectionPathSegmentKind.Field)
{
foreach (var element in current)
{
if (!element.TryGetProperty(segment.Name, out var value))
{
Expand Down Expand Up @@ -549,9 +552,7 @@ public ImmutableArray<VariableValues> CreateVariableValueSets(
}
}

var temp = current;
current = next;
next = temp;
(next, current) = (current, next);
next.Clear();

if (current.Count == 0)
Expand Down Expand Up @@ -623,7 +624,7 @@ private ImmutableArray<VariableValues> BuildVariableValueSets(

if (nextIndex > 0)
{
seen ??= new Dictionary<ObjectValueNode, int>(VariableValueComparer.Instance)
seen ??= new Dictionary<ObjectValueNode, int>(elements.Count, VariableValueComparer.Instance)
{
[variableValueSets[0].Values] = 0
};
Expand Down Expand Up @@ -677,24 +678,33 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsSingleRequirementFa
Dictionary<string, int>? seenStrings = null;
List<Path>?[]? additionalPaths = null;
var nextIndex = 0;
var isNonNullRequirement = requirement.Type.Kind is SyntaxKind.NonNullType;

foreach (var result in elements)
for (var i = 0; i < elements.Count; i++)
{
if (!result.TryGetProperty(fieldName, out var value)
|| value.ValueKind is JsonValueKind.Undefined)
var result = elements[i];

if (!result.TryGetProperty(fieldName, out var value))
{
continue;
}

var valueKind = value.ValueKind;

if (valueKind is JsonValueKind.Undefined)
{
continue;
}

if (value.ValueKind is JsonValueKind.Null && requirement.Type.Kind == SyntaxKind.NonNullType)
if (valueKind is JsonValueKind.Null && isNonNullRequirement)
{
continue;
}

variableValueSets ??= new VariableValues[elements.Count];
IValueNode mappedValue;

if (value.ValueKind is JsonValueKind.String)
if (valueKind is JsonValueKind.String)
{
var stringValue = value.AssertString();

Expand All @@ -707,7 +717,7 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsSingleRequirementFa
}

mappedValue = ResultDataMapper.GetStringValueNode(stringValue);
seenStrings ??= new Dictionary<string, int>(StringComparer.Ordinal);
seenStrings ??= new Dictionary<string, int>(elements.Count, StringComparer.Ordinal);
seenStrings[stringValue] = nextIndex;
}
else
Expand All @@ -722,7 +732,7 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsSingleRequirementFa
continue;
}

seen ??= new Dictionary<IValueNode, int>(SingleValueNodeComparer.Instance);
seen ??= new Dictionary<IValueNode, int>(elements.Count, SingleValueNodeComparer.Instance);
seen[mappedValue] = nextIndex;
}

Expand Down Expand Up @@ -766,7 +776,7 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsSingleRequirementSl

if (nextIndex > 0)
{
seen ??= new Dictionary<IValueNode, int>(SingleValueNodeComparer.Instance)
seen ??= new Dictionary<IValueNode, int>(elements.Count, SingleValueNodeComparer.Instance)
{
[variableValueSets[0].Values.Fields[0].Value] = 0
};
Expand Down Expand Up @@ -845,14 +855,14 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsTwoRequirementsFast
continue;
}

var mappedValue1 = ResultDataMapper.MapLeafValue(value1, ref buffer);
var mappedValue2 = ResultDataMapper.MapLeafValue(value2, ref buffer);
var mappedValue1 = MapRequirementLeafValue(value1, ref buffer);
var mappedValue2 = MapRequirementLeafValue(value2, ref buffer);
variableValueSets ??= new VariableValues[elements.Count];
var key = new TwoValueNodeTuple(mappedValue1, mappedValue2);

if (nextIndex > 0)
{
seen ??= new Dictionary<TwoValueNodeTuple, int>(TwoValueNodeTupleComparer.Instance)
seen ??= new Dictionary<TwoValueNodeTuple, int>(elements.Count, TwoValueNodeTupleComparer.Instance)
{
[new TwoValueNodeTuple(
variableValueSets[0].Values.Fields[0].Value,
Expand Down Expand Up @@ -916,7 +926,7 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsTwoRequirementsSlow

if (nextIndex > 0)
{
seen ??= new Dictionary<TwoValueNodeTuple, int>(TwoValueNodeTupleComparer.Instance)
seen ??= new Dictionary<TwoValueNodeTuple, int>(elements.Count, TwoValueNodeTupleComparer.Instance)
{
[new TwoValueNodeTuple(
variableValueSets[0].Values.Fields[0].Value,
Expand Down Expand Up @@ -1015,15 +1025,15 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsThreeRequirementsFa
continue;
}

var mappedValue1 = ResultDataMapper.MapLeafValue(value1, ref buffer);
var mappedValue2 = ResultDataMapper.MapLeafValue(value2, ref buffer);
var mappedValue3 = ResultDataMapper.MapLeafValue(value3, ref buffer);
var mappedValue1 = MapRequirementLeafValue(value1, ref buffer);
var mappedValue2 = MapRequirementLeafValue(value2, ref buffer);
var mappedValue3 = MapRequirementLeafValue(value3, ref buffer);
variableValueSets ??= new VariableValues[elements.Count];
var key = new ThreeValueNodeTuple(mappedValue1, mappedValue2, mappedValue3);

if (nextIndex > 0)
{
seen ??= new Dictionary<ThreeValueNodeTuple, int>(ThreeValueNodeTupleComparer.Instance)
seen ??= new Dictionary<ThreeValueNodeTuple, int>(elements.Count, ThreeValueNodeTupleComparer.Instance)
{
[new ThreeValueNodeTuple(
variableValueSets[0].Values.Fields[0].Value,
Expand Down Expand Up @@ -1099,7 +1109,7 @@ private ImmutableArray<VariableValues> BuildVariableValueSetsThreeRequirementsSl

if (nextIndex > 0)
{
seen ??= new Dictionary<ThreeValueNodeTuple, int>(ThreeValueNodeTupleComparer.Instance)
seen ??= new Dictionary<ThreeValueNodeTuple, int>(elements.Count, ThreeValueNodeTupleComparer.Instance)
{
[new ThreeValueNodeTuple(
variableValueSets[0].Values.Fields[0].Value,
Expand Down Expand Up @@ -1202,6 +1212,14 @@ private static bool TryGetSimpleRequirementFieldName(
return false;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static IValueNode MapRequirementLeafValue(
CompositeResultElement value,
ref PooledArrayWriter? buffer)
=> value.ValueKind is JsonValueKind.String
? ResultDataMapper.GetStringValueNode(value.AssertString())
: ResultDataMapper.MapLeafValue(value, ref buffer);

private static void AppendUnrolledLists(
CompositeResultElement list,
List<CompositeResultElement> destination)
Expand Down Expand Up @@ -1265,14 +1283,10 @@ private static SourceResultElement GetDataElement(SelectionPath sourcePath, Sour

case SelectionPathSegmentKind.InlineFragment:
if (!current.TryGetProperty(IntrospectionFieldNames.TypeNameSpan, out var typeNameProperty)
|| typeNameProperty.ValueKind != JsonValueKind.String)
{
return default;
}

var typeName = typeNameProperty.GetString()!;

if (typeName != segment.Name)
|| typeNameProperty.ValueKind != JsonValueKind.String
|| !typeNameProperty.TextEqualsHelper(
segment.Name,
isPropertyName: false))
{
return default;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ internal static class ResultDataMapper
{
private const int CachedNumericStringMax = 4096;
private static readonly StringValueNode[] s_cachedNumericStrings = CreateCachedNumericStrings();
private static readonly IntValueNode[] s_cachedNumericIntValues = CreateCachedNumericIntValues();

public static IValueNode? Map(
CompositeResultElement result,
Expand Down Expand Up @@ -136,6 +137,11 @@ private static IValueNode ParseLeafValue(
case JsonValueKind.Number:
if (value.TryGetInt64(out var intValue))
{
if ((ulong)intValue <= CachedNumericStringMax)
{
return s_cachedNumericIntValues[(int)intValue];
}

return new IntValueNode(intValue);
}

Expand Down Expand Up @@ -224,6 +230,18 @@ private static StringValueNode[] CreateCachedNumericStrings()
return values;
}

private static IntValueNode[] CreateCachedNumericIntValues()
{
var values = new IntValueNode[CachedNumericStringMax + 1];

for (var i = 0; i < values.Length; i++)
{
values[i] = new IntValueNode(i);
}

return values;
}

private static IValueNode? Visit(ObjectValueSelectionNode node, Context context)
{
var result = context.Result;
Expand Down
Loading
Loading