Browse Source

Fix content version cache.

pull/1038/head
Sebastian 3 years ago
parent
commit
445cbbbc3c
  1. 4
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Cache/CachingBatchLoader.cs
  2. 4
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs
  3. 48
      tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs

4
backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Cache/CachingBatchLoader.cs

@ -21,11 +21,11 @@ internal class CachingBatchDataLoader<TKey, T> : DataLoaderBase<CacheableId<TKey
private readonly IQueryCache<TKey, T> queryCache; private readonly IQueryCache<TKey, T> queryCache;
private readonly Func<IEnumerable<TKey>, CancellationToken, Task<IDictionary<TKey, T>>> queryDelegate; private readonly Func<IEnumerable<TKey>, CancellationToken, Task<IDictionary<TKey, T>>> queryDelegate;
public CachingBatchDataLoader(IQueryCache<TKey, T> queryStore, public CachingBatchDataLoader(IQueryCache<TKey, T> queryCache,
Func<IEnumerable<TKey>, CancellationToken, Task<IDictionary<TKey, T>>> queryDelegate, bool canCache = true, int maxBatchSize = int.MaxValue) Func<IEnumerable<TKey>, CancellationToken, Task<IDictionary<TKey, T>>> queryDelegate, bool canCache = true, int maxBatchSize = int.MaxValue)
: base(canCache, maxBatchSize) : base(canCache, maxBatchSize)
{ {
this.queryCache = queryStore; this.queryCache = queryCache;
this.queryDelegate = queryDelegate; this.queryDelegate = queryDelegate;
} }

4
backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs

@ -77,7 +77,9 @@ public sealed class GraphQLExecutionContext : QueryExecutionContext
public IDataLoaderResult<IEnrichedContentEntity?> GetContent(DomainId schemaId, DomainId id, long version) public IDataLoaderResult<IEnrichedContentEntity?> 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); return FindContentAsync(schemaId.ToString(), id, version, ct);
}).LoadAsync(); }).LoadAsync();

48
tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs

@ -47,13 +47,17 @@ public sealed class GraphQLTests : IClassFixture<GraphQLFixture>
var query = new var query = new
{ {
query = @" query = @"
{ query ContentsQuery($id: String!) {
findMyWritesContent(id: ""<ID>"") { findMyWritesContent(id: $id) {
flatData { flatData {
json json
} }
} }
}".Replace("<ID>", content_0.Id, StringComparison.Ordinal) }",
variables = new
{
id = content_0.Id,
}
}; };
var result = await _.Client.SharedDynamicContents.GraphQlAsync<JToken>(query); var result = await _.Client.SharedDynamicContents.GraphQlAsync<JToken>(query);
@ -390,6 +394,44 @@ public sealed class GraphQLTests : IClassFixture<GraphQLFixture>
Assert.Equal(new[] { "Bavaria", "Leipzig", "Munich", "Saxony" }, names); 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<JToken>(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] [Fact]
public async Task Should_return_correct_vary_headers() public async Task Should_return_correct_vary_headers()
{ {

Loading…
Cancel
Save