U4-7807 Domain, language, public access cache (GetAll) caches not working when there are no items

This commit is contained in:
Shannon
2016-01-22 17:05:27 +01:00
parent f78a425985
commit 3ecb9d0f86
4 changed files with 84 additions and 5 deletions

View File

@@ -1,3 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Collections;
using Umbraco.Core.Models.EntityBase;
@@ -12,10 +14,18 @@ namespace Umbraco.Core.Cache
internal class FullDataSetRepositoryCachePolicy<TEntity, TId> : DefaultRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
{
public FullDataSetRepositoryCachePolicy(IRuntimeCacheProvider cache) : base(cache, new RepositoryCachePolicyOptions())
public FullDataSetRepositoryCachePolicy(IRuntimeCacheProvider cache) : base(cache,
new RepositoryCachePolicyOptions
{
//Definitely allow zero'd cache entires since this is a full set, in many cases there will be none,
// and we must cache this!
GetAllCacheAllowZeroCount = true
})
{
}
private bool? _hasZeroCountCache;
/// <summary>
/// For this type of caching policy, we don't cache individual items
/// </summary>
@@ -44,6 +54,19 @@ namespace Umbraco.Core.Cache
});
}
/// <summary>
/// Looks up the zero count cache, must return null if it doesn't exist
/// </summary>
/// <returns></returns>
protected override bool HasZeroCountCache()
{
if (_hasZeroCountCache.HasValue)
return _hasZeroCountCache.Value;
_hasZeroCountCache = Cache.GetCacheItem<DeepCloneableList<TEntity>>(GetCacheTypeKey()) != null;
return _hasZeroCountCache.Value;
}
/// <summary>
/// This policy will cache the full data set as a single collection
/// </summary>
@@ -51,6 +74,10 @@ namespace Umbraco.Core.Cache
protected override TEntity[] GetAllFromCache()
{
var found = Cache.GetCacheItem<DeepCloneableList<TEntity>>(GetCacheTypeKey());
//This method will get called before checking for zero count cache, so we'll just set the flag here
_hasZeroCountCache = found != null;
return found == null ? new TEntity[] { } : found.WhereNotNull().ToArray();
}
}