From 0e11c9263cefee861e26b65f05ea4eb3fe54faf0 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sat, 28 Mar 2026 00:46:03 -0400 Subject: [PATCH] fix: add unique constraint for saved filter names and fix search sort ordering Database changes: - Add unique index on saved_filters(user_id, name, resource_type) Prevents duplicate filter names while allowing same name across different users or different resource types Search functionality fix: - Remove DISTINCT ON (mi.id) from SearchMediaItemsUnified query - Remove mi.id from ORDER BY clause (was required by DISTINCT ON) - This allows user-selected sort field to be primary sort criteria - Previously results were always sorted by ID first, making sort dropdown ineffective - Relevance score and title remain as fallback sorts This fixes the sort dropdown functionality on the bookshelf page where changing the sort option appeared to have no effect. --- database/schema/schema.sql | 7 +++++++ internal/database/queries.sql.go | 3 +-- internal/database/queries/queries.sql | 3 +-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/database/schema/schema.sql b/database/schema/schema.sql index 7e24e57..663d375 100644 --- a/database/schema/schema.sql +++ b/database/schema/schema.sql @@ -1025,6 +1025,13 @@ CREATE INDEX IF NOT EXISTS idx_saved_filters_user_resource ON saved_filters(user -- Index for name searches (future feature) CREATE INDEX IF NOT EXISTS idx_saved_filters_name ON saved_filters(user_id, name); +-- Unique constraint: One filter name per user per resource type +-- Prevents duplicate filter names while allowing: +-- - Same name for different users +-- - Same name for different resources (media-items vs collections) +CREATE UNIQUE INDEX IF NOT EXISTS idx_saved_filters_user_name_resource +ON saved_filters(user_id, name, resource_type); + -- Trigger to auto-update updated_at timestamp CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ diff --git a/internal/database/queries.sql.go b/internal/database/queries.sql.go index 6ac8759..7fc6c47 100644 --- a/internal/database/queries.sql.go +++ b/internal/database/queries.sql.go @@ -7192,7 +7192,7 @@ func (q *Queries) SearchMediaItems(ctx context.Context, arg SearchMediaItemsPara } const SearchMediaItemsUnified = `-- name: SearchMediaItemsUnified :many -SELECT DISTINCT ON (mi.id) +SELECT mi.id, mi.library_id, mi.title, @@ -7314,7 +7314,6 @@ WHERE COALESCE(lv.is_visible, true) = true ) ) ORDER BY - mi.id, -- Primary sort: relevance score when searching CASE WHEN $11 != '' THEN diff --git a/internal/database/queries/queries.sql b/internal/database/queries/queries.sql index f1ecb95..20cf711 100644 --- a/internal/database/queries/queries.sql +++ b/internal/database/queries/queries.sql @@ -373,7 +373,7 @@ LEFT JOIN library_visibility lv ON l.id = lv.library_id AND lv.user_id = sqlc.na LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset'); -- name: SearchMediaItemsUnified :many -SELECT DISTINCT ON (mi.id) +SELECT mi.id, mi.library_id, mi.title, @@ -495,7 +495,6 @@ WHERE COALESCE(lv.is_visible, true) = true ) ) ORDER BY - mi.id, -- Primary sort: relevance score when searching CASE WHEN sqlc.narg('search_query') != '' THEN