diff --git a/NzbDrone.Api/Series/SeriesModule.cs b/NzbDrone.Api/Series/SeriesModule.cs index e74665edf..964d83804 100644 --- a/NzbDrone.Api/Series/SeriesModule.cs +++ b/NzbDrone.Api/Series/SeriesModule.cs @@ -75,7 +75,7 @@ namespace NzbDrone.Api.Series var resource = series.InjectTo(); MapCoversToLocal(resource); - LinkSeriesStatistics(resource, _seriesStatisticsService.SeriesStatistics()); + FetchAndLinkSeriesStatistics(resource); return resource; } @@ -85,12 +85,8 @@ namespace NzbDrone.Api.Series var seriesStats = _seriesStatisticsService.SeriesStatistics(); var seriesResources = ToListResource(_seriesService.GetAllSeries); - foreach (var resource in seriesResources) - { - LinkSeriesStatistics(resource, seriesStats); - } - MapCoversToLocal(seriesResources.ToArray()); + LinkSeriesStatistics(seriesResources, seriesStats); return seriesResources; } @@ -104,7 +100,7 @@ namespace NzbDrone.Api.Series { var resource = ToResource(_seriesService.UpdateSeries, seriesResource); MapCoversToLocal(resource); - LinkSeriesStatistics(resource, _seriesStatisticsService.SeriesStatistics()); + FetchAndLinkSeriesStatistics(resource); return resource; } @@ -123,14 +119,28 @@ namespace NzbDrone.Api.Series } } - private void LinkSeriesStatistics(SeriesResource resource, List seriesStatistics) + private void FetchAndLinkSeriesStatistics(SeriesResource resource) { - var stats = seriesStatistics.Single(ss => ss.SeriesId == resource.Id); + LinkSeriesStatistics(resource, _seriesStatisticsService.SeriesStatistics(resource.Id)); + } - resource.EpisodeCount = stats.EpisodeCount; - resource.EpisodeFileCount = stats.EpisodeFileCount; - resource.SeasonCount = stats.SeasonCount; - resource.NextAiring = stats.NextAiring; + private void LinkSeriesStatistics(List resources, List seriesStatistics) + { + foreach (var series in resources) + { + var stats = seriesStatistics.SingleOrDefault(ss => ss.SeriesId == series.Id); + if (stats == null) continue; + + LinkSeriesStatistics(series, stats); + } + } + + private void LinkSeriesStatistics(SeriesResource resource, SeriesStatistics seriesStatistics) + { + resource.EpisodeCount = seriesStatistics.EpisodeCount; + resource.EpisodeFileCount = seriesStatistics.EpisodeFileCount; + resource.SeasonCount = seriesStatistics.SeasonCount; + resource.NextAiring = seriesStatistics.NextAiring; } } } diff --git a/NzbDrone.Core/SeriesStats/SeriesStatisticsRepository.cs b/NzbDrone.Core/SeriesStats/SeriesStatisticsRepository.cs index 5d9413d87..dcc973e0c 100644 --- a/NzbDrone.Core/SeriesStats/SeriesStatisticsRepository.cs +++ b/NzbDrone.Core/SeriesStats/SeriesStatisticsRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.SeriesStats @@ -7,6 +8,7 @@ namespace NzbDrone.Core.SeriesStats public interface ISeriesStatisticsRepository { List SeriesStatistics(); + SeriesStatistics SeriesStatistics(int seriesId); } public class SeriesStatisticsRepository : ISeriesStatisticsRepository @@ -24,16 +26,44 @@ namespace NzbDrone.Core.SeriesStats mapper.AddParameter("currentDate", DateTime.UtcNow); - const string queryText = @"SELECT - SeriesId, - SUM(CASE WHEN Monitored = 1 AND Airdate <= @currentDate THEN 1 ELSE 0 END) AS EpisodeCount, - SUM(CASE WHEN Monitored = 1 AND Episodes.EpisodeFileId > 0 AND AirDate <= @currentDate THEN 1 ELSE 0 END) as EpisodeFileCount, - MAX(Episodes.SeasonNumber) as SeasonCount, - MIN(CASE WHEN AirDate < @currentDate THEN NULL ELSE AirDate END) as NextAiringString - FROM Episodes - GROUP BY SeriesId"; + var sb = new StringBuilder(); + sb.AppendLine(GetSelectClause()); + sb.AppendLine(GetGroupByClause()); + var queryText = sb.ToString(); return mapper.Query(queryText); } + + public SeriesStatistics SeriesStatistics(int seriesId) + { + var mapper = _database.GetDataMapper(); + + mapper.AddParameter("currentDate", DateTime.UtcNow); + mapper.AddParameter("seriesId", seriesId); + + var sb = new StringBuilder(); + sb.AppendLine(GetSelectClause()); + sb.AppendLine("WHERE SeriesId = @seriesId"); + sb.AppendLine(GetGroupByClause()); + var queryText = sb.ToString(); + + return mapper.Find(queryText); + } + + private string GetSelectClause() + { + return @"SELECT + SeriesId, + SUM(CASE WHEN Monitored = 1 AND Airdate <= @currentDate THEN 1 ELSE 0 END) AS EpisodeCount, + SUM(CASE WHEN Monitored = 1 AND Episodes.EpisodeFileId > 0 AND AirDate <= @currentDate THEN 1 ELSE 0 END) AS EpisodeFileCount, + MAX(Episodes.SeasonNumber) as SeasonCount, + MIN(CASE WHEN AirDate < @currentDate THEN NULL ELSE AirDate END) AS NextAiringString + FROM Episodes"; + } + + private string GetGroupByClause() + { + return "GROUP BY SeriesId"; + } } } diff --git a/NzbDrone.Core/SeriesStats/SeriesStatisticsService.cs b/NzbDrone.Core/SeriesStats/SeriesStatisticsService.cs index e54e449db..97b966808 100644 --- a/NzbDrone.Core/SeriesStats/SeriesStatisticsService.cs +++ b/NzbDrone.Core/SeriesStats/SeriesStatisticsService.cs @@ -6,6 +6,7 @@ namespace NzbDrone.Core.SeriesStats public interface ISeriesStatisticsService { List SeriesStatistics(); + SeriesStatistics SeriesStatistics(int seriesId); } public class SeriesStatisticsService : ISeriesStatisticsService @@ -21,5 +22,14 @@ namespace NzbDrone.Core.SeriesStats { return _seriesStatisticsRepository.SeriesStatistics(); } + + public SeriesStatistics SeriesStatistics(int seriesId) + { + var stats = _seriesStatisticsRepository.SeriesStatistics(seriesId); + + if (stats == null) return new SeriesStatistics(); + + return stats; + } } }