public async Task ReprocessSeasonStatsAsync(short year, byte season) { var stats = (await GetSeasonTeamsStatsAsync(year, season)).ToDictionary(stat => stat.Id, stat => stat); foreach (var teamStats in stats) { teamStats.Value.Reset(); } var seasonConfig = await _configService.GetConfig(year, season); for (byte round = 1; round <= seasonConfig.RoundsCount; round++) { var matches = await _matchesService.GetSeasonRoundMatchesAsync(year, season, round); foreach (var match in matches) { var newMatchWinner = match.HomeScore > match.AwayScore ? WhoWon.Home : match.AwayScore > match.HomeScore ? WhoWon.Away : WhoWon.Draw; var homeStats = stats[match.HomeTeamId]; var awayStats = stats[match.AwayTeamId]; homeStats.G++; awayStats.G++; homeStats.GF += match.HomeScore.GetValueOrDefault(); homeStats.GA += match.AwayScore.GetValueOrDefault(); awayStats.GF += match.AwayScore.GetValueOrDefault(); awayStats.GA += match.HomeScore.GetValueOrDefault(); switch (newMatchWinner) { case WhoWon.Home: homeStats.W++; awayStats.L++; break; case WhoWon.Away: homeStats.L++; awayStats.W++; break; case WhoWon.Draw: homeStats.D++; awayStats.D++; break; } } } await BulkUpsertTeamStats(year, season, stats.Values); }
public async Task <IEnumerable <TeamSeasonStats> > GetYearTeamsStatsAsync(short year) { var championship = await _seasonsService.GetConfig(year); var teamsStats = new List <TeamSeasonStats>(); foreach (var season in championship.Seasons) { var seasonStats = await _statsRepository.GetSeasonTeamsStatsAsync(year, season.SeasonId); teamsStats.AddRange(_mapper.Map <IEnumerable <TeamSeasonStats> >(seasonStats)); } var stats = teamsStats.GroupBy(ts => ts.Id).Select(ts => ts.Aggregate((x, y) => x + y));; return(stats.OrderByDescending(s => s.Pts).ThenByDescending(s => s.GD).ThenByDescending(s => s.GF)); }
public async Task ResetAllMatchesFromSeasonAsync(short year, byte season) { var config = await _seasonService.GetConfig(year, season); if (config == null) { throw new ArgumentException($"Missing config for {year}#{season}."); } for (byte round = 1; round <= config.RoundsCount; round++) { var matches = await _matchRepository.GetMatchesAsync(year, season, round); foreach (var match in matches) { match.WasPlayed = false; match.HomeScore = null; match.AwayScore = null; } await _matchRepository.BatchUpsertAsync(matches); } }