From 445cbbbc3c2ce894e6152f2b1842d2cdf425bf38 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 23 Oct 2023 14:53:02 +0200 Subject: [PATCH] Fix content version cache. --- .../GraphQL/Cache/CachingBatchLoader.cs | 4 +- .../GraphQL/GraphQLExecutionContext.cs | 4 +- .../TestSuite.ApiTests/GraphQLTests.cs | 48 +++++++++++++++++-- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Cache/CachingBatchLoader.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Cache/CachingBatchLoader.cs index fe90dee19..6e52f5ef3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Cache/CachingBatchLoader.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Cache/CachingBatchLoader.cs @@ -21,11 +21,11 @@ internal class CachingBatchDataLoader : DataLoaderBase queryCache; private readonly Func, CancellationToken, Task>> queryDelegate; - public CachingBatchDataLoader(IQueryCache queryStore, + public CachingBatchDataLoader(IQueryCache queryCache, Func, CancellationToken, Task>> queryDelegate, bool canCache = true, int maxBatchSize = int.MaxValue) : base(canCache, maxBatchSize) { - this.queryCache = queryStore; + this.queryCache = queryCache; this.queryDelegate = queryDelegate; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs index 3edc45f98..08bd14652 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs @@ -77,7 +77,9 @@ public sealed class GraphQLExecutionContext : QueryExecutionContext public IDataLoaderResult GetContent(DomainId schemaId, DomainId id, long version) { - return dataLoaders.Context!.GetOrAddLoader(nameof(GetContent), ct => + var cacheKey = $"{nameof(GetContent)}_{schemaId}_{id}_{version}"; + + return dataLoaders.Context!.GetOrAddLoader(cacheKey, ct => { return FindContentAsync(schemaId.ToString(), id, version, ct); }).LoadAsync(); diff --git a/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs b/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs index aa1973fc6..2b3aebc09 100644 --- a/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs +++ b/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs @@ -47,13 +47,17 @@ public sealed class GraphQLTests : IClassFixture var query = new { query = @" - { - findMyWritesContent(id: """") { + query ContentsQuery($id: String!) { + findMyWritesContent(id: $id) { flatData { json } } - }".Replace("", content_0.Id, StringComparison.Ordinal) + }", + variables = new + { + id = content_0.Id, + } }; var result = await _.Client.SharedDynamicContents.GraphQlAsync(query); @@ -390,6 +394,44 @@ public sealed class GraphQLTests : IClassFixture Assert.Equal(new[] { "Bavaria", "Leipzig", "Munich", "Saxony" }, names); } + [Fact] + public async Task Should_query_multiple_items_with_separate_queries() + { + var allCities = await _.Cities.GetAsync(); + + var query = new + { + query = @" + query ContentsQuery($id1: String!, $id2: String!) { + a: findCitiesContent(id: $id1, version: 0) { + id, + flatData { + name + } + }, + b: findCitiesContent(id: $id2, version: 0) { + id, + flatData { + name + } + } + }", + variables = new + { + id1 = allCities.Items[0].Id, + id2 = allCities.Items[1].Id, + } + }; + + var result = await _.Client.SharedDynamicContents.GraphQlAsync(query); + + var city1Id = result["a"]["id"].ToString(); + var city2Id = result["b"]["id"].ToString(); + + Assert.Equal(allCities.Items[0].Id, city1Id); + Assert.Equal(allCities.Items[1].Id, city2Id); + } + [Fact] public async Task Should_return_correct_vary_headers() {