using System.Collections.Generic; using System.Linq; using Dapper; using NzbDrone.Common.Extensions; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Music { public interface IArtistRepository : IBasicRepository { bool ArtistPathExists(string path); Artist FindByName(string cleanName); Artist FindById(string foreignArtistId); Dictionary AllArtistPaths(); Dictionary> AllArtistsTags(); Artist GetArtistByMetadataId(int artistMetadataId); List GetArtistByMetadataId(IEnumerable artistMetadataId); } public class ArtistRepository : BasicRepository, IArtistRepository { public ArtistRepository(IMainDatabase database, IEventAggregator eventAggregator) : base(database, eventAggregator) { } protected override SqlBuilder Builder() => new SqlBuilder(_database.DatabaseType) .Join((a, m) => a.ArtistMetadataId == m.Id); protected override List Query(SqlBuilder builder) => Query(_database, builder).ToList(); public static IEnumerable Query(IDatabase database, SqlBuilder builder) { return database.QueryJoined(builder, (artist, metadata) => { artist.Metadata = metadata; return artist; }); } public bool ArtistPathExists(string path) { return Query(c => c.Path == path).Any(); } public Artist FindById(string foreignArtistId) { Artist artist; artist = Query(Builder().Where(m => m.ForeignArtistId == foreignArtistId)).SingleOrDefault(); if (artist == null) { artist = Query(Builder().Where(x => x.OldForeignArtistIds.Contains(foreignArtistId))).SingleOrDefault(); } return artist; } public Artist FindByName(string cleanName) { cleanName = cleanName.ToLowerInvariant(); return Query(s => s.CleanName == cleanName).ExclusiveOrDefault(); } public Artist GetArtistByMetadataId(int artistMetadataId) { return Query(s => s.ArtistMetadataId == artistMetadataId).SingleOrDefault(); } public Dictionary AllArtistPaths() { using (var conn = _database.OpenConnection()) { var strSql = "SELECT \"Id\" AS \"Key\", \"Path\" AS \"Value\" FROM \"Artists\""; return conn.Query>(strSql).ToDictionary(x => x.Key, x => x.Value); } } public Dictionary> AllArtistsTags() { using (var conn = _database.OpenConnection()) { var strSql = "SELECT \"Id\" AS \"Key\", \"Tags\" AS \"Value\" FROM \"Artists\" WHERE \"Tags\" IS NOT NULL"; return conn.Query>>(strSql).ToDictionary(x => x.Key, x => x.Value); } } public List GetArtistByMetadataId(IEnumerable artistMetadataIds) { return Query(s => artistMetadataIds.Contains(s.ArtistMetadataId)); } } }