You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.0 KiB
107 lines
4.0 KiB
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<Edition>
|
|
{
|
|
List<Edition> GetAllMonitoredEditions();
|
|
Edition FindByForeignEditionId(string foreignEditionId);
|
|
List<Edition> FindByBook(int id);
|
|
List<Edition> FindByAuthor(int id);
|
|
List<Edition> FindByAuthorMetadataId(int id, bool onlyMonitored);
|
|
Edition FindByTitle(int authorMetadataId, string title);
|
|
List<Edition> GetEditionsForRefresh(int bookId, List<string> foreignEditionIds);
|
|
List<Edition> SetMonitored(Edition edition);
|
|
}
|
|
|
|
public class EditionRepository : BasicRepository<Edition>, IEditionRepository
|
|
{
|
|
public EditionRepository(IMainDatabase database, IEventAggregator eventAggregator)
|
|
: base(database, eventAggregator)
|
|
{
|
|
}
|
|
|
|
public List<Edition> GetAllMonitoredEditions()
|
|
{
|
|
return Query(x => x.Monitored == true);
|
|
}
|
|
|
|
public Edition FindByForeignEditionId(string foreignEditionId)
|
|
{
|
|
var edition = Query(x => x.ForeignEditionId == foreignEditionId).SingleOrDefault();
|
|
|
|
return edition;
|
|
}
|
|
|
|
public List<Edition> GetEditionsForRefresh(int bookId, List<string> foreignEditionIds)
|
|
{
|
|
return Query(r => r.BookId == bookId || foreignEditionIds.Contains(r.ForeignEditionId));
|
|
}
|
|
|
|
public List<Edition> 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<Edition, Book>((e, b) => e.BookId == b.Id)
|
|
.LeftJoin<Book, AuthorMetadata>((b, a) => b.AuthorMetadataId == a.Id)
|
|
.Where<Edition>(r => r.BookId == id);
|
|
|
|
return _database.QueryJoined<Edition, Book, AuthorMetadata>(builder, (edition, book, metadata) =>
|
|
{
|
|
if (book != null)
|
|
{
|
|
book.AuthorMetadata = metadata;
|
|
edition.Book = book;
|
|
}
|
|
|
|
return edition;
|
|
}).ToList();
|
|
}
|
|
|
|
public List<Edition> FindByAuthor(int id)
|
|
{
|
|
return Query(Builder().Join<Edition, Book>((e, b) => e.BookId == b.Id)
|
|
.Join<Book, Author>((b, a) => b.AuthorMetadataId == a.AuthorMetadataId)
|
|
.Where<Author>(a => a.Id == id));
|
|
}
|
|
|
|
public List<Edition> FindByAuthorMetadataId(int authorMetadataId, bool onlyMonitored)
|
|
{
|
|
var builder = Builder().Join<Edition, Book>((e, b) => e.BookId == b.Id)
|
|
.Where<Book>(b => b.AuthorMetadataId == authorMetadataId);
|
|
|
|
if (onlyMonitored)
|
|
{
|
|
builder = builder.OrWhere<Edition>(e => e.Monitored == true);
|
|
builder = builder.OrWhere<Book>(b => b.AnyEditionOk == true);
|
|
}
|
|
|
|
return Query(builder);
|
|
}
|
|
|
|
public Edition FindByTitle(int authorMetadataId, string title)
|
|
{
|
|
return Query(Builder().Join<Edition, Book>((e, b) => e.BookId == b.Id)
|
|
.Where<Book>(b => b.AuthorMetadataId == authorMetadataId)
|
|
.Where<Edition>(e => e.Monitored == true)
|
|
.Where<Edition>(e => e.Title == title))
|
|
.FirstOrDefault();
|
|
}
|
|
|
|
public List<Edition> 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;
|
|
}
|
|
}
|
|
}
|