Migration 153 backs the upcoming smart-collections surface. BookmarkStore.CountByUser returns per-item counts in one SQL pass — used by the smart-collection items evaluator to hydrate the bookmark_count personalized rule without N+1 queries. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
26 lines
1.0 KiB
SQL
26 lines
1.0 KiB
SQL
-- Smart Collections — rule-based dynamic groupings of audiobooks.
|
|
-- The query_def JSONB column stores the DSL tree (see
|
|
-- internal/audiobooks/smartcoll/query.go). Profile-scoped per the
|
|
-- established convention; is_public allows cross-user reads with
|
|
-- personalization stripped at eval time.
|
|
|
|
CREATE TABLE IF NOT EXISTS public.abs_smart_collections (
|
|
id text PRIMARY KEY,
|
|
user_id integer NOT NULL REFERENCES public.users(id) ON DELETE CASCADE,
|
|
profile_id uuid,
|
|
name text NOT NULL,
|
|
description text NOT NULL DEFAULT '',
|
|
color text NOT NULL DEFAULT '',
|
|
is_public boolean NOT NULL DEFAULT false,
|
|
is_pinned boolean NOT NULL DEFAULT false,
|
|
query_def jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS abs_smart_collections_user_profile_idx
|
|
ON public.abs_smart_collections (
|
|
user_id,
|
|
COALESCE(profile_id, '00000000-0000-0000-0000-000000000000'::uuid)
|
|
);
|