/// <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 <GroupFilter> grpFilters = _groupFilterRepo.GetAll(session); ILookup <int, int> groupsForTagGroupFilter = _groupFilterRepo.CalculateAnimeGroupsPerTagGroupFilter(session); IReadOnlyList <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 => { var userGroupIds = filter.GroupsIds; userGroupIds.Clear(); if (filter.FilterType == (int)GroupFilterType.Tag) { foreach (var user in users) { userGroupIds[user.JMMUserID] = groupsForTagGroupFilter[filter.GroupFilterID].ToHashSet(); } } else // All other group filters are to be handled normally { filter.EvaluateAnimeGroups(); } filter.UpdateEntityReferenceStrings(updateGroups: true, updateSeries: false); }); _groupFilterRepo.BatchUpdate(session, grpFilters); _log.Info("Group Filters updated"); }