From c34eec160f569c49e670f4bf9332a9345f5f7295 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Wed, 25 Oct 2017 23:09:35 +0200 Subject: [PATCH] Cache BestForTags briefly for better performance when processing releases. --- .../Profiles/Delay/DelayProfileService.cs | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) 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(); } }