From f6fd675ad4618d01899f7f2fad268ffca91c6f5d Mon Sep 17 00:00:00 2001 From: Qstick Date: Wed, 1 Jan 2020 13:02:03 -0500 Subject: [PATCH] Fixed: Cleanup Tracks Orphaned in History --- .../CleanupOrphanedHistoryItemsFixture.cs | 55 +++++++++++++++++++ .../CleanupOrphanedHistoryItems.cs | 13 +++++ 2 files changed, 68 insertions(+) diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedHistoryItemsFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedHistoryItemsFixture.cs index a118e4696..c58b51f2a 100644 --- a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedHistoryItemsFixture.cs +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedHistoryItemsFixture.cs @@ -13,6 +13,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers { private Artist _artist; private Album _album; + private Track _track; [SetUp] public void Setup() @@ -22,6 +23,9 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers _album = Builder.CreateNew() .BuildNew(); + + _track = Builder.CreateNew() + .BuildNew(); } private void GivenArtist() @@ -34,14 +38,21 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers Db.Insert(_album); } + private void GivenTrack() + { + Db.Insert(_track); + } + [Test] public void should_delete_orphaned_items_by_artist() { GivenAlbum(); + GivenTrack(); var history = Builder.CreateNew() .With(h => h.Quality = new QualityModel()) .With(h => h.AlbumId = _album.Id) + .With(h => h.TrackId = _track.Id) .BuildNew(); Db.Insert(history); @@ -53,10 +64,29 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers public void should_delete_orphaned_items_by_album() { GivenArtist(); + GivenTrack(); var history = Builder.CreateNew() .With(h => h.Quality = new QualityModel()) .With(h => h.ArtistId = _artist.Id) + .With(h => h.TrackId = _track.Id) + .BuildNew(); + Db.Insert(history); + + Subject.Clean(); + AllStoredModels.Should().BeEmpty(); + } + + [Test] + public void should_delete_orphaned_items_by_track() + { + GivenArtist(); + GivenAlbum(); + + var history = Builder.CreateNew() + .With(h => h.Quality = new QualityModel()) + .With(h => h.ArtistId = _artist.Id) + .With(h => h.AlbumId = _album.Id) .BuildNew(); Db.Insert(history); @@ -69,6 +99,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers { GivenArtist(); GivenAlbum(); + GivenTrack(); var history = Builder.CreateListOfSize(2) .All() @@ -90,6 +121,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers { GivenArtist(); GivenAlbum(); + GivenTrack(); var history = Builder.CreateListOfSize(2) .All() @@ -105,5 +137,28 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers AllStoredModels.Should().HaveCount(1); AllStoredModels.Should().Contain(h => h.AlbumId == _album.Id); } + + [Test] + public void should_not_delete_unorphaned_data_by_track() + { + GivenArtist(); + GivenAlbum(); + GivenTrack(); + + var history = Builder.CreateListOfSize(2) + .All() + .With(h => h.Quality = new QualityModel()) + .With(h => h.ArtistId = _artist.Id) + .With(h => h.AlbumId = _album.Id) + .TheFirst(1) + .With(h => h.TrackId = _track.Id) + .BuildListOfNew(); + + Db.InsertMany(history); + + Subject.Clean(); + AllStoredModels.Should().HaveCount(1); + AllStoredModels.Should().Contain(h => h.TrackId == _track.Id); + } } } diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs index ded0eae75..25d90f0ab 100644 --- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs @@ -15,6 +15,7 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers { CleanupOrphanedByArtist(); CleanupOrphanedByAlbum(); + CleanupOrphanedByTrack(); } private void CleanupOrphanedByArtist() @@ -40,5 +41,17 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers ON History.AlbumId = Albums.Id WHERE Albums.Id IS NULL)"); } + + private void CleanupOrphanedByTrack() + { + var mapper = _database.GetDataMapper(); + + mapper.ExecuteNonQuery(@"DELETE FROM History + WHERE Id IN ( + SELECT History.Id FROM History + LEFT OUTER JOIN Tracks + ON History.TrackId = Tracks.Id + WHERE Tracks.Id IS NULL)"); + } } }