From 4ee3b0e12f2750949e20bc96b91fa8a49a700d6b Mon Sep 17 00:00:00 2001 From: Kenny Young Date: Wed, 10 Apr 2019 22:10:55 -0700 Subject: [PATCH] Performance fixes for slow pages (I hope) Fix #376 Fix #383 --- .../Pages/Events/FastestSolves.cshtml.cs | 13 +++++++-- ServerCore/Pages/Teams/Answers.cshtml | 6 ++--- ServerCore/Pages/Teams/Answers.cshtml.cs | 27 ++++++++++++++----- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/ServerCore/Pages/Events/FastestSolves.cshtml.cs b/ServerCore/Pages/Events/FastestSolves.cshtml.cs index cac6816f..d4509660 100644 --- a/ServerCore/Pages/Events/FastestSolves.cshtml.cs +++ b/ServerCore/Pages/Events/FastestSolves.cshtml.cs @@ -19,6 +19,15 @@ public FastestSolvesModel(PuzzleServerContext serverContext, UserManager teamNameLookup = new Dictionary(); + + // build an ID-to-name mapping to improve perf + var names = await _context.Teams.Where(t => t.Event == Event) + .Select(t => new { t.ID, t.Name }) + .ToListAsync(); + + names.ForEach(t => teamNameLookup[t.ID] = t.Name); + // get the page data: puzzle, solve count, top three fastest var puzzlesData = await PuzzleStateHelper.GetSparseQuery(_context, this.Event, null, null) .Where(s => s.SolvedTime != null && s.Puzzle.IsPuzzle) @@ -26,7 +35,7 @@ public async Task OnGetAsync() .Select(g => new { Puzzle = g.Key, SolveCount = g.Count(), - Fastest = g.OrderBy(s => s.SolvedTime - s.UnlockedTime).Take(3).Select(s => new { s.Team.ID, s.Team.Name, Time = s.SolvedTime - s.UnlockedTime}) + Fastest = g.OrderBy(s => s.SolvedTime - s.UnlockedTime).Take(3).Select(s => new { s.Team.ID, Time = s.SolvedTime - s.UnlockedTime}) }) .OrderByDescending(p => p.SolveCount).ThenBy(p => p.Puzzle.Name) .ToListAsync(); @@ -40,7 +49,7 @@ public async Task OnGetAsync() Puzzle = data.Puzzle, SolveCount = data.SolveCount, SortOrder = i, - Fastest = data.Fastest.Select(f => new FastRecord() { ID = f.ID, Name = f.Name, Time = f.Time }).ToArray() + Fastest = data.Fastest.Select(f => new FastRecord() { ID = f.ID, Name = teamNameLookup[f.ID], Time = f.Time }).ToArray() }; puzzles.Add(stats); diff --git a/ServerCore/Pages/Teams/Answers.cshtml b/ServerCore/Pages/Teams/Answers.cshtml index c1bf0968..25b88c9b 100644 --- a/ServerCore/Pages/Teams/Answers.cshtml +++ b/ServerCore/Pages/Teams/Answers.cshtml @@ -46,16 +46,16 @@ @item.TimeSubmitted - @item.Puzzle.Group + @item.Group - @item.Puzzle.Name + @item.Name @item.SubmissionText - @item.Response.ResponseText + @item.ResponseText } diff --git a/ServerCore/Pages/Teams/Answers.cshtml.cs b/ServerCore/Pages/Teams/Answers.cshtml.cs index 8a16f6fa..be3305bd 100644 --- a/ServerCore/Pages/Teams/Answers.cshtml.cs +++ b/ServerCore/Pages/Teams/Answers.cshtml.cs @@ -23,8 +23,7 @@ public AnswersModel(PuzzleServerContext serverContext, UserManager { } - - public IList CorrectSubmissions { get; set; } + public IList CorrectSubmissions { get; set; } public int TeamID { get; set; } @@ -37,9 +36,7 @@ public async Task OnGetAsync(SortOrder? sort, int teamId) TeamID = teamId; IQueryable submissions = _context.Submissions - .Include((s)=>s.Response) - .Where((s) => s.TeamID == teamId && s.Response.IsSolution) - .Include((s)=>s.Puzzle); + .Where((s) => s.TeamID == teamId && s.Response.IsSolution); this.Sort = sort; switch (sort ?? DefaultSort) { @@ -65,7 +62,16 @@ public async Task OnGetAsync(SortOrder? sort, int teamId) throw new Exception("Sort order is not mapped"); } - CorrectSubmissions = await submissions.ToListAsync(); + CorrectSubmissions = await submissions + .Select(s => new SubmissionView() + { + TimeSubmitted = s.TimeSubmitted, + Group = s.Puzzle.Group, + Name = s.Puzzle.Name, + SubmissionText = s.SubmissionText, + ResponseText = s.Response.ResponseText + }) + .ToListAsync(); } public SortOrder? SortForColumnLink(SortOrder ascending, SortOrder descending) @@ -90,5 +96,14 @@ public enum SortOrder GroupAscending, GroupDescending } + + public class SubmissionView + { + public DateTime TimeSubmitted { get; set; } + public string Group { get; set; } + public string Name { get; set; } + public string SubmissionText { get; set; } + public string ResponseText { get; set; } + } } }