using System.Collections.Generic; using System.Linq; using Marr.Data.QGen; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Qualities; using NzbDrone.Core.Tv; namespace NzbDrone.Core.History { public interface IHistoryRepository : IBasicRepository { List GetBestQualityInHistory(int episodeId); History MostRecentForEpisode(int episodeId); History MostRecentForDownloadId(string downloadId); List FindByDownloadId(string downloadId); List FindDownloadHistory(int idSeriesId, QualityModel quality); void DeleteForSeries(int seriesId); } public class HistoryRepository : BasicRepository, IHistoryRepository { public HistoryRepository(IMainDatabase database, IEventAggregator eventAggregator) : base(database, eventAggregator) { } public List GetBestQualityInHistory(int episodeId) { var history = Query.Where(c => c.EpisodeId == episodeId); return history.Select(h => h.Quality).ToList(); } public History MostRecentForEpisode(int episodeId) { return Query.Where(h => h.EpisodeId == episodeId) .OrderByDescending(h => h.Date) .FirstOrDefault(); } public History MostRecentForDownloadId(string downloadId) { return Query.Where(h => h.DownloadId == downloadId) .OrderByDescending(h => h.Date) .FirstOrDefault(); } public List FindByDownloadId(string downloadId) { return Query.Where(h => h.DownloadId == downloadId); } public List FindDownloadHistory(int idSeriesId, QualityModel quality) { return Query.Where(h => h.SeriesId == idSeriesId && h.Quality == quality && (h.EventType == HistoryEventType.Grabbed || h.EventType == HistoryEventType.DownloadFailed || h.EventType == HistoryEventType.DownloadFolderImported) ).ToList(); } public void DeleteForSeries(int seriesId) { Delete(c => c.SeriesId == seriesId); } protected override SortBuilder GetPagedQuery(QueryBuilder query, PagingSpec pagingSpec) { var baseQuery = query.Join(JoinType.Inner, h => h.Series, (h, s) => h.SeriesId == s.Id) .Join(JoinType.Inner, h => h.Episode, (h, e) => h.EpisodeId == e.Id); return base.GetPagedQuery(baseQuery, pagingSpec); } } }