public void CalculateNewEstimates() { SqlConnection connection = new SqlConnection(_connectionString); connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); var jtlGateway = new JamTimeLimitGateway(connection, transaction); if (_jams == null) { _jams = new JamGateway(connection, transaction).GetUnestimatedJams(); } if (_penaltyGroups == null) { _penaltyGroups = new PenaltyGroupGateway(connection, transaction).GetUnestimatedPenaltyGroups(); } Dictionary <int, int> jamBoutMap; Dictionary <int, Jam> jamMap; Dictionary <int, IGrouping <int, PenaltyGroup> > penaltyGroupMap; // we only want the jams that haven't already been estimated var estimatedJams = jtlGateway.GetAllJamTimeEstimates().ToDictionary(jte => jte.JamID); var neededJams = _jams.Where(j => !estimatedJams.ContainsKey(j.ID)); jamBoutMap = neededJams.ToDictionary(j => j.ID, j => j.BoutID); jamMap = neededJams.ToDictionary(j => j.ID); _penaltyGroups = _penaltyGroups.Where(pg => jamMap.ContainsKey(pg.BoxTimes.First().JamID)).ToList(); penaltyGroupMap = _penaltyGroups.GroupBy(pg => jamBoutMap[pg.BoxTimes.First().JamID]).ToDictionary(gp => gp.Key); var boutJams = jamMap.Values.GroupBy(j => j.BoutID); var jamEstimateMap = CalculateJamDurationLimits(connection, transaction, jamMap); foreach (IGrouping <int, Jam> boutJamSet in boutJams) { ProcessBout(boutJamSet, penaltyGroupMap[boutJamSet.Key], jamEstimateMap); } var boxTimeEstimates = CalculateBoxTimeEstimates(jamEstimateMap); jtlGateway.InsertJamTimeEstimates(jamEstimateMap.Values, false); new BoxTimeEstimateGateway(connection, transaction).InsertBoxTimeEstimates(boxTimeEstimates, false); transaction.Commit(); connection.Close(); }
public void CalculateDurationEstimates() { SqlConnection connection = new SqlConnection(_connectionString); connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); var jtlGateway = new JamTimeLimitGateway(connection, transaction); if (_jams == null) { _jams = new JamGateway(connection, transaction).GetAllJams(); } if (_penaltyGroups == null) { _penaltyGroups = new PenaltyGroupGateway(connection, transaction).GetAllPenaltyGroups(); } Dictionary <int, int> jamBoutMap; Dictionary <int, Jam> jamMap; Dictionary <int, IGrouping <int, PenaltyGroup> > penaltyGroupMap; jamBoutMap = _jams.ToDictionary(j => j.ID, j => j.BoutID); jamMap = _jams.ToDictionary(j => j.ID); penaltyGroupMap = _penaltyGroups.GroupBy(pg => jamBoutMap[pg.BoxTimes.First().JamID]).ToDictionary(gp => gp.Key); var boutJams = jamMap.Values.GroupBy(j => j.BoutID); var jamEstimateMap = CalculateJamDurationLimits(connection, transaction, jamMap); foreach (IGrouping <int, Jam> boutJamSet in boutJams) { ProcessBout(boutJamSet, penaltyGroupMap[boutJamSet.Key], jamEstimateMap); } var boxTimeEstimates = CalculateBoxTimeEstimates(jamEstimateMap); jtlGateway.InsertJamTimeEstimates(jamEstimateMap.Values, true); new BoxTimeEstimateGateway(connection, transaction).InsertBoxTimeEstimates(boxTimeEstimates, true); transaction.Commit(); connection.Close(); }
private void CalculatePlayerEffectiveness() { if (_jamTeamEffectiveness == null) { CalculateJamTeamEffectiveness(); } SqlConnection connection = new SqlConnection(_connectionString); connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); _jamPlayers = new JamPlayerGateway(connection, transaction).GetJamPlayers(); _penaltyGroups = new PenaltyGroupGateway(connection, transaction).GetAllPenaltyGroups(); // these three get mapped by jam var jteMap = _jamTeamEffectiveness.GroupBy(jte => jte.JamID).ToDictionary(g => g.Key); var jamDataMap = _jamTeamData.GroupBy(jf => jf.JamID).ToDictionary(g => g.Key); var jpJamMap = _jamPlayers.GroupBy(jp => jp.JamID).ToDictionary(g => g.Key); var jamTimeMap = new JamTimeLimitGateway(connection, transaction).GetAllJamTimeEstimates().ToDictionary(jte => jte.JamID); //var jpPlayerMap = players.GroupBy(jp => jp.PlayerID).ToDictionary(g => g.Key); // the best we can do with this is map it by player var pgMap = _penaltyGroups.GroupBy(pg => pg.PlayerID).ToDictionary(g => g.Key, g => g.ToList()); Dictionary <int, List <JamPlayerEffectiveness> > pjeMap = new Dictionary <int, List <JamPlayerEffectiveness> >(); Dictionary <int, List <PenaltyGroup> > jamBoxTimeMap1 = new Dictionary <int, List <PenaltyGroup> >(); Dictionary <int, List <PenaltyGroup> > jamBoxTimeMap2 = new Dictionary <int, List <PenaltyGroup> >(); _boxTimeEstimates = new BoxTimeEstimateGateway(connection, transaction).GetAllBoxTimeEstimates(); int maxJamID = jteMap.Keys.Max(); int jamID = 1; while (jamID <= maxJamID) { if (!jteMap.ContainsKey(jamID)) { jamID++; continue; } var tempJte = jteMap[jamID].OrderBy(jte => jte.TeamID); JamTeamEffectiveness jte1 = tempJte.First(); JamTeamEffectiveness jte2 = tempJte.Last(); var team1Players = jpJamMap[jamID].Where(jp => jp.TeamID == jte1.TeamID); var team2Players = jpJamMap[jamID].Where(jp => jp.TeamID == jte2.TeamID); List <JamPlayerEffectiveness> pjeList = new List <JamPlayerEffectiveness>(5); int jamTime = jamTimeMap[jamID].Estimate; // handle each player foreach (JamPlayer player in team1Players) { ProcessJamPlayer(pgMap, jamBoxTimeMap1, _boxTimeEstimates, jamID, jte1, pjeList, jamTime, player); } List <JamPlayerEffectiveness> pjeList2 = new List <JamPlayerEffectiveness>(5); // handle each player foreach (JamPlayer player in team2Players) { ProcessJamPlayer(pgMap, jamBoxTimeMap2, _boxTimeEstimates, jamID, jte2, pjeList, jamTime, player); } pjeMap[jamID] = pjeList; pjeMap[jamID].AddRange(pjeList2); jamID++; } jamID = 1; while (jamID <= maxJamID) { if (!jteMap.ContainsKey(jamID)) { jamID++; continue; } var tempJte = jteMap[jamID].OrderBy(jte => jte.TeamID); JamTeamEffectiveness jte1 = tempJte.First(); JamTeamEffectiveness jte2 = tempJte.Last(); // apply box time costs to players with correlated penalties if (jamBoxTimeMap1.ContainsKey(jamID)) { AssignPenaltyCosts(jamDataMap, jamTimeMap, pjeMap, jamBoxTimeMap1, _boxTimeEstimates, jamID, jte1); } // apply box time costs to players with correlated penalties if (jamBoxTimeMap2.ContainsKey(jamID)) { AssignPenaltyCosts(jamDataMap, jamTimeMap, pjeMap, jamBoxTimeMap2, _boxTimeEstimates, jamID, jte2); } jamID++; } new JamPlayerEffectivenessGateway(connection, transaction).InsertJamPlayerEffectiveness(pjeMap); transaction.Commit(); connection.Close(); }