コード例 #1
0
        /// <summary>
        /// Returns transition type if combination of
        /// status of current and previous revision represents one.
        /// </summary>
        /// <remarks>
        /// State groups:
        /// ----------------------------------------------------
        /// DontExist   :
        /// ForAnalysis : open, reopen
        /// Postponed   : analysed, suspend
        /// ForWork     : to_be_assigned, assigned, active
        /// ForTesting  : invalid, duplicate, works_for_me, fixed,
        ///               modelling, regression, test_cases
        /// Finished    : verified, closed, deleted
        ///
        /// Allowed transitions:
        /// ------------------------------------------------------------------
        /// +) Added       : (DontExist, ForTesting, Finished)->(ForAnalysis)
        /// +) Removed     : (ForAnalysis, ForWork, Postponed)->(ForTesting)
        /// +) Postponed   : (ForAnalysis, ForWork)->(Postponed)
        /// +) Reactivated : (Postponed)->(ForAnalysis, ForWork)
        ///
        /// It also catches disallowed transitions:
        /// +) (ForAnalysis, Postponed, ForWork)->(Finished)
        /// +) (Finished)->(ForAnalysis, Postponed, ForWork)
        /// </remarks>
        private static StatusTransition GetStatusTransition(Revision prevRevision,
                                                            Revision curRevision)
        {
            Debug.Assert(curRevision != null);

            StatusGroup statusGroupPrev = GetStateGroup(prevRevision);
            StatusGroup statusGroupCur  = GetStateGroup(curRevision);

            IDictionary <StatusGroup[], StatusTransition> allowed =
                new Dictionary <StatusGroup[], StatusTransition>(new StateGroupMappingComparer());

            // +) Added       : (DontExist, ForTesting, Finished)->(ForAnalysis)
            allowed.Add(new[] { StatusGroup.DontExist, StatusGroup.ForAnalysis }, StatusTransition.Added);
            allowed.Add(new[] { StatusGroup.ForTesting, StatusGroup.ForAnalysis }, StatusTransition.Added);
            allowed.Add(new[] { StatusGroup.Finished, StatusGroup.ForAnalysis }, StatusTransition.Added);
            // +) Removed     : (ForAnalysis, ForWork, Postponed)->(ForTesting)
            allowed.Add(new[] { StatusGroup.ForAnalysis, StatusGroup.ForTesting }, StatusTransition.Removed);
            allowed.Add(new[] { StatusGroup.ForWork, StatusGroup.ForTesting }, StatusTransition.Removed);
            allowed.Add(new[] { StatusGroup.Postponed, StatusGroup.ForTesting }, StatusTransition.Removed);
            // +) Postponed   : (ForAnalysis, ForWork)->(Postponed)
            allowed.Add(new[] { StatusGroup.ForAnalysis, StatusGroup.Postponed }, StatusTransition.Postponed);
            allowed.Add(new[] { StatusGroup.ForWork, StatusGroup.Postponed }, StatusTransition.Postponed);
            // +) Reactivated : (Postponed)->(ForAnalysis, ForWork)
            allowed.Add(new[] { StatusGroup.Postponed, StatusGroup.ForAnalysis }, StatusTransition.Reactivated);
            allowed.Add(new[] { StatusGroup.Postponed, StatusGroup.ForWork }, StatusTransition.Reactivated);

            IDictionary <StatusGroup[], StatusTransition> forbidden =
                new Dictionary <StatusGroup[], StatusTransition>(new StateGroupMappingComparer());

            // +) (ForAnalysis, Postponed, ForWork)->(Finished)
            forbidden.Add(new[] { StatusGroup.ForAnalysis, StatusGroup.Finished }, StatusTransition.None);
            forbidden.Add(new[] { StatusGroup.Postponed, StatusGroup.Finished }, StatusTransition.None);
            forbidden.Add(new[] { StatusGroup.ForWork, StatusGroup.Finished }, StatusTransition.None);
            // +) (Finished)->(ForAnalysis, Postponed, ForWork)
            forbidden.Add(new[] { StatusGroup.Finished, StatusGroup.ForAnalysis }, StatusTransition.None);
            forbidden.Add(new[] { StatusGroup.Finished, StatusGroup.Postponed }, StatusTransition.None);
            forbidden.Add(new[] { StatusGroup.Finished, StatusGroup.ForWork }, StatusTransition.None);

            StatusTransition transition;// = StatusTransition.None;
            // First try to find in allowed transitions
            var key = new[] { statusGroupPrev, statusGroupCur };

            if (!allowed.TryGetValue(key, out transition))
            {
                // Next in forbidded - report
                if (forbidden.TryGetValue(key, out transition))
                {
                    Debug.Fail("Forbidden transition detected.");
                }
                else
                {
                    // If neither - then None
                    transition = StatusTransition.None;
                }
            }
            return(transition);
        }
