using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Books { public interface IAuthorMetadataRepository : IBasicRepository { List FindById(List foreignIds); bool UpsertMany(List data); } public class AuthorMetadataRepository : BasicRepository, IAuthorMetadataRepository { private readonly Logger _logger; public AuthorMetadataRepository(IMainDatabase database, IEventAggregator eventAggregator, Logger logger) : base(database, eventAggregator) { _logger = logger; } public List FindById(List foreignIds) { return Query(x => Enumerable.Contains(foreignIds, x.ForeignAuthorId)); } public bool UpsertMany(List data) { var existingMetadata = FindById(data.Select(x => x.ForeignAuthorId).ToList()); var updateMetadataList = new List(); var addMetadataList = new List(); var upToDateMetadataCount = 0; foreach (var meta in data) { var existing = existingMetadata.SingleOrDefault(x => x.ForeignAuthorId == meta.ForeignAuthorId); if (existing != null) { // populate Id in remote data meta.UseDbFieldsFrom(existing); // responses vary, so try adding remote to what we have if (!meta.Equals(existing)) { updateMetadataList.Add(meta); } else { upToDateMetadataCount++; } } else { addMetadataList.Add(meta); } } UpdateMany(updateMetadataList); InsertMany(addMetadataList); _logger.Debug($"{upToDateMetadataCount} author metadata up to date; Updating {updateMetadataList.Count}, Adding {addMetadataList.Count} author metadata entries."); return updateMetadataList.Count > 0 || addMetadataList.Count > 0; } } }