public async ValueTask InvokeAsync(IRequestContext context) { IQueryRequest request = context.Request; var addToCache = true; if (context.Document is null) { if (request.QueryId != null && _documentCache.TryGetDocument(request.QueryId, out DocumentNode document)) { context.DocumentId = request.QueryId; context.Document = document; context.ValidationResult = DocumentValidatorResult.Ok; context.IsCachedDocument = true; addToCache = false; _diagnosticEvents.RetrievedDocumentFromCache(context); } else if (request.QueryHash != null && _documentCache.TryGetDocument(request.QueryHash, out document)) { context.DocumentId = request.QueryHash; context.Document = document; context.ValidationResult = DocumentValidatorResult.Ok; context.IsCachedDocument = true; addToCache = false; _diagnosticEvents.RetrievedDocumentFromCache(context); } else if (request.QueryHash is null && request.Query != null) { context.DocumentHash = _documentHashProvider.ComputeHash(request.Query.AsSpan()); if (_documentCache.TryGetDocument(context.DocumentHash, out document)) { context.DocumentId = context.DocumentHash; context.Document = document; context.ValidationResult = DocumentValidatorResult.Ok; context.IsCachedDocument = true; addToCache = false; _diagnosticEvents.RetrievedDocumentFromCache(context); } } } await _next(context).ConfigureAwait(false); if (addToCache && context.DocumentId != null && context.Document != null && context.IsValidDocument) { _documentCache.TryAddDocument(context.DocumentId, context.Document); _diagnosticEvents.AddedDocumentToCache(context); } }