using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Datastore; using NzbDrone.Core.MediaFiles; 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 albumReleaseIds); List GetTracksForRefresh(int albumReleaseId, List 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 { public TrackRepository(IMainDatabase database, IEventAggregator eventAggregator) : base(database, eventAggregator) { } public List GetTracks(int artistId) { return Query(Builder() .Join((t, r) => t.AlbumReleaseId == r.Id) .Join((r, a) => r.AlbumId == a.Id) .Join((album, artist) => album.ArtistMetadataId == artist.ArtistMetadataId) .Where(r => r.Monitored == true) .Where(x => x.Id == artistId)); } public List GetTracksByAlbum(int albumId) { return Query(Builder() .Join((t, r) => t.AlbumReleaseId == r.Id) .Join((r, a) => r.AlbumId == a.Id) .Where(r => r.Monitored == true) .Where(x => x.Id == albumId)); } public List GetTracksByRelease(int albumReleaseId) { return Query(t => t.AlbumReleaseId == albumReleaseId).ToList(); } public List GetTracksByReleases(List albumReleaseIds) { // this will populate the artist metadata also return _database.QueryJoined(Builder() .Join((l, r) => l.ArtistMetadataId == r.Id) .Where(x => albumReleaseIds.Contains(x.AlbumReleaseId)), (track, metadata) => { track.ArtistMetadata = metadata; return track; }).ToList(); } public List GetTracksForRefresh(int albumReleaseId, List foreignTrackIds) { return Query(a => a.AlbumReleaseId == albumReleaseId || foreignTrackIds.Contains(a.ForeignTrackId)); } public List GetTracksByFileId(int fileId) { return Query(e => e.TrackFileId == fileId); } public List GetTracksByFileId(IEnumerable ids) { return Query(x => ids.Contains(x.TrackFileId)); } public List TracksWithFiles(int artistId) { return Query(Builder() .Join((t, r) => t.AlbumReleaseId == r.Id) .Join((r, a) => r.AlbumId == a.Id) .Join((album, artist) => album.ArtistMetadataId == artist.ArtistMetadataId) .Join((t, f) => t.TrackFileId == f.Id) .Where(r => r.Monitored == true) .Where(x => x.Id == artistId)); } public List TracksWithoutFiles(int albumId) { // x.Id == null is converted to SQL, so warning incorrect #pragma warning disable CS0472 return Query(Builder() .Join((t, r) => t.AlbumReleaseId == r.Id) .LeftJoin((t, f) => t.TrackFileId == f.Id) .Where(r => r.Monitored == true && r.AlbumId == albumId) .Where(x => x.Id == null)); #pragma warning restore CS0472 } public void SetFileId(List tracks) { SetFields(tracks, t => t.TrackFileId); } public void DetachTrackFile(int trackFileId) { var tracks = GetTracksByFileId(trackFileId); tracks.ForEach(x => x.TrackFileId = 0); SetFileId(tracks); } } }