コード例 #2
0
        protected IEnumerable <uint> GetAccounts()
        {
            IReadOnlyCollection <uint> result = Database.GetAccountIds();

            FilterTypes filteredBy = FilterTypes.empty;

            FilterTypes filteredByUnion = FilterTypes.empty;

            if (_filters.ContainsAll(FilterTypes.interests_any | FilterTypes.likes_all))
            {
                _filters = _filters.ResetFlags(FilterTypes.likes_all);
                if (likes.Count == 1)
                {
                    return(LikesIndexer.GetAllWhoLikes(likes[0]));
                }
                foreach (var likee in likes)
                {
                    _intersect.Add(LikesIndexer.GetAllWhoLikes(likee));
                }

                foreach (var interest in interestIndexes)
                {
                    _intersect.Add(StringIndexer.Interests.GetList(interest));
                }

                _filters = _filters.ResetFlags(FilterTypes.interests_any);
                return(_intersect);
            }


            if (_filters.ContainsAll(FilterTypes.fname_any | FilterTypes.sex_eq))
            {
                if (fnamesIndexes == null || fnamesIndexes.Count == 0)
                {
                    return(Array.Empty <uint>());
                }

                var probeNameList = StringIndexer.FirstNames.GetList(fnamesIndexes[0]);
                var probeSex      = Database.GetAccount(probeNameList[0]).SexStatus & SexStatus.AllSex;

                if ((probeSex & _sexStatus) == SexStatus.None)
                {
                    return(Array.Empty <uint>());
                }
            }

            if (_filters.ContainsAll(FilterTypes.birth_year) &&
                _filters.ContainsAny(FilterTypes.cities_all_types) &&
                _filters.ContainsAny(FilterTypes.sex_status_all_types))
            {
                ref StatusGroup filtered  = ref GroupIndex.SexGroupByCity(cityIndex);
                var             birthYear = (ushort)birth;
                var             list      = filtered.GetListBy(_sexStatus, birthYear, _union);
                _filters = _filters.ResetFlags(FilterTypes.birth_year | FilterTypes.cities_all_types | FilterTypes.sex_status_all_types);
                return(list);
            }
コード例 #3
0
        public void AddStatusGroup(StatusGroup statusGroup)
        {
            if (this.StatusGroups == null)
            {
                this.StatusGroups = new ItemsDictionary <StatusGroup>();
            }

            if (statusGroup != null && statusGroup.Id != null)
            {
                this.StatusGroups.Add(statusGroup.Id, statusGroup);
            }
        }
コード例 #4
0
    public void AddStatusGroup(StatusGroup sg)
    {
        if (statusGroups.ContainsKey(sg.GetHashCode()))
        {
            statusGroups[sg.GetHashCode()].MergeStatus(sg);
        }
        else
        {
            statusGroups.Add(sg.GetHashCode(), sg);

            BattleManager bm = GameObject.FindGameObjectWithTag(Constants.BM.Tag).GetComponent <BattleManager>();
            if (sg.showIcon)
            {
                bm.AddStatusIconToUI();
            }
            Debug.Log($"Entity {this.name} added {sg.ToString()}, has {statusGroups.Count} statuses.");
        }
    }
コード例 #5
0
        void ReleaseDesignerOutlets()
        {
            if (CommandButton != null)
            {
                CommandButton.Dispose();
                CommandButton = null;
            }

            if (StatusGroup != null)
            {
                StatusGroup.Dispose();
                StatusGroup = null;
            }

            if (StatusLabel != null)
            {
                StatusLabel.Dispose();
                StatusLabel = null;
            }
        }
コード例 #6
0
        /// <summary>
        /// Returns status group for the revision.
        /// </summary>
        /// <remarks>
        /// DontExist   :
        /// ForAnalysis : open, reopen
        /// Postponed   : analysed, suspend
        /// ForWork     : to_be_assigned, assigned, active
        /// ForTesting  : invalid, duplicate, works_for_me, fixed,
        ///               modelling, regression, test_cases
        /// Finished    : verified, closed, deleted
        /// </remarks>
        private static StatusGroup GetStateGroup(Revision revision)
        {
            StatusGroup statusGroup = StatusGroup.DontExist;

            IDictionary <BugStatus, StatusGroup> mapping = new Dictionary <BugStatus, StatusGroup>();

            /// ForAnalysis : open, reopen
            mapping.Add(BugStatus.Open, StatusGroup.ForAnalysis);
            mapping.Add(BugStatus.Reopen, StatusGroup.ForAnalysis);
            /// Postponed   : analysed, suspend
            mapping.Add(BugStatus.Analyzed, StatusGroup.Postponed);
            mapping.Add(BugStatus.Suspend, StatusGroup.Postponed);
            /// ForWork     : to_be_assigned, assigned, active
            mapping.Add(BugStatus.ToBeAssigned, StatusGroup.ForWork);
            mapping.Add(BugStatus.Assigned, StatusGroup.ForWork);
            mapping.Add(BugStatus.Active, StatusGroup.ForWork);
            /// ForTesting  : invalid, duplicate, works_for_me, fixed,
            ///               modelling, regression, test_cases
            mapping.Add(BugStatus.Invalid, StatusGroup.ForTesting);
            mapping.Add(BugStatus.Duplicate, StatusGroup.ForTesting);
            mapping.Add(BugStatus.WorksForMe, StatusGroup.ForTesting);
            mapping.Add(BugStatus.Fixed, StatusGroup.ForTesting);
            mapping.Add(BugStatus.Modeling, StatusGroup.ForTesting);
            mapping.Add(BugStatus.Regression, StatusGroup.ForTesting);
            mapping.Add(BugStatus.TestCases, StatusGroup.ForTesting);
            /// Finished    : verified, closed, deleted
            mapping.Add(BugStatus.Verified, StatusGroup.Finished);
            mapping.Add(BugStatus.Closed, StatusGroup.Finished);
            mapping.Add(BugStatus.Deleted, StatusGroup.Finished);

            // If revision didn't exist - then group is DontExist
            if (revision != null)
            {
                // Get status group (treat empty status as if but is just open)
                Debug.Assert(mapping.TryGetValue(revision.Status,
                                                 out statusGroup));
            }
            return(statusGroup);
        }
コード例 #7
0
 public void RemoveStatusGroup(StatusGroup sg)
 {
     Debug.Log($"Entity {this.name} removes {sg.ToString()}, has {statusGroups.Count} statuses.");
     statusGroups.Remove(sg.GetHashCode());
 }
コード例 #8
0
 public virtual void MergeStatus(StatusGroup another)
 {
     // TODO: Merge two status group with the same effect
 }
コード例 #9
0
 public override void MergeStatus(StatusGroup another)
 {
     // TODO: Merge
     base.MergeStatus(another);
 }