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>
86 lines
3.0 KiB
SQL
86 lines
3.0 KiB
SQL
-- name: LikeTrack :many
|
|
-- A like is on the song: every copy of it sharing the track's
|
|
-- song_key is liked. Returns the tracks newly liked, for the sync log; empty
|
|
-- when the song was already liked.
|
|
INSERT INTO general_likes (user_id, track_id)
|
|
SELECT sqlc.arg(user_id)::uuid, t.id
|
|
FROM tracks t
|
|
WHERE t.song_key = (SELECT s.song_key FROM tracks s WHERE s.id = sqlc.arg(track_id)::uuid)
|
|
ON CONFLICT (user_id, track_id) DO NOTHING
|
|
RETURNING track_id;
|
|
|
|
-- name: UnlikeTrack :many
|
|
-- Unlikes the song: every copy sharing the track's song_key. Returns the
|
|
-- tracks unliked, for the sync log.
|
|
DELETE FROM general_likes
|
|
WHERE user_id = sqlc.arg(user_id)::uuid
|
|
AND (track_id = sqlc.arg(track_id)::uuid
|
|
OR track_id IN (SELECT t.id FROM tracks t
|
|
WHERE t.song_key = (SELECT s.song_key FROM tracks s WHERE s.id = sqlc.arg(track_id)::uuid)))
|
|
RETURNING track_id;
|
|
|
|
-- name: ListLikedTrackRows :many
|
|
-- One row per liked song: of its copies, the one present on disk, then one
|
|
-- that is not a held-back video rip, then the one liked first.
|
|
SELECT t.* FROM tracks t
|
|
JOIN (SELECT DISTINCT ON (lt.song_key) l.track_id, l.liked_at
|
|
FROM general_likes l
|
|
JOIN tracks lt ON lt.id = l.track_id
|
|
WHERE l.user_id = $1
|
|
ORDER BY lt.song_key, (lt.missing_since IS NOT NULL),
|
|
(lt.source_verdict IS NOT DISTINCT FROM 'suspect'), l.liked_at, lt.id) l
|
|
ON l.track_id = t.id
|
|
ORDER BY l.liked_at DESC, t.id
|
|
LIMIT $2 OFFSET $3;
|
|
|
|
-- name: CountLikedTracks :one
|
|
-- Liked songs, each counted once however many releases hold it.
|
|
SELECT count(DISTINCT t.song_key) FROM general_likes l
|
|
JOIN tracks t ON t.id = l.track_id
|
|
WHERE l.user_id = $1;
|
|
|
|
-- name: ListLikedTrackIDs :many
|
|
SELECT track_id FROM general_likes WHERE user_id = $1 ORDER BY liked_at DESC;
|
|
|
|
-- name: LikeAlbum :exec
|
|
INSERT INTO general_likes_albums (user_id, album_id)
|
|
VALUES ($1, $2)
|
|
ON CONFLICT (user_id, album_id) DO NOTHING;
|
|
|
|
-- name: UnlikeAlbum :exec
|
|
DELETE FROM general_likes_albums WHERE user_id = $1 AND album_id = $2;
|
|
|
|
-- name: ListLikedAlbumRows :many
|
|
SELECT a.* FROM albums a
|
|
JOIN general_likes_albums l ON l.album_id = a.id
|
|
WHERE l.user_id = $1
|
|
ORDER BY l.liked_at DESC
|
|
LIMIT $2 OFFSET $3;
|
|
|
|
-- name: CountLikedAlbums :one
|
|
SELECT count(*) FROM general_likes_albums WHERE user_id = $1;
|
|
|
|
-- name: ListLikedAlbumIDs :many
|
|
SELECT album_id FROM general_likes_albums WHERE user_id = $1 ORDER BY liked_at DESC;
|
|
|
|
-- name: LikeArtist :exec
|
|
INSERT INTO general_likes_artists (user_id, artist_id)
|
|
VALUES ($1, $2)
|
|
ON CONFLICT (user_id, artist_id) DO NOTHING;
|
|
|
|
-- name: UnlikeArtist :exec
|
|
DELETE FROM general_likes_artists WHERE user_id = $1 AND artist_id = $2;
|
|
|
|
-- name: ListLikedArtistRows :many
|
|
SELECT a.* FROM artists a
|
|
JOIN general_likes_artists l ON l.artist_id = a.id
|
|
WHERE l.user_id = $1
|
|
ORDER BY l.liked_at DESC
|
|
LIMIT $2 OFFSET $3;
|
|
|
|
-- name: CountLikedArtists :one
|
|
SELECT count(*) FROM general_likes_artists WHERE user_id = $1;
|
|
|
|
-- name: ListLikedArtistIDs :many
|
|
SELECT artist_id FROM general_likes_artists WHERE user_id = $1 ORDER BY liked_at DESC;
|