示例#1
0
        /// <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");
        }
示例#2
0
        /// <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");
        }
        /// <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");
        }