using NzbDrone.Core.Datastore; using System.Collections.Generic; using NLog; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Music { public interface ITrackRepository : IBasicRepository { List GetTracks(int artistId); List GetTracksByAlbum(int albumId); List GetTracksByRelease(int albumReleaseId); List GetTracksByReleases(List albumReleaseId); List GetTracksForRefresh(int albumReleaseId, IEnumerable foreignTrackIds); List GetTracksByFileId(int fileId); List GetTracksByFileId(IEnumerable ids); List TracksWithFiles(int artistId); List TracksWithoutFiles(int albumId); void SetFileId(List tracks); void DetachTrackFile(int trackFileId); } public class TrackRepository : BasicRepository, ITrackRepository { private readonly IMainDatabase _database; private readonly Logger _logger; public TrackRepository(IMainDatabase database, IEventAggregator eventAggregator, Logger logger) : base(database, eventAggregator) { _database = database; _logger = logger; } public List GetTracks(int artistId) { string query = string.Format("SELECT Tracks.* " + "FROM Artists " + "JOIN Albums ON Albums.ArtistMetadataId == Artists.ArtistMetadataId " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE Artists.Id = {0} " + "AND AlbumReleases.Monitored = 1", artistId); return Query.QueryText(query).ToList(); } public List GetTracksByAlbum(int albumId) { string query = string.Format("SELECT Tracks.* " + "FROM Albums " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE Albums.Id = {0} " + "AND AlbumReleases.Monitored = 1", albumId); return Query.QueryText(query).ToList(); } public List GetTracksByRelease(int albumReleaseId) { return Query.Where(t => t.AlbumReleaseId == albumReleaseId).ToList(); } public List GetTracksByReleases(List albumReleaseIds) { // this will populate the artist metadata also return Query .Join(Marr.Data.QGen.JoinType.Inner, t => t.ArtistMetadata, (l, r) => l.ArtistMetadataId == r.Id) .Where($"[AlbumReleaseId] IN ({string.Join(", ", albumReleaseIds)})") .ToList(); } public List GetTracksForRefresh(int albumReleaseId, IEnumerable foreignTrackIds) { return Query .Where(t => t.AlbumReleaseId == albumReleaseId) .OrWhere($"[ForeignTrackId] IN ('{string.Join("', '", foreignTrackIds)}')") .ToList(); } public List GetTracksByFileId(int fileId) { return Query.Where(e => e.TrackFileId == fileId).ToList(); } public List GetTracksByFileId(IEnumerable ids) { return Query.Where($"[TrackFileId] IN ({string.Join(", ", ids)})").ToList(); } public List TracksWithFiles(int artistId) { string query = string.Format("SELECT Tracks.* " + "FROM Artists " + "JOIN Albums ON Albums.ArtistMetadataId = Artists.ArtistMetadataId " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "JOIN TrackFiles ON TrackFiles.Id == Tracks.TrackFileId " + "WHERE Artists.Id == {0} " + "AND AlbumReleases.Monitored = 1 ", artistId); return Query.QueryText(query).ToList(); } public List TracksWithoutFiles(int albumId) { string query = string.Format("SELECT Tracks.* " + "FROM Albums " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "LEFT OUTER JOIN TrackFiles ON TrackFiles.Id == Tracks.TrackFileId " + "WHERE Albums.Id == {0} " + "AND AlbumReleases.Monitored = 1 " + "AND TrackFiles.Id IS NULL", albumId); return Query.QueryText(query).ToList(); } public void SetFileId(List tracks) { SetFields(tracks, t => t.TrackFileId); } public void DetachTrackFile(int trackFileId) { DataMapper.Update() .Where(x => x.TrackFileId == trackFileId) .ColumnsIncluding(x => x.TrackFileId) .Entity(new Track { TrackFileId = 0 }) .Execute(); } } }