11-- Existing databases can contain duplicate tester name/version rows from before
22-- the API enforced tester-version uniqueness. Keep the most relevant row for
33-- each duplicate group, repoint configs to it, and remove the redundant rows so
4- -- the unique index can be created safely.
5- CREATE TEMP TABLE " _tester_name_version_duplicates" ON COMMIT DROP AS
4+ -- the unique index can be created safely. Each statement uses its own CTE
5+ -- because Prisma migrate does not keep temporary tables available between all
6+ -- migration statements.
67WITH " testerUsage" AS (
78 SELECT
89 tester." id" ,
@@ -28,21 +29,55 @@ WITH "testerUsage" AS (
2829 FROM " marathon_match" ." tester" tester
2930 INNER JOIN " testerUsage"
3031 ON " testerUsage" ." id" = tester." id"
32+ ),
33+ " duplicateTesters" AS (
34+ SELECT
35+ " id" AS " duplicateId" ,
36+ " keeperId"
37+ FROM " rankedTesters"
38+ WHERE " id" <> " keeperId"
3139)
32- SELECT
33- " id" AS " duplicateId" ,
34- " keeperId"
35- FROM " rankedTesters"
36- WHERE " id" <> " keeperId" ;
37-
3840UPDATE " marathon_match" ." marathonMatchConfig" config
3941SET " testerId" = duplicates." keeperId"
40- FROM " _tester_name_version_duplicates " duplicates
42+ FROM " duplicateTesters " duplicates
4143WHERE config." testerId" = duplicates." duplicateId" ;
4244
45+ WITH " testerUsage" AS (
46+ SELECT
47+ tester." id" ,
48+ COUNT (config." id" ) AS " configCount"
49+ FROM " marathon_match" ." tester" tester
50+ LEFT JOIN " marathon_match" ." marathonMatchConfig" config
51+ ON config." testerId" = tester." id"
52+ GROUP BY tester." id"
53+ ),
54+ " rankedTesters" AS (
55+ SELECT
56+ tester." id" ,
57+ FIRST_VALUE(tester." id" ) OVER (
58+ PARTITION BY tester." name" , tester." version"
59+ ORDER BY
60+ " testerUsage" ." configCount" DESC ,
61+ (tester." compilationStatus" = ' SUCCESS' AND tester." jarFile" IS NOT NULL ) DESC ,
62+ (tester." compilationStatus" = ' SUCCESS' ) DESC ,
63+ tester." updatedAt" DESC ,
64+ tester." createdAt" DESC ,
65+ tester." id" ASC
66+ ) AS " keeperId"
67+ FROM " marathon_match" ." tester" tester
68+ INNER JOIN " testerUsage"
69+ ON " testerUsage" ." id" = tester." id"
70+ ),
71+ " duplicateTesters" AS (
72+ SELECT
73+ " id" AS " duplicateId" ,
74+ " keeperId"
75+ FROM " rankedTesters"
76+ WHERE " id" <> " keeperId"
77+ )
4378DELETE FROM " marathon_match" ." tester" tester
44- USING " _tester_name_version_duplicates " duplicates
79+ USING " duplicateTesters " duplicates
4580WHERE tester." id" = duplicates." duplicateId" ;
4681
4782-- CreateIndex
48- CREATE UNIQUE INDEX "tester_name_version_key " ON " marathon_match" ." tester" (" name" , " version" );
83+ CREATE UNIQUE INDEX IF NOT EXISTS " tester_name_version_key" ON " marathon_match" ." tester" (" name" , " version" );
0 commit comments