From 989e0e1ea98788bba1573a14c5b1b5acc1d55b7f Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 4 Dec 2025 16:45:29 -0500 Subject: [PATCH 1/2] add tags index and search function --- .../20251204120000_add_tags_support.sql | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 supabase/migrations/20251204120000_add_tags_support.sql diff --git a/supabase/migrations/20251204120000_add_tags_support.sql b/supabase/migrations/20251204120000_add_tags_support.sql new file mode 100644 index 00000000..2596c674 --- /dev/null +++ b/supabase/migrations/20251204120000_add_tags_support.sql @@ -0,0 +1,30 @@ +-- Create GIN index on the tags array in the JSONB data field +-- This allows efficient querying of documents by tag +CREATE INDEX IF NOT EXISTS idx_documents_tags + ON "public"."documents" USING gin ((data->'tags')); + +-- Function to search and aggregate tags from documents +-- This does the aggregation in the database rather than fetching all documents +CREATE OR REPLACE FUNCTION search_tags(search_query text) +RETURNS TABLE (name text, document_count bigint) AS $$ +BEGIN + RETURN QUERY + SELECT + LOWER(tag::text) as name, + COUNT(DISTINCT d.uri) as document_count + FROM + "public"."documents" d, + jsonb_array_elements_text(d.data->'tags') as tag + WHERE + CASE + WHEN search_query = '' THEN true + ELSE LOWER(tag::text) LIKE '%' || search_query || '%' + END + GROUP BY + LOWER(tag::text) + ORDER BY + COUNT(DISTINCT d.uri) DESC, + LOWER(tag::text) ASC + LIMIT 20; +END; +$$ LANGUAGE plpgsql STABLE; -- 2.51.2 From 221abd040f65f6925dfa10eabc2e3c74993ef114 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 4 Dec 2025 16:54:49 -0500 Subject: [PATCH 2/2] add search_tags rpc function --- supabase/database.types.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/supabase/database.types.ts b/supabase/database.types.ts index 43d56b03..5477c61a 100644 --- a/supabase/database.types.ts +++ b/supabase/database.types.ts @@ -1158,6 +1158,15 @@ export type Database = { } Returns: Database["public"]["CompositeTypes"]["pull_result"] } + search_tags: { + Args: { + search_query: string + } + Returns: { + name: string + document_count: number + }[] + } } Enums: { rsvp_status: "GOING" | "NOT_GOING" | "MAYBE" -- 2.51.2