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.
Lidarr/src/NzbDrone.Core/Music/Repositories/ArtistRepository.cs

98 lines
3.4 KiB

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<Artist>
{
bool ArtistPathExists(string path);
Artist FindByName(string cleanName);
Artist FindById(string foreignArtistId);
Dictionary<int, string> AllArtistPaths();
Dictionary<int, List<int>> AllArtistsTags();
Artist GetArtistByMetadataId(int artistMetadataId);
List<Artist> GetArtistByMetadataId(IEnumerable<int> artistMetadataId);
}
public class ArtistRepository : BasicRepository<Artist>, IArtistRepository
{
public ArtistRepository(IMainDatabase database,
IEventAggregator eventAggregator)
: base(database, eventAggregator)
{
}
protected override SqlBuilder Builder() => new SqlBuilder(_database.DatabaseType)
.Join<Artist, ArtistMetadata>((a, m) => a.ArtistMetadataId == m.Id);
protected override List<Artist> Query(SqlBuilder builder) => Query(_database, builder).ToList();
public static IEnumerable<Artist> Query(IDatabase database, SqlBuilder builder)
{
return database.QueryJoined<Artist, ArtistMetadata>(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<ArtistMetadata>(m => m.ForeignArtistId == foreignArtistId)).SingleOrDefault();
if (artist == null)
{
artist = Query(Builder().Where<ArtistMetadata>(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<int, string> AllArtistPaths()
{
using (var conn = _database.OpenConnection())
{
var strSql = "SELECT \"Id\" AS \"Key\", \"Path\" AS \"Value\" FROM \"Artists\"";
return conn.Query<KeyValuePair<int, string>>(strSql).ToDictionary(x => x.Key, x => x.Value);
}
}
public Dictionary<int, List<int>> 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<KeyValuePair<int, List<int>>>(strSql).ToDictionary(x => x.Key, x => x.Value);
}
}
public List<Artist> GetArtistByMetadataId(IEnumerable<int> artistMetadataIds)
{
return Query(s => artistMetadataIds.Contains(s.ArtistMetadataId));
}
}
}