using System; using System.Collections.Generic; using System.Linq; using NzbDrone.Common.EnsureThat; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Books { public interface IEditionRepository : IBasicRepository { List GetAllMonitoredEditions(); Edition FindByForeignEditionId(string foreignEditionId); List FindByBook(int id); List FindByAuthor(int id); List FindByAuthorMetadataId(int id, bool onlyMonitored); Edition FindByTitle(int authorMetadataId, string title); List GetEditionsForRefresh(int bookId, List foreignEditionIds); List SetMonitored(Edition edition); } public class EditionRepository : BasicRepository, IEditionRepository { public EditionRepository(IMainDatabase database, IEventAggregator eventAggregator) : base(database, eventAggregator) { } public List GetAllMonitoredEditions() { return Query(x => x.Monitored == true); } public Edition FindByForeignEditionId(string foreignEditionId) { var edition = Query(x => x.ForeignEditionId == foreignEditionId).SingleOrDefault(); return edition; } public List GetEditionsForRefresh(int bookId, List foreignEditionIds) { return Query(r => r.BookId == bookId || foreignEditionIds.Contains(r.ForeignEditionId)); } public List FindByBook(int id) { // populate the books and author metadata also // this hopefully speeds up the track matching a lot var builder = new SqlBuilder(_database.DatabaseType) .LeftJoin((e, b) => e.BookId == b.Id) .LeftJoin((b, a) => b.AuthorMetadataId == a.Id) .Where(r => r.BookId == id); return _database.QueryJoined(builder, (edition, book, metadata) => { if (book != null) { book.AuthorMetadata = metadata; edition.Book = book; } return edition; }).ToList(); } public List FindByAuthor(int id) { return Query(Builder().Join((e, b) => e.BookId == b.Id) .Join((b, a) => b.AuthorMetadataId == a.AuthorMetadataId) .Where(a => a.Id == id)); } public List FindByAuthorMetadataId(int authorMetadataId, bool onlyMonitored) { var builder = Builder().Join((e, b) => e.BookId == b.Id) .Where(b => b.AuthorMetadataId == authorMetadataId); if (onlyMonitored) { builder = builder.OrWhere(e => e.Monitored == true); builder = builder.OrWhere(b => b.AnyEditionOk == true); } return Query(builder); } public Edition FindByTitle(int authorMetadataId, string title) { return Query(Builder().Join((e, b) => e.BookId == b.Id) .Where(b => b.AuthorMetadataId == authorMetadataId) .Where(e => e.Monitored == true) .Where(e => e.Title == title)) .FirstOrDefault(); } public List SetMonitored(Edition edition) { var allEditions = FindByBook(edition.BookId); allEditions.ForEach(r => r.Monitored = r.Id == edition.Id); Ensure.That(allEditions.Count(x => x.Monitored) == 1).IsTrue(); UpdateMany(allEditions); return allEditions; } } }