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.
Readarr/src/NzbDrone.Core/Books/Repositories/EditionRepository.cs

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;
}
}
}