public void ComparesLeftAbsence() { // Arrange var left = new PlayerStatusViewModel("A", null); left.Absences.Add(new AbsenceIndex.Result()); var right = new PlayerStatusViewModel("B", null); var comparer = new PlayerStatusViewModel.Comparer(CompareMode.SeasonAverage); // Act var result = comparer.Compare(left, right); // Assert Assert.Equal(1, result); }
public void ComparesPlayerFormGreater() { // Arrange var left = new PlayerStatusViewModel("A", new PlayerFormViewModel("A") { SeasonAverage = 190, Last5Average = 197 }); var right = new PlayerStatusViewModel("B", new PlayerFormViewModel("B") { SeasonAverage = 190, Last5Average = 195 }); var comparer = new PlayerStatusViewModel.Comparer(CompareMode.PlayerForm); // Act var result = comparer.Compare(left, right); // Assert Assert.Equal(1, result); }
public ActionResult PlayerStatus(int turn, int season) { Roster[] rosters = DocumentSession.Query <Roster, RosterSearchTerms>() .Where(x => x.Turn == turn && x.Season == season) .ToArray(); DateTime from = rosters.Select(x => x.Date.Date) .Min(); DateTime to = rosters.Select(x => x.Date.Date) .Max(); /* * x y * 1 1 * 2 2 * 3 3 * 4 4 */ var absences = DocumentSession.Query <AbsenceIndex.Result, AbsenceIndex>() .Where(x => x.From <= from && to <= x.To || x.From <= from && from <= x.To || x.From <= to && to <= x.To || from <= x.From && x.To <= to) .ProjectFromIndexFieldsInto <AbsenceIndex.Result>() .ToArray() .ToLookup(x => x.Player) .ToDictionary(x => x.Key, x => x.ToList()); Player[] players = DocumentSession.Query <Player, PlayerSearch>() .ToArray(); var rostersForPlayers = new Dictionary <string, List <RosterViewModel> >(); foreach (Roster roster in rosters) { var rosterViewModel = new RosterViewModel( roster, new RosterViewModel.PlayerItem(string.Empty, string.Empty, false), new List <RosterViewModel.PlayerItem>()); foreach (string player in roster.Players) { if (rostersForPlayers.TryGetValue(player, out List <RosterViewModel> rosterViewModels) == false) { rosterViewModels = new List <RosterViewModel>(); rostersForPlayers.Add(player, rosterViewModels); } rosterViewModels.Add(rosterViewModel); } } var resultsForPlayer = DocumentSession.Query <ResultForPlayerIndex.Result, ResultForPlayerIndex>() .Where(x => x.Season == season) .ToArray() .ToDictionary(x => x.PlayerId); var activities = new List <PlayerStatusViewModel>(); foreach (Player player in players) { PlayerFormViewModel playerForm; if (resultsForPlayer.TryGetValue(player.Id, out ResultForPlayerIndex.Result resultForPlayer) && resultForPlayer.TotalSeries > 0) { playerForm = new PlayerFormViewModel(player.Name) { TotalSeries = resultForPlayer.TotalSeries, SeasonAverage = (double)resultForPlayer.TotalPins / Math.Max(1, resultForPlayer.TotalSeries), Last5Average = (double)resultForPlayer.Last5TotalPins / Math.Max(1, resultForPlayer.Last5TotalSeries), HasResult = true }; } else if (player.PlayerStatus == Player.Status.Active) { playerForm = new PlayerFormViewModel(player.Name); } else { continue; } var activity = new PlayerStatusViewModel(player, playerForm, from, to); if (rostersForPlayers.ContainsKey(player.Id)) { List <RosterViewModel> rostersForPlayer = rostersForPlayers[player.Id]; activity.Teams.AddRange(rostersForPlayer); } if (absences.TryGetValue(player.Id, out List <AbsenceIndex.Result> playerAbsences)) { activity.AddAbsences(playerAbsences.OrderBy(x => x.From)); } activities.Add(activity); } PlayerStatusViewModel[] vm = activities.OrderByDescending(x => x, new PlayerStatusViewModel.Comparer(CompareMode.PlayerForm)) .ToArray(); return(PartialView(vm)); }
public ActionResult PlayerStatus(int turn, int season) { var rosters = DocumentSession.Query<Roster, RosterSearchTerms>() .Where(x => x.Turn == turn && x.Season == season) .ToArray(); var from = rosters.Select(x => x.Date.Date) .Min(); var to = rosters.Select(x => x.Date.Date) .Max(); /* * x y * 1 1 * 2 2 * 3 3 * 4 4 */ var absences = DocumentSession.Query<AbsenceIndex.Result, AbsenceIndex>() .Where(x => x.From <= from && to <= x.To || x.From <= from && from <= x.To || x.From <= to && to <= x.To || from <= x.From && x.To <= to) .OrderBy(p => p.To) .ThenBy(p => p.PlayerName) .AsProjection<AbsenceIndex.Result>() .ToArray() .ToLookup(x => x.Player) .ToDictionary(x => x.Key, x => x.ToList()); var players = DocumentSession.Query<Player, PlayerSearch>() .ToArray(); var rostersForPlayers = new Dictionary<string, List<RosterViewModel>>(); foreach (var roster in rosters) { var rosterViewModel = roster.MapTo<RosterViewModel>(); foreach (var player in roster.Players) { List<RosterViewModel> rosterViewModels; if (rostersForPlayers.TryGetValue(player, out rosterViewModels) == false) { rosterViewModels = new List<RosterViewModel>(); rostersForPlayers.Add(player, rosterViewModels); } rosterViewModels.Add(rosterViewModel); } } var resultsForPlayer = DocumentSession.Query<ResultForPlayerIndex.Result, ResultForPlayerIndex>() .Where(x => x.Season == season) .ToArray() .ToDictionary(x => x.PlayerId); var activities = new List<PlayerStatusViewModel>(); foreach (var player in players) { PlayerFormViewModel playerForm; ResultForPlayerIndex.Result resultForPlayer; if (resultsForPlayer.TryGetValue(player.Id, out resultForPlayer) && resultForPlayer.TotalSeries > 0) { playerForm = new PlayerFormViewModel(player.Name) { TotalSeries = resultForPlayer.TotalSeries, SeasonAverage = (double)resultForPlayer.TotalPins / Math.Max(1, resultForPlayer.TotalSeries), Last5Average = (double)resultForPlayer.Last5TotalPins / Math.Max(1, resultForPlayer.Last5TotalSeries), HasResult = true }; } else if (player.PlayerStatus == Player.Status.Active) { playerForm = new PlayerFormViewModel(player.Name); } else { continue; } var activity = new PlayerStatusViewModel(player.Name, playerForm); if (rostersForPlayers.ContainsKey(player.Id)) { var rostersForPlayer = rostersForPlayers[player.Id]; activity.Teams.AddRange(rostersForPlayer); } List<AbsenceIndex.Result> playerAbsences; if (absences.TryGetValue(player.Id, out playerAbsences)) { activity.Absences.AddRange(playerAbsences.OrderBy(x => x.From)); } activities.Add(activity); } var activitiesWithNoAbsence = activities.Where(x => x.Absences.Count == 0); var activitiesWithAbsence = activities.Where(x => x.Absences.Count > 0); var vm = activitiesWithNoAbsence.OrderByDescending(x => x, new PlayerStatusViewModel.Comparer(CompareMode.PlayerForm)) .Concat(activitiesWithAbsence.OrderBy(x => x.Absences.Min(y => y.To)).ThenBy(x => x.Name)); return PartialView(vm); }
public void ComparesSeasonAverageRight() { // Arrange var left = new PlayerStatusViewModel("A", null); var right = new PlayerStatusViewModel("B", new PlayerFormViewModel("B") { SeasonAverage = 195 }); var comparer = new PlayerStatusViewModel.Comparer(CompareMode.SeasonAverage); // Act var result = comparer.Compare(left, right); // Assert Assert.Equal(-1, result); }