From 98637963ceca707a8bb9ca322e05bee5e83d2cd7 Mon Sep 17 00:00:00 2001 From: da3dsoul Date: Sun, 16 Apr 2017 05:14:03 -0400 Subject: [PATCH] Improve Speed of retrieving multiple files --- Shoko.Server/API/v2/Modules/Common.cs | 7 ++++-- .../Cached/AnimeEpisodeRepository.cs | 25 +++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Shoko.Server/API/v2/Modules/Common.cs b/Shoko.Server/API/v2/Modules/Common.cs index 2b2dade05..ab7354a3e 100644 --- a/Shoko.Server/API/v2/Modules/Common.cs +++ b/Shoko.Server/API/v2/Modules/Common.cs @@ -881,14 +881,17 @@ private object GetMultipleFiles() Dictionary results = new Dictionary(); try { - foreach (SVR_AnimeEpisode ep in RepoFactory.AnimeEpisode.GetEpisodesWithMultipleFiles(true)) + List list = RepoFactory.AnimeEpisode.GetEpisodesWithMultipleFiles(true); + foreach(SVR_AnimeEpisode ep in list) { Serie serie = null; SVR_AnimeSeries series = ep.GetAnimeSeries(); if (results.ContainsKey(series.AnimeSeriesID)) serie = results[series.AnimeSeriesID]; if (serie == null) serie = - Serie.GenerateFromAnimeSeries(Context, series, userID, para.nocast == 1, para.notag == 1, 0, false); + Serie.GenerateFromAnimeSeries(Context, series, userID, para.nocast == 1, + para.notag == 1, 0, + false); if (serie.eps == null) serie.eps = new List(); Episode episode = Episode.GenerateFromAnimeEpisode(Context, ep, userID, 0); List vls = ep.GetVideoLocals(); diff --git a/Shoko.Server/Repositories/Cached/AnimeEpisodeRepository.cs b/Shoko.Server/Repositories/Cached/AnimeEpisodeRepository.cs index 365ba658b..86d2c399a 100644 --- a/Shoko.Server/Repositories/Cached/AnimeEpisodeRepository.cs +++ b/Shoko.Server/Repositories/Cached/AnimeEpisodeRepository.cs @@ -5,6 +5,7 @@ using Shoko.Models.Server; using NHibernate; using NutzCode.InMemoryIndex; +using Shoko.Server.Databases; using Shoko.Server.Models; using Shoko.Server.PlexAndKodi; @@ -151,19 +152,17 @@ public List GetByHash(string hash) public List GetEpisodesWithMultipleFiles(bool ignoreVariations) { - List hashes = ignoreVariations - ? RepoFactory.VideoLocal.GetAll() - .Where(a => a.IsVariation == 0) - .Select(a => a.Hash) - .Where(a => a != string.Empty) - .ToList() - : RepoFactory.VideoLocal.GetAll().Select(a => a.Hash).Where(a => a != string.Empty).ToList(); - return RepoFactory.CrossRef_File_Episode.GetAll() - .Where(a => hashes.Contains(a.Hash)) - .GroupBy(a => a.EpisodeID) - .Where(a => a.Count() > 1) - .Select(a => GetByAniDBEpisodeID(a.Key)) - .ToList(); + string ignoreVariationsQuery = + @"SELECT ani.EpisodeID FROM VideoLocal AS vl JOIN CrossRef_File_Episode ani ON vl.Hash = ani.Hash WHERE vl.IsVariation = 0 AND vl.Hash != '' GROUP BY ani.EpisodeID HAVING COUNT(ani.EpisodeID) > 1"; + string countVariationsQuery = + @"SELECT ani.EpisodeID FROM VideoLocal AS vl JOIN CrossRef_File_Episode ani ON vl.Hash = ani.Hash WHERE vl.Hash != '' GROUP BY ani.EpisodeID HAVING COUNT(ani.EpisodeID) > 1"; + using (var session = DatabaseFactory.SessionFactory.OpenSession()) + { + IList ids = ignoreVariations + ? session.CreateSQLQuery(ignoreVariationsQuery).List() + : session.CreateSQLQuery(countVariationsQuery).List(); + return ids.Select(GetByAniDBEpisodeID).ToList(); + } /* using (var session = JMMService.SessionFactory.OpenSession())