using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Music { public interface IArtistMetadataRepository : IBasicRepository { List FindById(List foreignIds); bool UpsertMany(List data); } public class ArtistMetadataRepository : BasicRepository, IArtistMetadataRepository { private readonly Logger _logger; public ArtistMetadataRepository(IMainDatabase database, IEventAggregator eventAggregator, Logger logger) : base(database, eventAggregator) { _logger = logger; } public List FindById(List foreignIds) { return Query(x => Enumerable.Contains(foreignIds, x.ForeignArtistId)); } public bool UpsertMany(List data) { var existingMetadata = FindById(data.Select(x => x.ForeignArtistId).ToList()); var updateMetadataList = new List(); var addMetadataList = new List(); var upToDateMetadataCount = 0; foreach (var meta in data) { var existing = existingMetadata.SingleOrDefault(x => x.ForeignArtistId == meta.ForeignArtistId); if (existing != null) { meta.UseDbFieldsFrom(existing); if (!meta.Equals(existing)) { updateMetadataList.Add(meta); } else { upToDateMetadataCount++; } } else { addMetadataList.Add(meta); } } UpdateMany(updateMetadataList); InsertMany(addMetadataList); _logger.Debug($"{upToDateMetadataCount} artist metadata up to date; Updating {updateMetadataList.Count}, Adding {addMetadataList.Count} artist metadata entries."); return updateMetadataList.Count > 0 || addMetadataList.Count > 0; } } }