From 23483370ef616497ebe68f12d44beb9955b7d6b2 Mon Sep 17 00:00:00 2001 From: khushbu-25 Date: Fri, 26 Jun 2026 16:39:29 +0530 Subject: [PATCH 1/2] display user score in quiz dashboard Added a new "My Score" column to the quiz dashboard. --- .../components/QuizPerformanceTable.tsx | 13 +++---- .../quiz/get-previous-quiz-info/[courseId].ts | 37 ++++++++----------- 2 files changed, 21 insertions(+), 29 deletions(-) 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..5285dc4c5 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,25 @@ 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 + const result: Array = await queryGradingDbAndEndSet500OnError( + `SELECT quizId, sum(points) as score FROM grading WHERE (quizId, userId, problemId, browserTimestamp_ms) IN ( SELECT quizId, userId,problemId, MAX(browserTimestamp_ms) AS browserTimestamp_ms FROM grading + 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 quizId;`, + [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 +95,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 +123,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, From b80e12c6187f65789e1a806ca84b173509b3d9a0 Mon Sep 17 00:00:00 2001 From: Rakesh Kumar <51470664+XI4507@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:08:56 +0530 Subject: [PATCH 2/2] query optimization --- .../api/quiz/get-previous-quiz-info/[courseId].ts | 15 ++++++++------- sql/grading_database_setup.sql | 3 +++ 2 files changed, 11 insertions(+), 7 deletions(-) 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 5285dc4c5..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 @@ -19,16 +19,17 @@ async function getUserScoresOrSet500Error( res: NextApiResponse ): Promise<{ [quizId: string]: number } | undefined> { const result: Array = await queryGradingDbAndEndSet500OnError( - `SELECT quizId, sum(points) as score - FROM grading - WHERE (quizId, userId, problemId, browserTimestamp_ms) IN ( - SELECT quizId, userId,problemId, MAX(browserTimestamp_ms) AS browserTimestamp_ms + `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 WHERE userId = ? - GROUP BY quizId, userId,problemId + GROUP BY quizId, userId, problemId ) - GROUP BY quizId;`, - [userId], + GROUP BY g.quizId;`, + [userId, userId], res ); if (!result) return; 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