Skip to content

Commit e1ea26d

Browse files
committed
Handle additional tables in migrate_exercise.sql
Since adding the script in 2020 with 7ab4c63, many tables have changed. Hence, we use this opportunity to update the script, allowing it to be used with the current database design. Furthermore, we also keep more data if possible, smoothing a migration. Unfortunately, migrating exercises got a bit more complicated due to programming groups, community solutions, and tips. Since we didn't require a migration for these yet, we just added a safeguard for now (acknowledging that some foreign key constraints might still be missing).
1 parent a7a02ec commit e1ea26d

File tree

1 file changed

+79
-4
lines changed

1 file changed

+79
-4
lines changed

db/scripts/migrate_exercise.sql

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,29 @@ BEGIN
1010
RETURN;
1111
END IF;
1212

13+
IF EXISTS(SELECT 1
14+
FROM exercise_tips
15+
WHERE exercise_id = duplicated_exercise) THEN
16+
RAISE NOTICE 'Exercise % has tips. Please migrate tips manually and try again', duplicated_exercise;
17+
RETURN;
18+
END IF;
19+
20+
IF EXISTS(SELECT 1
21+
FROM community_solutions
22+
WHERE exercise_id = duplicated_exercise) THEN
23+
RAISE NOTICE 'Exercise % has a community solution. Please migrate the community solution and their contribution (locks) manually and try again', duplicated_exercise;
24+
RETURN;
25+
END IF;
26+
27+
IF EXISTS(SELECT 1
28+
FROM programming_groups a, programming_groups b
29+
WHERE (a.exercise_id = target_exercise AND b.exercise_id = duplicated_exercise)
30+
OR (a.exercise_id = duplicated_exercise AND b.exercise_id = target_exercise)) THEN
31+
RAISE NOTICE 'Both, exercise % and % have programming groups. Please re-consider the effects (and change the script).', target_exercise, duplicated_exercise;
32+
RETURN;
33+
END IF;
34+
35+
UPDATE programming_groups SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
1336
UPDATE submissions SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
1437
UPDATE request_for_comments SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
1538

@@ -36,11 +59,63 @@ BEGIN
3659
UPDATE events SET exercise_id = target_exercise where exercise_id = duplicated_exercise;
3760
UPDATE searches SET exercise_id = target_exercise where exercise_id = duplicated_exercise;
3861
UPDATE user_exercise_interventions SET exercise_id = target_exercise where exercise_id = duplicated_exercise;
62+
63+
WITH existing_user_proxy_exercise_exercises AS (SELECT CONCAT(user_type, '_', user_id, '_', proxy_exercise_id) as existing
64+
FROM user_proxy_exercise_exercises
65+
WHERE exercise_id = target_exercise)
66+
DELETE FROM user_proxy_exercise_exercises
67+
WHERE exercise_id = duplicated_exercise
68+
AND CONCAT(user_type, '_', user_id, '_', proxy_exercise_id) IN (SELECT existing FROM existing_user_proxy_exercise_exercises);
69+
3970
UPDATE user_proxy_exercise_exercises SET exercise_id = target_exercise where exercise_id = duplicated_exercise;
4071

41-
DELETE FROM anomaly_notifications WHERE exercise_id = duplicated_exercise;
42-
DELETE FROM exercise_tags WHERE exercise_id = duplicated_exercise;
43-
DELETE FROM lti_parameters WHERE exercise_id = duplicated_exercise;
72+
WITH existing_anomaly_notifications AS (SELECT CONCAT(contributor_type, '_', contributor_id, '_', exercise_collection_id) as existing
73+
FROM anomaly_notifications
74+
WHERE exercise_id = target_exercise)
75+
DELETE FROM anomaly_notifications WHERE exercise_id = duplicated_exercise
76+
AND CONCAT(contributor_type, '_', contributor_id, '_', exercise_collection_id) IN (SELECT existing FROM existing_anomaly_notifications);
77+
78+
UPDATE anomaly_notifications SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
79+
80+
WITH existing_exercise_tags AS (SELECT tag_id as existing
81+
FROM exercise_tags
82+
WHERE exercise_id = tag_id)
83+
DELETE FROM exercise_tags
84+
WHERE tag_id = duplicated_exercise
85+
AND tag_id IN (SELECT existing FROM existing_exercise_tags);
86+
87+
UPDATE exercise_tags SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
88+
89+
WITH existing_lti_parameters AS (SELECT CONCAT(external_user_id, '_', study_group_id) as existing
90+
FROM lti_parameters
91+
WHERE exercise_id = target_exercise)
92+
DELETE FROM lti_parameters
93+
WHERE exercise_id = duplicated_exercise
94+
AND CONCAT(external_user_id, '_', study_group_id) IN (SELECT existing FROM existing_lti_parameters);
95+
96+
UPDATE lti_parameters SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
97+
98+
WITH existing_pair_programming_exercise_feedbacks
99+
AS (SELECT CONCAT(user_type, '_', user_id, '_', study_group_id, '_', programming_group_id) as existing
100+
FROM pair_programming_exercise_feedbacks
101+
WHERE exercise_id = target_exercise)
102+
DELETE FROM pair_programming_exercise_feedbacks
103+
WHERE exercise_id = duplicated_exercise
104+
AND CONCAT(user_type, '_', user_id, '_', study_group_id, '_', programming_group_id) IN
105+
(SELECT existing FROM existing_pair_programming_exercise_feedbacks);
106+
107+
UPDATE pair_programming_exercise_feedbacks SET exercise_id = target_exercise WHERE user_id = duplicated_exercise;
108+
109+
WITH existing_pair_programming_waiting_users AS (SELECT CONCAT(user_type, '_', user_id) as existing
110+
FROM pair_programming_waiting_users
111+
WHERE exercise_id = target_exercise)
112+
DELETE FROM pair_programming_waiting_users
113+
WHERE exercise_id = duplicated_exercise
114+
AND CONCAT(user_type, '_', user_id) IN (SELECT existing FROM existing_pair_programming_waiting_users);
115+
116+
UPDATE pair_programming_waiting_users SET exercise_id = target_exercise WHERE exercise_id = duplicated_exercise;
117+
118+
-- We need to invalidate the remove evaluation mappings for the duplicated exercise, since the local file mapping (within the `.co` file) is broken otherwise.
44119
DELETE FROM remote_evaluation_mappings WHERE exercise_id = duplicated_exercise;
45120

46121
-- Preventing duplicated entries in exercise_collection_items
@@ -90,7 +165,7 @@ $$;
90165
/* Execute migration
91166
do $$
92167
begin
93-
perform migrate_exercise(target_exercise := 237, duplicated_exercise := 695);
168+
perform migrate_exercise(target_exercise := 237, duplicated_exercise := 695);
94169
end
95170
$$;
96171
*/

0 commit comments

Comments
 (0)