Optimize O(n*m) Contains patterns with HashSet

- MovieService.FindByTitle: Convert title lists to HashSets
- MoviesSearchService: Convert queue IDs to HashSet
This commit is contained in:
admin 2025-12-19 13:11:07 -06:00
parent 0e5abe56f0
commit dda89e2fda
2 changed files with 12 additions and 11 deletions

View file

@ -62,8 +62,8 @@ public void Execute(MissingMoviesSearchCommand message)
var movies = _movieService.MoviesWithoutFiles(pagingSpec).Records.ToList();
var queue = _queueService.GetQueue().Where(q => q.Movie != null).Select(q => q.Movie.Id);
var missing = movies.Where(e => !queue.Contains(e.Id)).ToList();
var queuedMovieIds = new HashSet<int>(_queueService.GetQueue().Where(q => q.Movie != null).Select(q => q.Movie.Id));
var missing = movies.Where(e => !queuedMovieIds.Contains(e.Id)).ToList();
SearchForBulkMovies(missing, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult();
}
@ -82,8 +82,8 @@ public void Execute(CutoffUnmetMoviesSearchCommand message)
var movies = _movieCutoffService.MoviesWhereCutoffUnmet(pagingSpec).Records.ToList();
var queue = _queueService.GetQueue().Where(q => q.Movie != null).Select(q => q.Movie.Id);
var missing = movies.Where(e => !queue.Contains(e.Id)).ToList();
var queuedMovieIds = new HashSet<int>(_queueService.GetQueue().Where(q => q.Movie != null).Select(q => q.Movie.Id));
var missing = movies.Where(e => !queuedMovieIds.Contains(e.Id)).ToList();
SearchForBulkMovies(missing, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult();
}

View file

@ -125,31 +125,32 @@ public Movie FindByTitle(string title, int year)
public Movie FindByTitle(List<string> titles, int? year, List<string> otherTitles, List<Movie> candidates)
{
var cleanTitles = titles.Select(t => t.CleanMovieTitle().ToLowerInvariant());
var cleanTitlesSet = new HashSet<string>(titles.Select(t => t.CleanMovieTitle().ToLowerInvariant()));
var otherTitlesSet = new HashSet<string>(otherTitles);
var result = candidates.Where(x => cleanTitles.Contains(x.MovieMetadata.Value.CleanTitle) || cleanTitles.Contains(x.MovieMetadata.Value.CleanOriginalTitle))
var result = candidates.Where(x => cleanTitlesSet.Contains(x.MovieMetadata.Value.CleanTitle) || cleanTitlesSet.Contains(x.MovieMetadata.Value.CleanOriginalTitle))
.AllWithYear(year)
.ToList();
if (result == null || result.Count == 0)
{
result =
candidates.Where(movie => otherTitles.Contains(movie.MovieMetadata.Value.CleanTitle)).AllWithYear(year).ToList();
candidates.Where(movie => otherTitlesSet.Contains(movie.MovieMetadata.Value.CleanTitle)).AllWithYear(year).ToList();
}
if (result == null || result.Count == 0)
{
result = candidates
.Where(m => m.MovieMetadata.Value.AlternativeTitles.Any(t => cleanTitles.Contains(t.CleanTitle) ||
otherTitles.Contains(t.CleanTitle)))
.Where(m => m.MovieMetadata.Value.AlternativeTitles.Any(t => cleanTitlesSet.Contains(t.CleanTitle) ||
otherTitlesSet.Contains(t.CleanTitle)))
.AllWithYear(year).ToList();
}
if (result == null || result.Count == 0)
{
result = candidates
.Where(m => m.MovieMetadata.Value.Translations.Any(t => cleanTitles.Contains(t.CleanTitle) ||
otherTitles.Contains(t.CleanTitle)))
.Where(m => m.MovieMetadata.Value.Translations.Any(t => cleanTitlesSet.Contains(t.CleanTitle) ||
otherTitlesSet.Contains(t.CleanTitle)))
.AllWithYear(year).ToList();
}