Exemple #1
0
        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));
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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();
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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();
        }
Exemple #10
0
        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."));
            }
        }
Exemple #11
0
        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);
        }