/// <summary> /// Updates all Group Filters. This should be done as the last step. /// </summary> /// <remarks> /// Assumes that all caches are up to date. /// </remarks> private void UpdateGroupFilters(ISessionWrapper session) { _log.Info("Updating Group Filters"); _log.Info("Calculating Tag Filters"); ServerState.Instance.DatabaseBlocked = new ServerState.DatabaseBlockedInfo { Blocked = true, Status = "Calculating Tag Filters" }; _groupFilterRepo.CalculateAnimeSeriesPerTagGroupFilter(session); _log.Info("Calculating All Other Filters"); ServerState.Instance.DatabaseBlocked = new ServerState.DatabaseBlockedInfo { Blocked = true, Status = "Calculating Non-Tag Filters" }; IEnumerable <SVR_GroupFilter> grpFilters = _groupFilterRepo.GetAll(session).Where(a => a.FilterType != (int)GroupFilterType.Tag && ((GroupFilterType)a.FilterType & GroupFilterType.Directory) == 0).ToList(); // The main reason for doing this in parallel is because UpdateEntityReferenceStrings does JSON encoding // and is enough work that it can benefit from running in parallel Parallel.ForEach( grpFilters, filter => { filter.SeriesIds.Clear(); filter.CalculateGroupsAndSeries(); filter.UpdateEntityReferenceStrings(); }); using (ITransaction trans = session.BeginTransaction()) { _groupFilterRepo.BatchUpdate(session, grpFilters); trans.Commit(); } _log.Info("Group Filters updated"); }
/// <summary> /// Updates all Group Filters. This should be done as the last step. /// </summary> /// <remarks> /// Assumes that all caches are up to date. /// </remarks> private void UpdateGroupFilters(ISessionWrapper session) { _log.Info("Updating Group Filters"); IReadOnlyList <SVR_GroupFilter> grpFilters = _groupFilterRepo.GetAll(session); ILookup <int, int> seriesForTagGroupFilter = _groupFilterRepo.CalculateAnimeSeriesPerTagGroupFilter(session); IReadOnlyList <SVR_JMMUser> users = _userRepo.GetAll(); // The main reason for doing this in parallel is because UpdateEntityReferenceStrings does JSON encoding // and is enough work that it can benefit from running in parallel Parallel.ForEach( grpFilters.Where(f => ((GroupFilterType)f.FilterType & GroupFilterType.Directory) != GroupFilterType.Directory), filter => { filter.SeriesIds.Clear(); if (filter.FilterType == (int)GroupFilterType.Tag) { filter.SeriesIds[0] = seriesForTagGroupFilter[filter.GroupFilterID].ToHashSet(); filter.GroupsIds[0] = filter.SeriesIds[0] .Select(id => RepoFactory.AnimeSeries.GetByID(id).TopLevelAnimeGroup?.AnimeGroupID ?? -1) .Where(id => id != -1).ToHashSet(); foreach (var user in users) { filter.SeriesIds[user.JMMUserID] = seriesForTagGroupFilter[filter.GroupFilterID] .Select(id => RepoFactory.AnimeSeries.GetByID(id)) .Where(ser => !(ser.GetAnime()?.GetAllTags()?.FindInEnumerable(user.GetHideCategories()) ?? false)).Select(a => a.AnimeSeriesID).ToHashSet(); filter.GroupsIds[user.JMMUserID] = filter.SeriesIds[user.JMMUserID] .Select(id => RepoFactory.AnimeSeries.GetByID(id).TopLevelAnimeGroup?.AnimeGroupID ?? -1) .Where(id => id != -1).ToHashSet(); } } else // All other group filters are to be handled normally { filter.CalculateGroupsAndSeries(); } filter.UpdateEntityReferenceStrings(); }); _groupFilterRepo.BatchUpdate(session, grpFilters); _log.Info("Group Filters updated"); }