private SpWho2Session GetBlocker(SpWho2Session session, IEnumerable <SpWho2Session> allSessions) { if (string.IsNullOrWhiteSpace(session.BlkBy)) { // current session isn't blocked by any other -> so it's a blocker! :D return(session); } else { var blocker = allSessions.Single(x => x.SPID == Convert.ToInt32(session.BlkBy)); return(GetBlocker(blocker, allSessions)); } }
public IEnumerable <SpWho2Session> GetBlockers(IEnumerable <SpWho2Session> sessions) { var blockers = new List <SpWho2Session>(); var blockedSessions = new List <SpWho2Session>(); foreach (SpWho2Session session in sessions) { // trim default empty value = " ." session.BlkBy = session.BlkBy.Replace(" .", "").Trim(); if (!string.IsNullOrWhiteSpace(session.BlkBy)) { blockedSessions.Add(session); } } if (blockedSessions.Any()) { var groupedByBlockId = blockedSessions.GroupBy(x => x.BlkBy); log.Debug($"Blocked '{blockedSessions.Count()}' sessions by '{groupedByBlockId.Count()} blockers"); foreach (var grouped in groupedByBlockId) { // every item in 'grouped' has the same BlkBy ID SpWho2Session blockedSession = grouped.First(); SpWho2Session blocker = GetBlocker(blockedSession, sessions); if (!blockers.Contains(blocker)) { blockers.Add(blocker); } } } return(blockers); }
public void GetBlockers() { // Arrange int semiBlockerOne = 22; int semiBlockerTwo = 24; var blockerFirst = new SpWho2Session { SPID = 11, BlkBy = " ." }; var blockerSecond = new SpWho2Session { SPID = 999, BlkBy = " ." }; var blockerThird = new SpWho2Session { SPID = 4444, BlkBy = " ." }; var sessions = new List <SpWho2Session>() { blockerFirst, new SpWho2Session { SPID = semiBlockerOne, BlkBy = blockerFirst.SPID.ToString() }, new SpWho2Session { SPID = semiBlockerTwo, BlkBy = blockerFirst.SPID.ToString() }, new SpWho2Session { SPID = 30, BlkBy = semiBlockerOne.ToString() }, new SpWho2Session { SPID = 40, BlkBy = semiBlockerTwo.ToString() }, new SpWho2Session { SPID = 50, BlkBy = semiBlockerOne.ToString() }, new SpWho2Session { SPID = 60, BlkBy = blockerSecond.SPID.ToString() }, new SpWho2Session { SPID = 70, BlkBy = blockerSecond.SPID.ToString() }, blockerSecond, new SpWho2Session { SPID = 80, BlkBy = blockerThird.SPID.ToString() }, new SpWho2Session { SPID = 90, BlkBy = blockerThird.SPID.ToString() }, blockerThird, new SpWho2Session { SPID = 91, BlkBy = blockerThird.SPID.ToString() }, new SpWho2Session { SPID = 92, BlkBy = blockerThird.SPID.ToString() }, }; _repoMock.Setup(x => x.GetSessions()).Returns(sessions); // Act IEnumerable <SpWho2Session> blockers = _msSqlService.GetBlockers(sessions); // Assert blockers.Should().NotBeNullOrEmpty() .And.HaveCount(3) .And.Contain(new SpWho2Session[] { blockerFirst, blockerSecond, blockerThird }); }