diff --git a/migrations/add_performance_indexes.sql b/migrations/add_performance_indexes.sql deleted file mode 100644 index 560c341..0000000 --- a/migrations/add_performance_indexes.sql +++ /dev/null @@ -1,65 +0,0 @@ --- Migration: Add performance indexes for content tracking --- Purpose: Optimize searchStatusCourseTracking endpoint performance --- Date: 2025-10-10 - --- ===================================================== --- Indexes for content_tracking table --- ===================================================== - --- Composite index for main query filter (userId + courseId + tenantId) -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_user_course_tenant -ON content_tracking ("userId", "courseId", "tenantId"); - --- Index for filtering by user and tenant -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_user_tenant -ON content_tracking ("userId", "tenantId"); - --- Index for filtering by course and tenant -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_course_tenant -ON content_tracking ("courseId", "tenantId"); - --- Index for ordering by created date -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_created_on -ON content_tracking ("createdOn"); - --- ===================================================== --- Indexes for content_tracking_details table --- ===================================================== - --- Index for JOIN with content_tracking -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_details_tracking_id -ON content_tracking_details ("contentTrackingId"); - --- Index for filtering by userId -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_details_user_id -ON content_tracking_details ("userId"); - --- Index for filtering by event id (eid) - used to determine status -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_details_eid -ON content_tracking_details ("eid"); - --- ===================================================== --- Verify indexes were created --- ===================================================== - --- Run this query to verify all indexes: --- SELECT --- schemaname, --- tablename, --- indexname, --- indexdef --- FROM pg_indexes --- WHERE tablename IN ('content_tracking', 'content_tracking_details') --- ORDER BY tablename, indexname; - --- ===================================================== --- Performance Notes --- ===================================================== --- These indexes will significantly improve query performance by: --- 1. Enabling efficient filtering on userId + courseId + tenantId combinations --- 2. Speeding up JOINs between content_tracking and content_tracking_details --- 3. Optimizing status determination by indexing the 'eid' field --- 4. Supporting ORDER BY operations on createdOn --- --- Expected improvement: 50+ seconds → 1-2 seconds for typical queries --- ===================================================== diff --git a/migrations/rollback_performance_indexes.sql b/migrations/rollback_performance_indexes.sql deleted file mode 100644 index 32ecf9c..0000000 --- a/migrations/rollback_performance_indexes.sql +++ /dev/null @@ -1,34 +0,0 @@ --- Rollback Migration: Remove performance indexes for content tracking --- Purpose: Rollback the performance optimization indexes if needed --- Date: 2025-10-10 - --- ===================================================== --- Drop indexes for content_tracking table --- ===================================================== - -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_user_course_tenant; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_user_tenant; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_course_tenant; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_created_on; - --- ===================================================== --- Drop indexes for content_tracking_details table --- ===================================================== - -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_details_tracking_id; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_details_user_id; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_details_eid; - --- ===================================================== --- Verify indexes were dropped --- ===================================================== - --- Run this query to verify indexes were removed: --- SELECT --- schemaname, --- tablename, --- indexname, --- indexdef --- FROM pg_indexes --- WHERE tablename IN ('content_tracking', 'content_tracking_details') --- ORDER BY tablename, indexname; diff --git a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts index f5c6f31..fc156f6 100644 --- a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts +++ b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts @@ -19,6 +19,7 @@ import { SubmitAssessmentToAiDto } from '../ai_assessment/dto/submit_assessment_ type TrackerInsertObject = { questionSetId: string; userId: string; + parentId?: string; fileUrls: string[]; status: 'RECEIVED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; metadata: Record; @@ -246,9 +247,16 @@ export class AnswerSheetSubmissionsService { const urlObj = new URL(url); return urlObj.pathname.slice(1); // removes the leading '/' }); + + // Handle parentId logic: If not provided or empty, use questionSetId + const parentId = input.parentId && input.parentId.trim() !== '' + ? input.parentId + : input.questionSetId; + return { questionSetId: input.questionSetId, userId: input.userId, + parentId: parentId, fileUrls: fileUrls, status: 'RECEIVED', metadata: input.metadata, @@ -388,6 +396,11 @@ export class AnswerSheetSubmissionsService { params.push(searchFilter.questionSetId); } + if (searchFilter?.parentId) { + conditions.push(`"parent_id" = $${params.length + 1}`); + params.push(searchFilter.parentId); + } + if (searchFilter?.status) { conditions.push(`"status" = $${params.length + 1}`); params.push(searchFilter.status); diff --git a/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts b/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts index 8262507..538cd37 100644 --- a/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts +++ b/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts @@ -36,6 +36,10 @@ export class AnswerSheetSubmissionsCreateDto { @IsString() questionSetId: string; + @IsOptional() + @IsString() + parentId?: string; + @IsArray() @IsString({ each: true }) fileUrls: string[]; diff --git a/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts b/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts index 745b572..37ea199 100644 --- a/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts +++ b/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts @@ -17,6 +17,9 @@ export class AnswerSheetSubmissions { @Column({ name: 'question_set_id' }) questionSetId: string; + @Column({ name: 'parent_id', type: 'text', nullable: true }) + parentId: string; + @Column('text', { array: true, name: 'file_urls' }) fileUrls: string[];