85 lines
3.6 KiB
MySQL
85 lines
3.6 KiB
MySQL
|
|
-- =====================================================================
|
||
|
|
-- TeeCup — kjønn hører til RATINGEN, ikke selve utslaget (migrasjon 014)
|
||
|
|
-- =====================================================================
|
||
|
|
-- Reist av brukeren 2026-07-19: en golfbane har IKKE fysisk kjønnsdelte
|
||
|
|
-- utslag -- begge kjønn kan som regel spille fra ethvert utslag. Det
|
||
|
|
-- eneste som faktisk varierer per kjønn er om klubben har VALGT å slope
|
||
|
|
-- (rate) et gitt utslag for det respektive kjønnet (noen klubber sloper
|
||
|
|
-- bevisst ikke det lengste utslaget for damer). `tee.gender` (migrasjon
|
||
|
|
-- 001) konflaterte feilaktig utslaget og ratingen -- hvert fysisk utslag
|
||
|
|
-- ble lagret som TO separate `tee`-rader (én per kjønn), bekreftet mot
|
||
|
|
-- ekte importert Tjøme-data (fire utslag, hver som et rent m/f-par).
|
||
|
|
--
|
||
|
|
-- Denne migrasjonen flytter `gender` fra `tee` til `tee_rating` (der det
|
||
|
|
-- faktisk hører hjemme -- én fysisk tee kan ha 0, 1 eller 2
|
||
|
|
-- kjønnsspesifikke ratinger), og slår sammen eksisterende kjønns-par-rader
|
||
|
|
-- til én fysisk tee-rad. Se ARCHITECTURE_DECISIONS.md ADR-029.
|
||
|
|
--
|
||
|
|
-- Kjørt trygt mot ekte data FORDI (bekreftet FØR skriving, read-only):
|
||
|
|
-- alle eksisterende tee-rader er rene navnepar (m+f, ingen 'x'), ingen
|
||
|
|
-- gruppe har mer enn to rader.
|
||
|
|
-- =====================================================================
|
||
|
|
|
||
|
|
\set ON_ERROR_STOP on
|
||
|
|
|
||
|
|
BEGIN;
|
||
|
|
|
||
|
|
ALTER TABLE tee_rating ADD COLUMN gender text;
|
||
|
|
|
||
|
|
-- Fyll inn gender på HVER eksisterende tee_rating-rad fra sin (ennå
|
||
|
|
-- urørte) eier-tee, FØR noe slås sammen eller slettes.
|
||
|
|
UPDATE tee_rating tr
|
||
|
|
SET gender = t.gender
|
||
|
|
FROM tee t
|
||
|
|
WHERE t.id = tr.tee_id;
|
||
|
|
|
||
|
|
-- Selve golfregelen: en WHS-rating er alltid for ett bestemt kjønn -- 'x'
|
||
|
|
-- (som var gyldig på PLAYER-nivå) gir ikke mening for en rating. Krasjer
|
||
|
|
-- høyt her (NOT NULL + CHECK) hvis noen ukjent/uventet rad skulle mangle
|
||
|
|
-- et gyldig kjønn -- fanger det FØR det stille blir en umulig rating,
|
||
|
|
-- ikke etterpå.
|
||
|
|
ALTER TABLE tee_rating ALTER COLUMN gender SET NOT NULL;
|
||
|
|
ALTER TABLE tee_rating ADD CONSTRAINT tee_rating_gender_check CHECK (gender IN ('m', 'f'));
|
||
|
|
|
||
|
|
-- Den GAMLE unikheten (tee_id, scope) må vekk FØR sammenslåingen under --
|
||
|
|
-- å flytte en "duplikat"-tee sin rating over til beholder-tee-en kolliderer
|
||
|
|
-- ellers midlertidig med beholderens EGEN eksisterende (tee_id, scope)-rad
|
||
|
|
-- (samme scope, men snart ulikt kjønn -- det er jo poenget). Den NYE,
|
||
|
|
-- kjønnsbevisste unikheten legges til ETTER sammenslåingen, når den faktisk
|
||
|
|
-- kan håndheves riktig.
|
||
|
|
ALTER TABLE tee_rating DROP CONSTRAINT tee_rating_tee_id_scope_key;
|
||
|
|
|
||
|
|
-- Slå sammen "duplikat"-utslag (samme bane+navn, hittil ulikt kjønn på
|
||
|
|
-- selve tee-raden) til ÉN fysisk tee-rad. Velger MIN(id) per
|
||
|
|
-- (course_id, name) som "beholderen".
|
||
|
|
CREATE TEMP TABLE tee_merge_map AS
|
||
|
|
SELECT t.id AS old_id,
|
||
|
|
(SELECT min(t2.id::text)::uuid FROM tee t2
|
||
|
|
WHERE t2.course_id = t.course_id AND t2.name = t.name) AS keeper_id
|
||
|
|
FROM tee t;
|
||
|
|
|
||
|
|
UPDATE tee_rating tr
|
||
|
|
SET tee_id = m.keeper_id
|
||
|
|
FROM tee_merge_map m
|
||
|
|
WHERE tr.tee_id = m.old_id AND m.old_id <> m.keeper_id;
|
||
|
|
|
||
|
|
UPDATE match_participant mp
|
||
|
|
SET tee_id = m.keeper_id
|
||
|
|
FROM tee_merge_map m
|
||
|
|
WHERE mp.tee_id = m.old_id AND m.old_id <> m.keeper_id;
|
||
|
|
|
||
|
|
DELETE FROM tee t
|
||
|
|
USING tee_merge_map m
|
||
|
|
WHERE t.id = m.old_id AND m.old_id <> m.keeper_id;
|
||
|
|
|
||
|
|
DROP TABLE tee_merge_map;
|
||
|
|
|
||
|
|
-- Unikhet er nå per (tee_id, scope, gender) -- ett utslag kan ha BÅDE en
|
||
|
|
-- herre- og en dame-rating for samme scope.
|
||
|
|
ALTER TABLE tee_rating ADD CONSTRAINT tee_rating_tee_id_scope_gender_key UNIQUE (tee_id, scope, gender);
|
||
|
|
|
||
|
|
ALTER TABLE tee DROP CONSTRAINT tee_gender_check;
|
||
|
|
ALTER TABLE tee DROP COLUMN gender;
|
||
|
|
|
||
|
|
COMMIT;
|