-- ===================================================================== -- 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;