From 4550ef13a4506f713bfbae5fb8c57508dd37a889 Mon Sep 17 00:00:00 2001 From: Qstick Date: Fri, 4 Dec 2020 22:13:13 -0500 Subject: [PATCH] Don't call AllMovies twice for each AddMovie validation --- .../DiskSpace/DiskSpaceServiceFixture.cs | 4 ++-- .../Checks/RootFolderCheckFixture.cs | 4 ++-- .../MovieTitleSlugValidatorFixture.cs | 14 +++++++----- .../RootFolderServiceFixture.cs | 4 ++-- .../DiskSpace/DiskSpaceService.cs | 4 ++-- .../HealthCheck/Checks/MountCheck.cs | 2 +- .../HealthCheck/Checks/RootFolderCheck.cs | 2 +- src/NzbDrone.Core/Movies/MovieRepository.cs | 22 ++++++++++++++----- src/NzbDrone.Core/Movies/MovieService.cs | 10 +++++++-- .../Movies/MovieTitleSlugValidator.cs | 13 ++++++----- .../RootFolders/RootFolderService.cs | 12 +++++----- .../Paths/MovieAncestorValidator.cs | 2 +- .../Validation/Paths/MoviePathValidation.cs | 3 ++- 13 files changed, 60 insertions(+), 36 deletions(-) diff --git a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs index 1ed1e43dc..211564e0a 100644 --- a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs +++ b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs @@ -48,7 +48,7 @@ namespace NzbDrone.Core.Test.DiskSpace { Mocker.GetMock() .Setup(v => v.AllMoviePaths()) - .Returns(movies.Select(x => x.Path).ToList()); + .Returns(movies.ToDictionary(x => x.Id, x => x.Path)); } private void GivenExistingFolder(string folder) @@ -73,7 +73,7 @@ namespace NzbDrone.Core.Test.DiskSpace [Test] public void should_check_diskspace_for_same_root_folder_only_once() { - GivenMovies(new Movie { Path = _moviesFolder }, new Movie { Path = _moviesFolder2 }); + GivenMovies(new Movie { Id = 1, Path = _moviesFolder }, new Movie { Id = 2, Path = _moviesFolder2 }); GivenExistingFolder(_moviesFolder); GivenExistingFolder(_moviesFolder2); diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs index dd14540d8..80e388d02 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs @@ -30,7 +30,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks Mocker.GetMock() .Setup(s => s.AllMoviePaths()) - .Returns(movies.Select(x => x.Path).ToList()); + .Returns(movies.ToDictionary(x => x.Id, x => x.Path)); Mocker.GetMock() .Setup(s => s.GetParentFolder(movies.First().Path)) @@ -46,7 +46,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks { Mocker.GetMock() .Setup(s => s.AllMoviePaths()) - .Returns(new List()); + .Returns(new Dictionary()); Subject.Check().ShouldBeOk(); } diff --git a/src/NzbDrone.Core.Test/MovieTests/MovieTitleSlugValidatorFixture.cs b/src/NzbDrone.Core.Test/MovieTests/MovieTitleSlugValidatorFixture.cs index 2dbfbb52d..a1ad376fc 100644 --- a/src/NzbDrone.Core.Test/MovieTests/MovieTitleSlugValidatorFixture.cs +++ b/src/NzbDrone.Core.Test/MovieTests/MovieTitleSlugValidatorFixture.cs @@ -29,17 +29,21 @@ namespace NzbDrone.Core.Test.MovieTests }; Mocker.GetMock() - .Setup(s => s.GetAllMovies()) - .Returns(_movies); + .Setup(s => s.AllMovieTitleSlugs()) + .Returns(_movies.ToDictionary(m => m.Id, m => m.TitleSlug)); } [Test] public void should_not_be_valid_if_there_is_an_existing_movie_with_the_same_title_slug() { + Mocker.GetMock() + .Setup(s => s.GetMovie(_movies.First().Id)) + .Returns(_movies.First()); + var movie = Builder.CreateNew() - .With(s => s.Id = 100) - .With(s => s.TitleSlug = _movies.First().TitleSlug) - .Build(); + .With(s => s.Id = 100) + .With(s => s.TitleSlug = _movies.First().TitleSlug) + .Build(); _validator.Validate(movie).IsValid.Should().BeFalse(); } diff --git a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs index 7cf8b4446..749e8b3c2 100644 --- a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs +++ b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs @@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.RootFolderTests { Mocker.GetMock() .Setup(s => s.AllMoviePaths()) - .Returns(new List()); + .Returns(new Dictionary()); var root = new RootFolder { Path = path.AsOsAgnostic() }; @@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test.RootFolderTests Mocker.GetMock() .Setup(s => s.AllMoviePaths()) - .Returns(new List()); + .Returns(new Dictionary()); Mocker.GetMock() .Setup(s => s.GetDirectories(rootFolder.Path)) diff --git a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs index 3203cf751..f7dcd3893 100644 --- a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs +++ b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs @@ -43,8 +43,8 @@ namespace NzbDrone.Core.DiskSpace private IEnumerable GetMoviesRootPaths() { return _movieService.AllMoviePaths() - .Where(s => _diskProvider.FolderExists(s)) - .Select(s => _diskProvider.GetPathRoot(s)) + .Where(s => _diskProvider.FolderExists(s.Value)) + .Select(s => _diskProvider.GetPathRoot(s.Value)) .Distinct(); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs index c690c08f7..2bc24a5a8 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/MountCheck.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { // Not best for optimization but due to possible symlinks and junctions, we get mounts based on series path so internals can handle mount resolution. var mounts = _movieService.AllMoviePaths() - .Select(p => _diskProvider.GetMount(p)) + .Select(p => _diskProvider.GetMount(p.Value)) .Where(m => m != null && m.MountOptions != null && m.MountOptions.IsReadOnly) .DistinctBy(m => m.RootDirectory) .ToList(); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs index 5a73b3f8a..73e4b3f96 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs @@ -29,7 +29,7 @@ namespace NzbDrone.Core.HealthCheck.Checks public override HealthCheck Check() { var rootFolders = _movieService.AllMoviePaths() - .Select(s => _rootFolderService.GetBestRootFolderPath(s)) + .Select(s => _rootFolderService.GetBestRootFolderPath(s.Value)) .Distinct(); var missingRootFolders = rootFolders.Where(s => !_diskProvider.FolderExists(s)) diff --git a/src/NzbDrone.Core/Movies/MovieRepository.cs b/src/NzbDrone.Core/Movies/MovieRepository.cs index 8fe7c8f1f..3c2d2927a 100644 --- a/src/NzbDrone.Core/Movies/MovieRepository.cs +++ b/src/NzbDrone.Core/Movies/MovieRepository.cs @@ -27,7 +27,8 @@ namespace NzbDrone.Core.Movies void SetFileId(int fileId, int movieId); PagingSpec MoviesWhereCutoffUnmet(PagingSpec pagingSpec, List qualitiesBelowCutoff); Movie FindByPath(string path); - List AllMoviePaths(); + Dictionary AllMoviePaths(); + Dictionary AllMovieTitleSlugs(); List AllMovieTmdbIds(); Dictionary> AllMovieTags(); List GetRecommendations(); @@ -275,11 +276,21 @@ namespace NzbDrone.Core.Movies return Query(x => x.Path == path).FirstOrDefault(); } - public List AllMoviePaths() + public Dictionary AllMoviePaths() { using (var conn = _database.OpenConnection()) { - return conn.Query("SELECT Path FROM Movies").ToList(); + var strSql = "SELECT Id AS [Key], Path AS [Value] FROM Movies"; + return conn.Query>(strSql).ToDictionary(x => x.Key, x => x.Value); + } + } + + public Dictionary AllMovieTitleSlugs() + { + using (var conn = _database.OpenConnection()) + { + var strSql = "SELECT Id AS [Key], TitleSlug AS [Value] FROM Movies"; + return conn.Query>(strSql).ToDictionary(x => x.Key, x => x.Value); } } @@ -295,9 +306,8 @@ namespace NzbDrone.Core.Movies { using (var conn = _database.OpenConnection()) { - string strSql = "SELECT Id AS [Key], Tags AS [Value] FROM Movies"; - var tags = conn.Query>>(strSql).ToDictionary(x => x.Key, x => x.Value); - return tags; + var strSql = "SELECT Id AS [Key], Tags AS [Value] FROM Movies"; + return conn.Query>>(strSql).ToDictionary(x => x.Key, x => x.Value); } } diff --git a/src/NzbDrone.Core/Movies/MovieService.cs b/src/NzbDrone.Core/Movies/MovieService.cs index e8e83e914..9dfedaaa1 100644 --- a/src/NzbDrone.Core/Movies/MovieService.cs +++ b/src/NzbDrone.Core/Movies/MovieService.cs @@ -31,8 +31,9 @@ namespace NzbDrone.Core.Movies List FindByTitleCandidates(string title, out string roman, out string arabic); Movie FindByTitleSlug(string slug); Movie FindByPath(string path); - List AllMoviePaths(); + Dictionary AllMoviePaths(); List AllMovieTmdbIds(); + Dictionary AllMovieTitleSlugs(); bool MovieExists(Movie movie); List GetMoviesByFileId(int fileId); List GetMoviesBetweenDates(DateTime start, DateTime end, bool includeUnmonitored); @@ -189,11 +190,16 @@ namespace NzbDrone.Core.Movies return _movieRepository.FindByPath(path); } - public List AllMoviePaths() + public Dictionary AllMoviePaths() { return _movieRepository.AllMoviePaths(); } + public Dictionary AllMovieTitleSlugs() + { + return _movieRepository.AllMovieTitleSlugs(); + } + public List AllMovieTmdbIds() { return _movieRepository.AllMovieTmdbIds(); diff --git a/src/NzbDrone.Core/Movies/MovieTitleSlugValidator.cs b/src/NzbDrone.Core/Movies/MovieTitleSlugValidator.cs index b1c215f74..07ef8b33e 100644 --- a/src/NzbDrone.Core/Movies/MovieTitleSlugValidator.cs +++ b/src/NzbDrone.Core/Movies/MovieTitleSlugValidator.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using FluentValidation.Validators; using NzbDrone.Common.Extensions; @@ -25,16 +26,18 @@ namespace NzbDrone.Core.Movies var instanceId = (int)instance.Id; var slug = context.PropertyValue.ToString(); - var conflictingMovie = _movieService.GetAllMovies() - .FirstOrDefault(s => s.TitleSlug.IsNotNullOrWhiteSpace() && - s.TitleSlug.Equals(context.PropertyValue.ToString()) && - s.Id != instanceId); + var conflictingId = _movieService.AllMovieTitleSlugs() + .FirstOrDefault(s => s.Value.IsNotNullOrWhiteSpace() && + s.Value.Equals(context.PropertyValue.ToString()) && + s.Key != instanceId); - if (conflictingMovie == null) + if (conflictingId.Equals(default(KeyValuePair))) { return true; } + var conflictingMovie = _movieService.GetMovie(conflictingId.Key); + context.MessageFormatter.AppendArgument("slug", slug); context.MessageFormatter.AppendArgument("movieTitle", conflictingMovie.Title); diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index 438cc8204..c7bf54edf 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -67,7 +67,7 @@ namespace NzbDrone.Core.RootFolders { var rootFolders = _rootFolderRepository.All().ToList(); - var moviePaths = _movieRepository.AllMoviePaths().ToList(); + var moviePaths = _movieRepository.AllMoviePaths(); rootFolders.ForEach(folder => { @@ -116,7 +116,7 @@ namespace NzbDrone.Core.RootFolders _rootFolderRepository.Insert(rootFolder); - var moviePaths = _movieRepository.AllMoviePaths().ToList(); + var moviePaths = _movieRepository.AllMoviePaths(); GetDetails(rootFolder, moviePaths, true); @@ -128,7 +128,7 @@ namespace NzbDrone.Core.RootFolders _rootFolderRepository.Delete(id); } - private List GetUnmappedFolders(string path, List moviePaths) + private List GetUnmappedFolders(string path, Dictionary moviePaths) { _logger.Debug("Generating list of unmapped folders"); @@ -146,7 +146,7 @@ namespace NzbDrone.Core.RootFolders } var possibleMovieFolders = _diskProvider.GetDirectories(path).ToList(); - var unmappedFolders = possibleMovieFolders.Except(moviePaths.Select(s => s), PathEqualityComparer.Instance).ToList(); + var unmappedFolders = possibleMovieFolders.Except(moviePaths.Select(s => s.Value), PathEqualityComparer.Instance).ToList(); foreach (string unmappedFolder in unmappedFolders) { @@ -167,7 +167,7 @@ namespace NzbDrone.Core.RootFolders public RootFolder Get(int id, bool timeout) { var rootFolder = _rootFolderRepository.Get(id); - var moviePaths = _movieRepository.AllMoviePaths().ToList(); + var moviePaths = _movieRepository.AllMoviePaths(); GetDetails(rootFolder, moviePaths, timeout); @@ -188,7 +188,7 @@ namespace NzbDrone.Core.RootFolders return possibleRootFolder.Path; } - private void GetDetails(RootFolder rootFolder, List moviePaths, bool timeout) + private void GetDetails(RootFolder rootFolder, Dictionary moviePaths, bool timeout) { Task.Run(() => { diff --git a/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs b/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs index 1d87badb5..13c673771 100644 --- a/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.Validation.Paths return true; } - return !_movieService.AllMoviePaths().Any(s => context.PropertyValue.ToString().IsParentPath(s)); + return !_movieService.AllMoviePaths().Any(s => context.PropertyValue.ToString().IsParentPath(s.Value)); } } } diff --git a/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs b/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs index f22adaeb5..0e24f1bf7 100644 --- a/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs +++ b/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs @@ -1,3 +1,4 @@ +using System.Linq; using FluentValidation.Validators; using NzbDrone.Common.Extensions; using NzbDrone.Core.Movies; @@ -26,7 +27,7 @@ namespace NzbDrone.Core.Validation.Paths context.MessageFormatter.AppendArgument("moviePath", context.PropertyValue.ToString()); - return !_moviesService.GetAllMovies().Exists(s => s.Path.PathEquals(context.PropertyValue.ToString()) && s.Id != instanceId); + return !_moviesService.AllMoviePaths().Any(s => s.Value.PathEquals(context.PropertyValue.ToString()) && s.Key != instanceId); } } }