Rewrites the internal/db/queries comments to rule 32 and regenerates dbq, whose doc comments and embedded SQL carry them. The bugs behind the tiered mixes, the md5 order seed, the score bands and the round-robin arms are restated as the constraint each one enforces; counts from one library and stale cross-references are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.5 KiB
SQL
61 lines
2.5 KiB
SQL
-- Song links: 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.
|
|
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);
|