diff --git a/src/HotChocolate/Stitching/src/Stitching/Delegation/ScopedVariables/ArgumentScopedVariableResolver.cs b/src/HotChocolate/Stitching/src/Stitching/Delegation/ScopedVariables/ArgumentScopedVariableResolver.cs index 7c7d5eafcdc..4d66fde462d 100644 --- a/src/HotChocolate/Stitching/src/Stitching/Delegation/ScopedVariables/ArgumentScopedVariableResolver.cs +++ b/src/HotChocolate/Stitching/src/Stitching/Delegation/ScopedVariables/ArgumentScopedVariableResolver.cs @@ -2,7 +2,6 @@ using System.Linq; using HotChocolate.Language; using HotChocolate.Resolvers; -using HotChocolate.Stitching.Properties; using HotChocolate.Types; using HotChocolate.Utilities; using static HotChocolate.Stitching.ThrowHelper; diff --git a/src/HotChocolate/Stitching/src/Stitching/Directives/ScopedVariableNode.cs b/src/HotChocolate/Stitching/src/Stitching/Directives/ScopedVariableNode.cs index e978533c8e6..1a3b60d864c 100644 --- a/src/HotChocolate/Stitching/src/Stitching/Directives/ScopedVariableNode.cs +++ b/src/HotChocolate/Stitching/src/Stitching/Directives/ScopedVariableNode.cs @@ -177,7 +177,7 @@ public VariableNode ToVariableNode() public string ToVariableName() { - return Scope.Value + "_" + Name.Value; + return "__" + Scope.Value + "_" + Name.Value; } } } diff --git a/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestHelper.cs b/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestHelper.cs index b2ba4018b6a..0cdeb1eca00 100644 --- a/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestHelper.cs +++ b/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestHelper.cs @@ -13,12 +13,11 @@ namespace HotChocolate.Stitching.Requests internal class MergeRequestHelper { public static IEnumerable<(IQueryRequest, IEnumerable)> MergeRequests( - IEnumerable requests, - ISet requestVariableNames) + IEnumerable requests) { foreach (var group in requests.GroupBy(t => t.Operation.Operation)) { - var rewriter = new MergeRequestRewriter(requestVariableNames); + var rewriter = new MergeRequestRewriter(); var variableValues = new Dictionary(); var operationName = group @@ -36,7 +35,7 @@ internal class MergeRequestHelper BufferedRequest first = null!; foreach (BufferedRequest request in group) { - first = request; + first ??= request; MergeRequest(request, rewriter, variableValues, $"__{i++}_"); } diff --git a/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestRewriter.cs b/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestRewriter.cs index a967701ba7b..b0923cbfc3f 100644 --- a/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestRewriter.cs +++ b/src/HotChocolate/Stitching/src/Stitching/Requests/MergeRequestRewriter.cs @@ -14,7 +14,6 @@ internal class MergeRequestRewriter : QuerySyntaxRewriter new Dictionary(); private readonly Dictionary _fragments = new Dictionary(); - private readonly ISet _globalVariableNames; private Dictionary? _aliases; private NameString _requestPrefix; @@ -22,16 +21,6 @@ internal class MergeRequestRewriter : QuerySyntaxRewriter private OperationType? _operationType; private NameNode? _operationName; - public MergeRequestRewriter(ISet globalVariableNames) - { - _globalVariableNames = globalVariableNames ?? - throw new ArgumentNullException(nameof(globalVariableNames)); - } - - private bool IsAutoGenerated => !_rewriteFragments; - - public NameNode OperationName => _operationName ?? _defaultName; - public void SetOperationName(NameNode name) => _operationName = name; public IDictionary AddQuery( @@ -50,8 +39,7 @@ public MergeRequestRewriter(ISet globalVariableNames) OperationDefinitionNode operation = BufferedRequest.ResolveOperation(rewritten, request.Request.OperationName); - foreach (VariableDefinitionNode variable in - operation.VariableDefinitions) + foreach (VariableDefinitionNode variable in operation.VariableDefinitions) { if (!_variables.ContainsKey(variable.Variable.Name.Value)) { @@ -94,14 +82,9 @@ public DocumentNode Merge() } protected override VariableDefinitionNode RewriteVariableDefinition( - VariableDefinitionNode node, bool context) - { - return IsAutoGenerated - && _globalVariableNames.Contains(node.Variable.Name.Value) - ? node - : node.WithVariable(node.Variable.WithName( - node.Variable.Name.CreateNewName(_requestPrefix))); - } + VariableDefinitionNode node, bool context) => + node.WithVariable(node.Variable.WithName( + node.Variable.Name.CreateNewName(_requestPrefix))); protected override FieldNode RewriteField(FieldNode node, bool first) { @@ -129,30 +112,21 @@ protected override FieldNode RewriteField(FieldNode node, bool first) } protected override FragmentSpreadNode RewriteFragmentSpread( - FragmentSpreadNode node, bool first) - { - return _rewriteFragments + FragmentSpreadNode node, bool first) => + _rewriteFragments ? node.WithName(node.Name.CreateNewName(_requestPrefix)) : node; - } protected override FragmentDefinitionNode RewriteFragmentDefinition( - FragmentDefinitionNode node, bool first) - { - return _rewriteFragments + FragmentDefinitionNode node, bool first) => + _rewriteFragments ? base.RewriteFragmentDefinition( node.WithName(node.Name.CreateNewName(_requestPrefix)), false) : base.RewriteFragmentDefinition(node, false); - } protected override VariableNode RewriteVariable( - VariableNode node, bool first) - { - return IsAutoGenerated - && _globalVariableNames.Contains(node.Name.Value) - ? node - : node.WithName(node.Name.CreateNewName(_requestPrefix)); - } + VariableNode node, bool first) => + node.WithName(node.Name.CreateNewName(_requestPrefix)); } } diff --git a/src/HotChocolate/Stitching/src/Stitching/Requests/RemoteRequestExecutor.cs b/src/HotChocolate/Stitching/src/Stitching/Requests/RemoteRequestExecutor.cs index 60ceb03a2c4..ebf45e445f1 100644 --- a/src/HotChocolate/Stitching/src/Stitching/Requests/RemoteRequestExecutor.cs +++ b/src/HotChocolate/Stitching/src/Stitching/Requests/RemoteRequestExecutor.cs @@ -1,11 +1,9 @@ using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using GreenDonut; using HotChocolate.Execution; -using static HotChocolate.Stitching.WellKnownContextData; namespace HotChocolate.Stitching.Requests { @@ -13,25 +11,20 @@ internal sealed class RemoteRequestExecutor : IRemoteRequestExecutor , IDisposable { - private static readonly HashSet _empty = new HashSet(); private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); private readonly List _bufferedRequests = new List(); private readonly IBatchScheduler _batchScheduler; private readonly IRequestExecutor _executor; - private readonly IRequestContextAccessor _requestContextAccessor; private bool _taskRegistered; public RemoteRequestExecutor( IBatchScheduler batchScheduler, - IRequestExecutor executor, - IRequestContextAccessor requestContextAccessor) + IRequestExecutor executor) { _batchScheduler = batchScheduler ?? throw new ArgumentNullException(nameof(batchScheduler)); _executor = executor ?? throw new ArgumentNullException(nameof(executor)); - _requestContextAccessor = requestContextAccessor ?? - throw new ArgumentNullException(nameof(requestContextAccessor)); } /// @@ -122,7 +115,7 @@ private async ValueTask ExecuteRequestsInternal(CancellationToken cancellationTo // we however have to group requests by operation type. This means we should // end up with one or two requests (query and mutation). foreach ((IQueryRequest Merged, IEnumerable Requests) batch in - MergeRequestHelper.MergeRequests(_bufferedRequests, GetRequestVariableNames())) + MergeRequestHelper.MergeRequests(_bufferedRequests)) { // now we take this merged request and run it against the executor. IExecutionResult result = await _executor @@ -148,32 +141,6 @@ private async ValueTask ExecuteRequestsInternal(CancellationToken cancellationTo } } - private ISet GetRequestVariableNames() - { - IRequestContext context = _requestContextAccessor.RequestContext; - - if (context.ContextData is ConcurrentDictionary optimized) - { - return (ISet)optimized.GetOrAdd(RequestVarNames, key => - { - if (context.Request.VariableValues is { Count: > 0 } variables) - { - return new HashSet(variables.Keys); - } - return _empty; - })!; - } - - if(!context.ContextData.TryGetValue(RequestVarNames, out object? value)) - { - value = context.Request.VariableValues is { Count: > 0 } variables - ? new HashSet(variables.Keys) - : _empty; - } - - return (ISet)value!; - } - public void Dispose() { _semaphore.Dispose(); diff --git a/src/HotChocolate/Stitching/src/Stitching/Requests/StitchingContext.cs b/src/HotChocolate/Stitching/src/Stitching/Requests/StitchingContext.cs index c239b21dc99..15813c763d8 100644 --- a/src/HotChocolate/Stitching/src/Stitching/Requests/StitchingContext.cs +++ b/src/HotChocolate/Stitching/src/Stitching/Requests/StitchingContext.cs @@ -33,8 +33,7 @@ public class StitchingContext : IStitchingContext executor.Key, new RemoteRequestExecutor( batchScheduler, - executor.Value, - requestContextAccessor)); + executor.Value)); } } diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ArgumentScopedVariableResolverTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ArgumentScopedVariableResolverTests.cs index 9fdcfbb7955..74bddeeb781 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ArgumentScopedVariableResolverTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ArgumentScopedVariableResolverTests.cs @@ -43,7 +43,7 @@ public void CreateVariableValue() // assert Assert.Equal("bar", Assert.IsType(value.DefaultValue).Value); - Assert.Equal("arguments_a", value.Name); + Assert.Equal("__arguments_a", value.Name); Assert.Equal("String", Assert.IsType(value.Type).Name.Value); Assert.Equal("baz", value.Value.Value); } diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ContextDataScopedVariableResolverTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ContextDataScopedVariableResolverTests.cs index 5fbf8ef48dc..ae442c16d96 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ContextDataScopedVariableResolverTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ContextDataScopedVariableResolverTests.cs @@ -43,7 +43,7 @@ public void CreateVariableValue() // assert Assert.Null(value.DefaultValue); - Assert.Equal("contextData_a", value.Name); + Assert.Equal("__contextData_a", value.Name); Assert.Equal("String", Assert.IsType(value.Type).Name.Value); Assert.Equal("AbcDef", value.Value.Value); } @@ -79,7 +79,7 @@ public void ContextDataEntryDoesNotExist() // assert Assert.Null(value.DefaultValue); - Assert.Equal("contextData_a", value.Name); + Assert.Equal("__contextData_a", value.Name); Assert.Equal("String", Assert.IsType(value.Type).Name.Value); Assert.Equal(NullValueNode.Default, value.Value); } diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/FieldScopedVariableResolverTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/FieldScopedVariableResolverTests.cs index baa80821cf1..c26253d6245 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/FieldScopedVariableResolverTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/FieldScopedVariableResolverTests.cs @@ -45,7 +45,7 @@ public void CreateVariableValue() // assert Assert.Null(value.DefaultValue); - Assert.Equal("fields_a", value.Name); + Assert.Equal("__fields_a", value.Name); Assert.IsType(value.Type); Assert.Equal("baz", value.Value.Value); } diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/RemoteQueryBuilderTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/RemoteQueryBuilderTests.cs index d3267f76657..08b6669be2f 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/RemoteQueryBuilderTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/RemoteQueryBuilderTests.cs @@ -38,13 +38,12 @@ public void BuildRemoteQuery() .SelectionSet.Selections .OfType().Single(); - // act DocumentNode newQuery = RemoteQueryBuilder.New() .SetOperation(null, OperationType.Query) .SetSelectionPath(path) .SetRequestField(field) - .AddVariable("fields_bar", new NamedTypeNode(null, new NameNode("String"))) + .AddVariable("__fields_bar", new NamedTypeNode(null, new NameNode("String"))) .Build("abc", new Dictionary<(NameString Type, NameString Schema), NameString>()); // assert @@ -88,7 +87,7 @@ public void BuildRemoteQueryCanOverrideOperationName() OperationType.Query) .SetSelectionPath(path) .SetRequestField(field) - .AddVariable("fields_bar", new NamedTypeNode(null, new NameNode("String"))) + .AddVariable("__fields_bar", new NamedTypeNode(null, new NameNode("String"))) .Build("abc", new Dictionary<(NameString Type, NameString Schema), NameString>()); // assert diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ScopedContextDataScopedVariableResolverTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ScopedContextDataScopedVariableResolverTests.cs index 52209fdd37e..560ae3e0dd0 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ScopedContextDataScopedVariableResolverTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/ScopedContextDataScopedVariableResolverTests.cs @@ -43,9 +43,9 @@ public void CreateVariableValue() // assert Assert.Null(value.DefaultValue); - Assert.Equal("scopedContextData_a", value.Name); + Assert.Equal("__scopedContextData_a", value.Name); Assert.Equal("String", Assert.IsType(value.Type).Name.Value); - Assert.Equal("AbcDef", value.Value.Value); + Assert.Equal("AbcDef", value.Value!.Value); } [Fact] @@ -60,7 +60,8 @@ public void ContextDataEntryDoesNotExist() c.Options.StrictValidation = false; }); - var contextData = ImmutableDictionary.Empty; + ImmutableDictionary contextData = + ImmutableDictionary.Empty; var context = new Mock(MockBehavior.Strict); context.SetupGet(t => t.ScopedContextData).Returns(contextData); @@ -79,7 +80,7 @@ public void ContextDataEntryDoesNotExist() // assert Assert.Null(value.DefaultValue); - Assert.Equal("scopedContextData_a", value.Name); + Assert.Equal("__scopedContextData_a", value.Name); Assert.Equal("String", Assert.IsType(value.Type).Name.Value); Assert.Equal(NullValueNode.Default, value.Value); } @@ -104,13 +105,13 @@ public void ContextIsNull() // act var resolver = new ScopedContextDataScopedVariableResolver(); - Action a = () => resolver.Resolve( - null, + void Action() => resolver.Resolve( + null!, scopedVariable, schema.GetType("String")); // assert - Assert.Equal("context", Assert.Throws(a).ParamName); + Assert.Equal("context", Assert.Throws(Action).ParamName); } [Fact] @@ -129,27 +130,19 @@ public void ScopedVariableIsNull() // act var resolver = new ScopedContextDataScopedVariableResolver(); - Action a = () => resolver.Resolve( + void Action() => resolver.Resolve( context.Object, - null, + null!, schema.GetType("String")); // assert - Assert.Equal("variable", Assert.Throws(a).ParamName); + Assert.Equal("variable", Assert.Throws(Action).ParamName); } [Fact] public void TargetTypeIsNull() { // arrange - var schema = Schema.Create( - "type Query { foo(a: String = \"bar\") : String }", - c => - { - c.Use(next => context => default); - c.Options.StrictValidation = false; - }); - var context = new Mock(); var scopedVariable = new ScopedVariableNode( @@ -159,13 +152,13 @@ public void TargetTypeIsNull() // act var resolver = new ScopedContextDataScopedVariableResolver(); - Action a = () => resolver.Resolve( + void Action() => resolver.Resolve( context.Object, scopedVariable, - null); + null!); // assert - Assert.Equal("targetType", Assert.Throws(a).ParamName); + Assert.Equal("targetType", Assert.Throws(Action).ParamName); } [Fact] @@ -189,13 +182,13 @@ public void InvalidScope() // act var resolver = new ScopedContextDataScopedVariableResolver(); - Action a = () => resolver.Resolve( + void Action() => resolver.Resolve( context.Object, scopedVariable, schema.GetType("String")); // assert - Assert.Equal("variable", Assert.Throws(a).ParamName); + Assert.Equal("variable", Assert.Throws(Action).ParamName); } } } diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQuery.snap b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQuery.snap index f063c248f29..0b072409d62 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQuery.snap +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQuery.snap @@ -1,8 +1,8 @@ -query fetch($fields_bar: String) { +query fetch($__fields_bar: String) { a { b { c { - bar: d(a: $fields_bar) { + bar: d(a: $__fields_bar) { baz { ... on Baz { qux diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQueryCanOverrideOperationName.snap b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQueryCanOverrideOperationName.snap index 7e1eb537c77..1aadab04595 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQueryCanOverrideOperationName.snap +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Delegation/__snapshots__/RemoteQueryBuilderTests.BuildRemoteQueryCanOverrideOperationName.snap @@ -1,8 +1,8 @@ -query BuildRemoteQueryCanOverrideOperationName($fields_bar: String) { +query BuildRemoteQueryCanOverrideOperationName($__fields_bar: String) { a { b { c { - bar: d(a: $fields_bar) { + bar: d(a: $__fields_bar) { baz { ... on Baz { qux diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Integration/BaseTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Integration/BaseTests.cs index ff6b28bbfa9..f92a4cdef67 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Integration/BaseTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Integration/BaseTests.cs @@ -1,15 +1,14 @@ -using System; +using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using HotChocolate.Execution; +using HotChocolate.Language; +using HotChocolate.Resolvers; using HotChocolate.Tests; +using HotChocolate.Types; using Snapshooter.Xunit; using Xunit; -using System.Collections.Generic; -using HotChocolate.Resolvers; -using HotChocolate.Types; -using HotChocolate.Language; namespace HotChocolate.Stitching.Integration { diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/MergeRequestHelperTests.cs b/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/MergeRequestHelperTests.cs index 456fff15da2..671a3f5db47 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/MergeRequestHelperTests.cs +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/MergeRequestHelperTests.cs @@ -23,8 +23,6 @@ public async Task Create_BufferedRequest() .AddCustomerSchema() .BuildSchemaAsync(); - var variableNames = new HashSet { "id" }; - var queryA = "query abc($id: ID) { customer(id: $id) { name } }"; var queryB = "query abc($id: ID) { customer(id: $id) { id } }"; @@ -46,8 +44,7 @@ public async Task Create_BufferedRequest() // act IEnumerable<(IQueryRequest, IEnumerable)> mergeResult = MergeRequestHelper.MergeRequests( - new[] { bufferedRequestA, bufferedRequestB }, - variableNames); + new[] { bufferedRequestA, bufferedRequestB }); // assert string.Join(Environment.NewLine + "-------" + Environment.NewLine, @@ -67,8 +64,6 @@ public async Task Create_BufferedRequest_AutoGenerated() .AddCustomerSchema() .BuildSchemaAsync(); - var variableNames = new HashSet { "id" }; - var queryA = "query abc($id: ID) { customer(id: $id) { name } }"; var queryB = "query abc($id: ID) { customer(id: $id) { id } }"; @@ -92,8 +87,7 @@ public async Task Create_BufferedRequest_AutoGenerated() // act IEnumerable<(IQueryRequest, IEnumerable)> mergeResult = MergeRequestHelper.MergeRequests( - new[] { bufferedRequestA, bufferedRequestB }, - variableNames); + new[] { bufferedRequestA, bufferedRequestB }); // assert string.Join(Environment.NewLine + "-------" + Environment.NewLine, @@ -113,8 +107,6 @@ public async Task Create_BufferedRequest_With_Mixed_Operations() .AddCustomerSchema() .BuildSchemaAsync(); - var variableNames = new HashSet { "id" }; - var queryA = "query abc($id: ID) { customer(id: $id) { name } }"; var queryB = "query abc($id: ID) { customer(id: $id) { id } }"; var queryC = "mutation { createCustomer(input: { name: \"a\" }) { customer { id } } }"; @@ -147,8 +139,7 @@ public async Task Create_BufferedRequest_With_Mixed_Operations() bufferedRequestA, bufferedRequestB, bufferedRequestC - }, - variableNames); + }); // assert string.Join(Environment.NewLine + "-------" + Environment.NewLine, diff --git a/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/__snapshots__/MergeRequestHelperTests.Create_BufferedRequest_AutoGenerated.snap b/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/__snapshots__/MergeRequestHelperTests.Create_BufferedRequest_AutoGenerated.snap index 81ebc8d5e9d..aac799030ef 100644 --- a/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/__snapshots__/MergeRequestHelperTests.Create_BufferedRequest_AutoGenerated.snap +++ b/src/HotChocolate/Stitching/test/Stitching.Tests/Requests/__snapshots__/MergeRequestHelperTests.Create_BufferedRequest_AutoGenerated.snap @@ -1,8 +1,8 @@ -query exec_batch($id: ID) { - __0__customer: customer(id: $id) { +query exec_batch($__0__id: ID, $__1__id: ID) { + __0__customer: customer(id: $__0__id) { name } - __1__customer: customer(id: $id) { + __1__customer: customer(id: $__1__id) { id } }