diff --git a/src/Model/Migration.hs b/src/Model/Migration.hs index df6289f1f..6b4c67ee8 100644 --- a/src/Model/Migration.hs +++ b/src/Model/Migration.hs @@ -140,23 +140,31 @@ getMissingMigrations = do migrateManual :: Migration -migrateManual = - addMigrations - [ (False, "CREATE INDEX IF NOT EXISTS course_application_file_content ON course_application_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS material_file_content ON material_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS course_news_file_content ON course_news_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS sheet_file_content ON sheet_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS course_app_instruction_file_content ON course_app_instruction_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS allocation_matching_log ON allocation_matching (log)") - , (False, "CREATE INDEX IF NOT EXISTS submission_file_content ON submission_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS session_file_content ON session_file (content)") - , (False, "CREATE INDEX IF NOT EXISTS file_lock_content ON file_lock (content)") - , (False, "CREATE INDEX IF NOT EXISTS user_lower_display_email ON \"user\" (lower(display_email))") - , (False, "CREATE INDEX IF NOT EXISTS user_lower_email ON \"user\" (lower(email))") - , (False, "CREATE INDEX IF NOT EXISTS user_lower_ident ON \"user\" (lower(ident))") - , (False, "CREATE INDEX IF NOT EXISTS submission_sheet ON submission (sheet)") - , (False, "CREATE INDEX IF NOT EXISTS submission_edit_submission ON submission_edit (submission)") +migrateManual = do + mapM_ (uncurry addIndex) + [ ("course_application_file_content", "CREATE INDEX course_application_file_content ON course_application_file (content)" ) + , ("material_file_content", "CREATE INDEX material_file_content ON material_file (content)" ) + , ("course_news_file_content", "CREATE INDEX course_news_file_content ON course_news_file (content)" ) + , ("sheet_file_content", "CREATE INDEX sheet_file_content ON sheet_file (content)" ) + , ("course_app_instruction_file_content", "CREATE INDEX course_app_instruction_file_content ON course_app_instruction_file (content)") + , ("allocation_matching_log", "CREATE INDEX allocation_matching_log ON allocation_matching (log)" ) + , ("submission_file_content", "CREATE INDEX submission_file_content ON submission_file (content)" ) + , ("session_file_content", "CREATE INDEX session_file_content ON session_file (content)" ) + , ("file_lock_content", "CREATE INDEX file_lock_content ON file_lock (content)" ) + , ("user_lower_display_email", "CREATE INDEX user_lower_display_email ON \"user\" (lower(display_email))" ) + , ("user_lower_email", "CREATE INDEX user_lower_email ON \"user\" (lower(email))" ) + , ("user_lower_ident", "CREATE INDEX user_lower_ident ON \"user\" (lower(ident))" ) + , ("submission_sheet", "CREATE INDEX submission_sheet ON submission (sheet)" ) + , ("submission_edit_submission", "CREATE INDEX submission_edit_submission ON submission_edit (submission)" ) ] + where + addIndex :: Text -> Sql -> Migration + addIndex ixName ixDef = do + res <- lift $ lift [sqlQQ|SELECT EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = current_schema() AND indexname = #{ixName})|] + alreadyDefined <- case res of + [Single e] -> return e + _other -> return True + unless alreadyDefined $ addMigration False ixDef {-