diff --git a/packages/alea-frontend/components/QuizPerformanceTable.tsx b/packages/alea-frontend/components/QuizPerformanceTable.tsx index 909f53413..328f98012 100644 --- a/packages/alea-frontend/components/QuizPerformanceTable.tsx +++ b/packages/alea-frontend/components/QuizPerformanceTable.tsx @@ -98,13 +98,12 @@ function QuizPerformanceTable({ {t.maxPoints} - {/* Showing my score contributed to performance issues during the quiz. - - {t.myScore} - */} {t.averageScore} + + {t.myScore} + @@ -145,12 +144,12 @@ function QuizPerformanceTable({ {previousQuizData?.quizInfo[quiz.quizId]?.maxPoints} - {/* - {previousQuizData?.quizInfo[quiz.quizId]?.score?.toFixed(2)} - */} {previousQuizData?.quizInfo[quiz.quizId]?.averageScore?.toFixed(2)} + + {previousQuizData?.quizInfo[quiz.quizId]?.score?.toFixed(2)} + ))} diff --git a/packages/alea-frontend/pages/api/quiz/get-previous-quiz-info/[courseId].ts b/packages/alea-frontend/pages/api/quiz/get-previous-quiz-info/[courseId].ts index 737487303..a2d5c673a 100644 --- a/packages/alea-frontend/pages/api/quiz/get-previous-quiz-info/[courseId].ts +++ b/packages/alea-frontend/pages/api/quiz/get-previous-quiz-info/[courseId].ts @@ -11,8 +11,6 @@ import { getCurrentTermForCourseId } from '../../get-current-term'; import { queryGradingDbAndEndSet500OnError } from '../../grading-db-utils'; import { getAllQuizzes } from '../quiz-utils'; -const USER_TO_QUIZ_SCORES_CACHE = new Map(); - // Quiz Id to (cacheTimestampMs, avgScore) const QUIZ_AVG_SCORES_CACHE = new Map(); @@ -20,29 +18,26 @@ async function getUserScoresOrSet500Error( userId: string, res: NextApiResponse ): Promise<{ [quizId: string]: number } | undefined> { - if (USER_TO_QUIZ_SCORES_CACHE.size === 0) { - const result: Array = await queryGradingDbAndEndSet500OnError( - `SELECT userId, quizId, sum(points) as score - FROM grading - WHERE (quizId, userId, problemId, browserTimestamp_ms) IN ( - SELECT quizId, userId,problemId, MAX(browserTimestamp_ms) AS browserTimestamp_ms + const result: Array = await queryGradingDbAndEndSet500OnError( + `SELECT g.quizId, SUM(g.points) as score + FROM grading g + WHERE g.userId = ? + AND (g.quizId, g.userId, g.problemId, g.browserTimestamp_ms) IN ( + SELECT quizId, userId, problemId, MAX(browserTimestamp_ms) AS browserTimestamp_ms FROM grading - GROUP BY quizId, userId,problemId + WHERE userId = ? + GROUP BY quizId, userId, problemId ) - GROUP BY userId,quizId;`, - [], - res - ); - if (!result) return; - result.forEach((quiz) => { - const score = quiz['score']; - const quizId = quiz['quizId']; - const userId = quiz['userId']; - if (!USER_TO_QUIZ_SCORES_CACHE.has(userId)) USER_TO_QUIZ_SCORES_CACHE.set(userId, {}); - USER_TO_QUIZ_SCORES_CACHE.get(userId)[quizId] = score; - }); - } - return USER_TO_QUIZ_SCORES_CACHE.get(userId) ?? {}; + GROUP BY g.quizId;`, + [userId, userId], + res + ); + if (!result) return; + const userScores: { [quizId: string]: number } = {}; + result.forEach((quiz) => { + userScores[quiz['quizId']] = quiz['score']; + }); + return userScores; } async function getQuizAveragesOrSet500Error( @@ -101,9 +96,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const courseId = req.query.courseId as string; let instanceId = req.query.instanceId as string; if (!instanceId) instanceId = await getCurrentTermForCourseId(courseId); - const userScores = {}; // await getUserScoresOrSet500Error(userId, res); Disable to avoid performance issues + const userScores = await getUserScoresOrSet500Error(userId, res); // Disable to avoid performance issues if (!userScores) return; - const relevantQuizzes = getAllQuizzes() .filter((q) => q.courseId === courseId && q.courseTerm === instanceId) .filter((q) => getQuizPhase(q) === Phase.FEEDBACK_RELEASED); @@ -130,7 +124,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } const quizId = quiz.id; quizInfo[quizId] = { - score: userScores[quizId], + score: userScores[quizId] ?? 0, averageScore: quizAverages.get(quizId), maxPoints, recorrectionInfo, diff --git a/sql/grading_database_setup.sql b/sql/grading_database_setup.sql index a5c2859ca..c980aeeed 100644 --- a/sql/grading_database_setup.sql +++ b/sql/grading_database_setup.sql @@ -28,3 +28,6 @@ SELECT * FROM grading; -- For optimizing the get-quiz API CREATE INDEX idx_grading_optimus ON grading (quizId, userId, problemId, browserTimestamp_ms); + +-- For optimizing user-specific score lookups in get-previous-quiz-info +CREATE INDEX idx_grading_user_quiz_problem_time ON grading(userId, quizId, problemId, browserTimestamp_ms); \ No newline at end of file