diff --git a/JSMR.Infrastructure/Ingestion/VoiceWorkSearchUpdater.cs b/JSMR.Infrastructure/Ingestion/VoiceWorkSearchUpdater.cs index 28c10fd..8535b51 100644 --- a/JSMR.Infrastructure/Ingestion/VoiceWorkSearchUpdater.cs +++ b/JSMR.Infrastructure/Ingestion/VoiceWorkSearchUpdater.cs @@ -21,11 +21,21 @@ public class VoiceWorkSearchUpdater(AppDbContext dbContext) : IVoiceWorkSearchUp .Include(vw => vw.EnglishVoiceWorks) .ToListAsync(cancellationToken); + Dictionary existingSearches = await dbContext.VoiceWorkSearches + .Where(s => voiceWorkIds.Contains(s.VoiceWorkId)) + .ToDictionaryAsync(s => s.VoiceWorkId, cancellationToken); + + int[] tagIds = [.. batch.SelectMany(vw => vw.Tags).Select(vwt => vwt.TagId).Distinct()]; + + Dictionary englishTags = await dbContext.EnglishTags + .Where(et => tagIds.Contains(et.TagId)) + .ToDictionaryAsync(et => et.TagId, cancellationToken); + foreach (var voiceWork in batch) { try { - UpdateSearchText(voiceWork); + UpdateSearchText(voiceWork, existingSearches, englishTags); } catch (Exception ex) { @@ -33,17 +43,14 @@ public class VoiceWorkSearchUpdater(AppDbContext dbContext) : IVoiceWorkSearchUp } } - dbContext.SaveChanges(); + await dbContext.SaveChangesAsync(cancellationToken); } - private void UpdateSearchText(VoiceWork voiceWork) + private void UpdateSearchText(VoiceWork voiceWork, Dictionary existingSearches, Dictionary englishTags) { - string searchText = GetSearchText(voiceWork); + string searchText = GetSearchText(voiceWork, englishTags); - var searchEntry = dbContext.VoiceWorkSearches - .FirstOrDefault(s => s.VoiceWorkId == voiceWork.VoiceWorkId); - - if (searchEntry == null) + if (!existingSearches.TryGetValue(voiceWork.VoiceWorkId, out var searchEntry)) { dbContext.VoiceWorkSearches.Add(new VoiceWorkSearch { @@ -53,11 +60,14 @@ public class VoiceWorkSearchUpdater(AppDbContext dbContext) : IVoiceWorkSearchUp } else { - searchEntry.SearchText = searchText; + if (!string.Equals(searchEntry.SearchText, searchText, StringComparison.Ordinal)) + { + searchEntry.SearchText = searchText; + } } } - private string GetSearchText(VoiceWork voiceWork) + private string GetSearchText(VoiceWork voiceWork, Dictionary englishTags) { var english = voiceWork.EnglishVoiceWorks.FirstOrDefault(); @@ -80,12 +90,8 @@ public class VoiceWorkSearchUpdater(AppDbContext dbContext) : IVoiceWorkSearchUp AppendRaw(sb, tag.Name); - var englishTag = dbContext.EnglishTags.FirstOrDefault(et => et.TagId == tag.TagId); - - if (englishTag is null) - continue; - - AppendRaw(sb, englishTag?.Name); + if (englishTags.TryGetValue(tag.TagId, out var englishTag)) + AppendRaw(sb, englishTag.Name); } foreach (var creator in voiceWork.Creators.Select(vwc => vwc.Creator)) diff --git a/JSMR.Tests/JSMR.Tests.csproj b/JSMR.Tests/JSMR.Tests.csproj index e958e81..4745855 100644 --- a/JSMR.Tests/JSMR.Tests.csproj +++ b/JSMR.Tests/JSMR.Tests.csproj @@ -26,7 +26,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/JSMR.Worker/JSMR.Worker.csproj b/JSMR.Worker/JSMR.Worker.csproj index 9dbcec5..3508b09 100644 --- a/JSMR.Worker/JSMR.Worker.csproj +++ b/JSMR.Worker/JSMR.Worker.csproj @@ -31,7 +31,7 @@ - +