public async Task Create_BufferedRequest_Rewrite_Variables_To_Literals() { // arrange ISchema schema = await new ServiceCollection() .AddGraphQL() .AddCustomerSchema() .BuildSchemaAsync(); var query = "query abc($id: ID) { customer(id: $id) { name } }"; IQueryRequest request = QueryRequestBuilder.New() .SetQuery(query) .SetVariableValue("id", 1) .Create(); // act var bufferedRequest = BufferedRequest.Create(request, schema); // assert Assert.NotEqual(request, bufferedRequest.Request); Assert.Collection(bufferedRequest.Request.VariableValues !, t => Assert.IsType <StringValueNode>(t.Value)); }
/// <iniheritdoc /> public Task <IExecutionResult> ExecuteAsync( IQueryRequest request, CancellationToken cancellationToken = default) { var bufferRequest = BufferedRequest.Create(request, Schema); _semaphore.Wait(cancellationToken); try { _bufferedRequests.Add(bufferRequest); if (!_taskRegistered) { _batchScheduler.Schedule(() => ExecuteRequestsInternal(cancellationToken)); _taskRegistered = true; } } finally { _semaphore.Release(); } return(bufferRequest.Promise.Task); }
public async Task Create_BufferedRequest_Operation_Correctly_Resolved() { // arrange ISchema schema = await new ServiceCollection() .AddGraphQL() .AddCustomerSchema() .BuildSchemaAsync(); var query = "query abc($id: ID) { customer(id: $id) { name } } " + "query def($id: ID) { customer(id: $id) { name } }"; IQueryRequest request = QueryRequestBuilder.New() .SetQuery(query) .SetOperation("def") .Create(); // act var bufferedRequest = BufferedRequest.Create(request, schema); // assert Assert.Equal(request, bufferedRequest.Request); Assert.Equal(query, bufferedRequest.Document.ToString(false)); Assert.Equal( bufferedRequest.Document.Definitions.OfType <OperationDefinitionNode>().Last(), bufferedRequest.Operation); Assert.NotNull(bufferedRequest.Promise); Assert.Null(bufferedRequest.Aliases); }
public async Task Create_BufferedRequest_With_Mixed_Operations() { // arrange ISchema schema = await new ServiceCollection() .AddGraphQL() .AddCustomerSchema() .BuildSchemaAsync(); var variableNames = new HashSet <string> { "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 } } }"; IQueryRequest requestA = QueryRequestBuilder.New() .SetQuery(queryA) .SetVariableValue("id", "1") .Create(); IQueryRequest requestB = QueryRequestBuilder.New() .SetQuery(queryB) .SetVariableValue("id", "1") .Create(); IQueryRequest requestC = QueryRequestBuilder.New() .SetQuery(queryC) .Create(); var bufferedRequestA = BufferedRequest.Create(requestA, schema); var bufferedRequestB = BufferedRequest.Create(requestB, schema); var bufferedRequestC = BufferedRequest.Create(requestC, schema); // act IEnumerable <(IQueryRequest, IEnumerable <BufferedRequest>)> mergeResult = MergeRequestHelper.MergeRequests(new[] { bufferedRequestA, bufferedRequestB, bufferedRequestC }, variableNames); // assert string.Join(Environment.NewLine + "-------" + Environment.NewLine, mergeResult .Select(t => t.Item1) .Select(t => Utf8GraphQLParser.Parse(t.Query !.AsSpan()).ToString(true))) .MatchSnapshot(); }
public async Task Merge_Requests_With_Variables_On_Directives() { // arrange ISchema schema = await new ServiceCollection() .AddGraphQL() .AddCustomerSchema() .BuildSchemaAsync(); var queryA = @"query abc($id: ID $if: Boolean) { customer(id: $id) { name @include(id: $if) } }"; var queryB = @"query abc($id: ID $if: Boolean) { customer(id: $id) { id @include(id: $if) } }"; IQueryRequest requestA = QueryRequestBuilder.New() .SetQuery(queryA) .SetVariableValue("id", "1") .SetVariableValue("if", true) .Create(); IQueryRequest requestB = QueryRequestBuilder.New() .SetQuery(queryB) .SetVariableValue("id", "1") .SetVariableValue("if", true) .Create(); var bufferedRequestA = BufferedRequest.Create(requestA, schema); var bufferedRequestB = BufferedRequest.Create(requestB, schema); // act IEnumerable <(IQueryRequest, IEnumerable <BufferedRequest>)> mergeResult = MergeRequestHelper.MergeRequests(new[] { bufferedRequestA, bufferedRequestB }); // assert string.Join(Environment.NewLine + "-------" + Environment.NewLine, mergeResult .Select(t => t.Item1) .Select(t => Utf8GraphQLParser.Parse(t.Query !.AsSpan()).ToString(true))) .MatchSnapshot(); }
public void Create_BufferedRequest_Schema_Is_Null() { // arrange var query = "query abc($id: ID) { customer(id: $id) { name } }"; IQueryRequest request = QueryRequestBuilder.New() .SetQuery(query) .Create(); // act void Action() => BufferedRequest.Create(request, null !); // assert Assert.Throws <ArgumentNullException>(Action); }
private static void MergeRequest( BufferedRequest bufferedRequest, MergeRequestRewriter rewriter, IDictionary <string, object?> variableValues, NameString requestPrefix) { MergeVariables( bufferedRequest.Request.VariableValues, variableValues, requestPrefix); bool isAutoGenerated = bufferedRequest.Request.ContextData?.ContainsKey(IsAutoGenerated) ?? false; bufferedRequest.Aliases = rewriter.AddQuery( bufferedRequest, requestPrefix, isAutoGenerated); }
public async Task Create_BufferedRequest_Request_Query_Is_Null() { // arrange ISchema schema = await new ServiceCollection() .AddGraphQL() .AddCustomerSchema() .BuildSchemaAsync(); IQueryRequest request = QueryRequestBuilder.New() .SetQueryId("abc") .Create(); // act void Action() => BufferedRequest.Create(request, schema); // assert Assert.Throws <ArgumentException>(Action); }
public async Task Create_BufferedRequest_AutoGenerated() { // arrange ISchema schema = await new ServiceCollection() .AddGraphQL() .AddCustomerSchema() .BuildSchemaAsync(); var queryA = "query abc($id: ID) { customer(id: $id) { name } }"; var queryB = "query abc($id: ID) { customer(id: $id) { id } }"; IQueryRequest requestA = QueryRequestBuilder.New() .SetQuery(queryA) .SetVariableValue("id", "1") .SetProperty(WellKnownContextData.IsAutoGenerated, true) .Create(); IQueryRequest requestB = QueryRequestBuilder.New() .SetQuery(queryB) .SetVariableValue("id", "1") .SetProperty(WellKnownContextData.IsAutoGenerated, true) .Create(); var bufferedRequestA = BufferedRequest.Create(requestA, schema); var bufferedRequestB = BufferedRequest.Create(requestB, schema); // act IEnumerable <(IQueryRequest, IEnumerable <BufferedRequest>)> mergeResult = MergeRequestHelper.MergeRequests( new[] { bufferedRequestA, bufferedRequestB }); // assert string.Join(Environment.NewLine + "-------" + Environment.NewLine, mergeResult .Select(t => t.Item1) .Select(t => Utf8GraphQLParser.Parse(t.Query !.AsSpan()).ToString(true))) .MatchSnapshot(); }
private async ValueTask ExecuteSingleRequestAsync( CancellationToken cancellationToken) { BufferedRequest request = _bufferedRequests[0]; IExecutionResult result = await _executor .ExecuteAsync(request.Request, cancellationToken) .ConfigureAwait(false); if (result is IQueryResult queryResult) { request.Promise.SetResult(queryResult); } else { // since we only support query/mutation at this point we will just fail // in the event that something else was returned. request.Promise.SetException(new NotSupportedException( "Only IQueryResult is supported when batching.")); } }
public static IEnumerable <(IQueryRequest, IEnumerable <BufferedRequest>)> MergeRequests( IEnumerable <BufferedRequest> requests, ISet <string> requestVariableNames) { foreach (var group in requests.GroupBy(t => t.Operation.Operation)) { var rewriter = new MergeRequestRewriter(requestVariableNames); var variableValues = new Dictionary <string, object?>(); var operationName = group .Select(r => r.Request.OperationName) .Where(n => n != null) .Distinct() .FirstOrDefault(); if (operationName is not null) { rewriter.SetOperationName(new NameNode(operationName)); } var i = 0; BufferedRequest first = null !; foreach (BufferedRequest request in group) { first = request; MergeRequest(request, rewriter, variableValues, $"__{i++}_"); } IQueryRequest batch = QueryRequestBuilder.New() .SetQuery(rewriter.Merge()) .SetOperation(operationName) .SetVariableValues(variableValues) .TrySetServices(first.Request.Services) .Create(); yield return(batch, group); } }
public IDictionary <string, string> AddQuery( BufferedRequest request, NameString requestPrefix, bool isAutoGenerated) { _requestPrefix = requestPrefix; _rewriteFragments = !isAutoGenerated; _operationType = request.Operation.Operation; _aliases = new Dictionary <string, string>(); DocumentNode rewritten = RewriteDocument(request.Document, true); OperationDefinitionNode operation = BufferedRequest.ResolveOperation(rewritten, request.Request.OperationName); foreach (VariableDefinitionNode variable in operation.VariableDefinitions) { if (!_variables.ContainsKey(variable.Variable.Name.Value)) { _variables.Add(variable.Variable.Name.Value, variable); } } _fields.AddRange(operation.SelectionSet.Selections.OfType <FieldNode>()); foreach (FragmentDefinitionNode fragment in rewritten.Definitions .OfType <FragmentDefinitionNode>()) { if (!_fragments.ContainsKey(fragment.Name.Value)) { _fragments.Add(fragment.Name.Value, fragment); } } return(_aliases); }