diff --git a/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs b/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs index a367ce4eb..7afffee41 100644 --- a/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs +++ b/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; namespace NzbDrone.Core.Profiles.Delay @@ -18,20 +20,26 @@ namespace NzbDrone.Core.Profiles.Delay public class DelayProfileService : IDelayProfileService { private readonly IDelayProfileRepository _repo; + private readonly ICached _bestForTagsCache; - public DelayProfileService(IDelayProfileRepository repo) + public DelayProfileService(IDelayProfileRepository repo, ICacheManager cacheManager) { _repo = repo; + _bestForTagsCache = cacheManager.GetCache(GetType(), "best"); } public DelayProfile Add(DelayProfile profile) { - return _repo.Insert(profile); + var result = _repo.Insert(profile); + _bestForTagsCache.Clear(); + return result; } public DelayProfile Update(DelayProfile profile) { - return _repo.Update(profile); + var result = _repo.Update(profile); + _bestForTagsCache.Clear(); + return result; } public void Delete(int id) @@ -48,6 +56,7 @@ namespace NzbDrone.Core.Profiles.Delay } _repo.UpdateMany(all); + _bestForTagsCache.Clear(); } public List All() @@ -67,7 +76,14 @@ namespace NzbDrone.Core.Profiles.Delay public DelayProfile BestForTags(HashSet tagIds) { - return _repo.All().Where(r => r.Tags.Intersect(tagIds).Any() || r.Tags.Empty()) + var key = "-" + tagIds.Select(v => v.ToString()).Join(","); + return _bestForTagsCache.Get(key, () => FetchBestForTags(tagIds), TimeSpan.FromSeconds(30)); + } + + private DelayProfile FetchBestForTags(HashSet tagIds) + { + return _repo.All() + .Where(r => r.Tags.Intersect(tagIds).Any() || r.Tags.Empty()) .OrderBy(d => d.Order).First(); } }