@@ -32,7 +32,7 @@ import { NOT_FOUND } from '$lib/constants/http-response-status-codes';
3232const statusById = await getSubmissionStatusMapWithId ( ) ;
3333const statusByName = await getSubmissionStatusMapWithName ( ) ;
3434
35- export async function getTaskResults ( userId : string ) : Promise < TaskResults > {
35+ export async function getTaskResults ( userId : string | undefined ) : Promise < TaskResults > {
3636 // 問題と特定のユーザの回答状況を使ってデータを結合
3737 // 計算量: 問題数をN、特定のユーザの解答数をMとすると、O(N + M)になるはず。
3838 const mergedTasksMap = await getMergedTasksMap ( ) ;
@@ -127,14 +127,16 @@ async function transferAnswers(
127127// with_mapをtrueにすると、taskIdを使って各TaskResultにO(1)でアクセスできる。
128128// Why : データ総量を抑えるため。
129129export async function getTaskResultsOnlyResultExists (
130- userId : string ,
130+ userId : string | undefined ,
131131 with_map : boolean = false ,
132132) : Promise < TaskResults | Map < string , TaskResult > > {
133133 const taskResultsMap : Map < string , TaskResult > = new Map ( ) ;
134134
135135 // TODO: answerの降順にしたい
136136 const tasks = await getTasks ( ) ;
137- const answers = await answer_crud . getAnswers ( userId ) ;
137+ // Skip the DB round-trip for anonymous users: getAnswers(undefined) drops the
138+ // WHERE filter and full-scans taskAnswer.
139+ const answers = userId !== undefined ? await answer_crud . getAnswers ( userId ) : new Map ( ) ;
138140 const tasksHasAnswer = tasks . filter ( ( task ) => answers . has ( task . task_id ) ) ;
139141 const taskResultsWithAnswer = tasksHasAnswer . map ( ( task : Task ) => {
140142 const taskResult = createDefaultTaskResult ( userId , task ) ;
@@ -215,9 +217,11 @@ export async function getTaskResultsByTaskId(
215217 * @param userId - User ID for creating TaskResults
216218 * @returns Promise<TaskResults> - Array of TaskResult objects
217219 */
218- async function createTaskResults ( tasks : Tasks , userId : string ) : Promise < TaskResults > {
219- const answers = await answer_crud . getAnswers ( userId ) ;
220+ async function createTaskResults ( tasks : Tasks , userId : string | undefined ) : Promise < TaskResults > {
220221 const isLoggedIn = userId !== undefined ;
222+ // Skip the DB round-trip for anonymous users: getAnswers(undefined) drops the
223+ // WHERE filter and full-scans taskAnswer.
224+ const answers = isLoggedIn ? await answer_crud . getAnswers ( userId ) : new Map ( ) ;
221225
222226 return tasks . map ( ( task : Task ) => {
223227 const answer = isLoggedIn ? answers . get ( task . task_id ) : null ;
@@ -236,7 +240,7 @@ async function createTaskResults(tasks: Tasks, userId: string): Promise<TaskResu
236240 */
237241function mergeTaskAndAnswer (
238242 task : Task ,
239- userId : string ,
243+ userId : string | undefined ,
240244 answer : TaskAnswer | null | undefined ,
241245) : TaskResult {
242246 const taskResult = createDefaultTaskResult ( userId , task ) ;
@@ -263,7 +267,7 @@ function mergeTaskAndAnswer(
263267 return taskResult ;
264268}
265269
266- export function createDefaultTaskResult ( userId : string , task : Task ) : TaskResult {
270+ export function createDefaultTaskResult ( userId : string | undefined , task : Task ) : TaskResult {
267271 const taskResult : TaskResult = {
268272 contest_id : task . contest_id ,
269273 task_id : task . task_id ,
@@ -312,7 +316,7 @@ export async function updateTaskResult(taskId: string, submissionStatus: string,
312316
313317export async function getTasksWithTagIds (
314318 tagIds_string : string ,
315- userId : string ,
319+ userId : string | undefined ,
316320) : Promise < TaskResults > {
317321 const tagIds = tagIds_string . split ( ',' ) ;
318322 const taskIdByTagIds = await db . taskTag . groupBy ( {
0 commit comments