From b034d0c1b3c5fe4ed0bf2edd25e4d03b7e815859 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Thu, 22 Sep 2016 19:57:12 +0200 Subject: [PATCH] Fixed: Cleanup unused Tags during housekeeping. --- .../Housekeepers/CleanupUnusedTagsFixture.cs | 43 +++++++++++++++++++ .../NzbDrone.Core.Test.csproj | 1 + .../Housekeepers/CleanupUnusedTags.cs | 41 ++++++++++++++++++ src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 4 files changed, 86 insertions(+) create mode 100644 src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs create mode 100644 src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs new file mode 100644 index 000000000..34ddb0d15 --- /dev/null +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs @@ -0,0 +1,43 @@ +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.Download.Pending; +using NzbDrone.Core.Housekeeping.Housekeepers; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Core.Tv; +using NzbDrone.Core.Tags; +using NzbDrone.Core.Restrictions; + +namespace NzbDrone.Core.Test.Housekeeping.Housekeepers +{ + [TestFixture] + public class CleanupUnusedTagsFixture : DbTest + { + [Test] + public void should_delete_unused_tags() + { + var tags = Builder.CreateListOfSize(2).BuildList(); + + Db.InsertMany(tags); + Subject.Clean(); + AllStoredModels.Should().BeEmpty(); + } + + [Test] + public void should_not_delete_used_tags() + { + var tags = Builder.CreateListOfSize(2).BuildList(); + Db.InsertMany(tags); + + var restrictions = Builder.CreateListOfSize(2) + .All() + .With(v => v.Tags.Add(tags[0].Id)) + .BuildList(); + Db.InsertMany(restrictions); + + Subject.Clean(); + AllStoredModels.Should().HaveCount(1); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 41faf14cc..310de0815 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -224,6 +224,7 @@ + diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs new file mode 100644 index 000000000..9f87227ac --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Marr.Data; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class CleanupUnusedTags : IHousekeepingTask + { + private readonly IMainDatabase _database; + + public CleanupUnusedTags(IMainDatabase database) + { + _database = database; + } + + public void Clean() + { + var mapper = _database.GetDataMapper(); + + var usedTags = new[] { "Series", "Notifications", "DelayProfiles", "Restrictions" } + .SelectMany(v => GetUsedTags(v, mapper)) + .Distinct() + .ToArray(); + + var usedTagsList = string.Join(",", usedTags.Select(d => d.ToString()).ToArray()); + + mapper.ExecuteNonQuery($"DELETE FROM Tags WHERE NOT Id IN ({usedTagsList})"); + } + + private int[] GetUsedTags(string table, IDataMapper mapper) + { + return mapper.ExecuteReader($"SELECT DISTINCT Tags FROM {table} WHERE NOT Tags = '[]'", reader => reader.GetString(0)) + .SelectMany(Json.Deserialize>) + .Distinct() + .ToArray(); + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 3aff31e8e..3db8078e4 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -545,6 +545,7 @@ +