-- Song links (M498 #5438): copies of one song on different releases share a -- song_key (migration 0076). -- name: LinkTracksAsSong :one -- Links the tracks into one song, joining any songs they already belong to. -- The song keeps the lowest key among them, so linking the same set again -- changes nothing. Returns that key and how many tracks moved to it. WITH keys AS ( SELECT DISTINCT song_key FROM tracks WHERE id = ANY(sqlc.arg(track_ids)::uuid[]) ), target AS ( SELECT song_key FROM keys ORDER BY song_key LIMIT 1 ), moved AS ( UPDATE tracks t SET song_id = (SELECT song_key FROM target) WHERE t.song_key IN (SELECT song_key FROM keys) AND t.song_key <> (SELECT song_key FROM target) RETURNING t.id ) SELECT (SELECT song_key FROM target)::uuid AS song_key, (SELECT count(*) FROM moved)::bigint AS moved; -- name: ShareSongLikes :many -- A like on any copy of the song becomes a like on every copy, dated the -- earliest. Returns the likes added, for the sync log. INSERT INTO general_likes (user_id, track_id, liked_at) SELECT l.user_id, t.id, min(l.liked_at) FROM general_likes l JOIN tracks lt ON lt.id = l.track_id JOIN tracks t ON t.song_key = lt.song_key WHERE lt.song_key = sqlc.arg(song_key)::uuid GROUP BY l.user_id, t.id ON CONFLICT (user_id, track_id) DO NOTHING RETURNING user_id, track_id; -- name: UnlinkDuplicateGroupSongs :exec -- "Not the same song": the group's copies stop sharing a song. Likes already -- shared stay where they are. UPDATE tracks SET song_id = NULL WHERE song_id IS NOT NULL AND id IN (SELECT track_id FROM duplicate_group_members WHERE group_id = sqlc.arg(group_id)); -- name: ListTrackSongKeys :many -- What the mix writer needs to place a track: its song, and whether it is a -- video rip held back from the mixes (#5439). SELECT id, song_key, (source_verdict IS NOT DISTINCT FROM 'suspect')::boolean AS held_back FROM tracks WHERE id = ANY(sqlc.arg(ids)::uuid[]); -- name: MergeInheritSongLink :exec -- A merge keeps the removed copy's song link: when the copy being removed was -- linked to copies on other releases and the survivor was not, the survivor -- joins that song. The copy whose id names the song has no song_id of its -- own, so "linked" is another copy sharing its key, not a song_id. UPDATE tracks s SET song_id = l.song_key FROM tracks l WHERE s.id = sqlc.arg(survivor_id)::uuid AND l.id = sqlc.arg(loser_id)::uuid AND s.song_id IS NULL AND EXISTS (SELECT 1 FROM tracks o WHERE o.song_key = l.song_key AND o.id <> l.id AND o.id <> s.id);