updated migration and query

This commit is contained in:
Swifty
2025-10-16 13:06:47 +02:00
parent 8610118ddc
commit 84ad4a9f95
2 changed files with 45 additions and 51 deletions

View File

@@ -118,41 +118,36 @@ async def get_store_agents(
# Execute full-text search query
sql_query = f"""
WITH query AS (
SELECT to_tsquery(string_agg(lexeme || ':*', ' & ' ORDER BY positions)) AS q
FROM unnest(to_tsvector('{search_term}'))
)
SELECT
slug,
agent_name,
agent_image,
creator_username,
creator_avatar,
sub_heading,
description,
runs,
rating,
categories,
featured,
is_available,
updated_at,
ts_rank(CAST(search AS tsvector), query.q) AS rank
FROM "StoreAgent", query
WHERE {where_filter} AND search @@ query.q
ORDER BY {order_by_clause}
LIMIT {page_size}
OFFSET {offset};
SELECT
slug,
agent_name,
agent_image,
creator_username,
creator_avatar,
sub_heading,
description,
runs,
rating,
categories,
featured,
is_available,
updated_at,
ts_rank_cd(search, query) AS rank
FROM "StoreAgent",
plainto_tsquery('english', '{search_term}') AS query
WHERE {where_filter}
AND search @@ query
ORDER BY rank DESC, {order_by_clause}
LIMIT {page_size} OFFSET {offset}
"""
# Count query for pagination
count_query = f"""
WITH query AS (
SELECT to_tsquery(string_agg(lexeme || ':*', ' & ' ORDER BY positions)) AS q
FROM unnest(to_tsvector('{search_term}'))
)
SELECT COUNT(*) as count
FROM "StoreAgent", query
WHERE {where_filter} AND search @@ query.q;
SELECT COUNT(*) as count
FROM "StoreAgent",
plainto_tsquery('english', '{search_term}') AS query
WHERE {where_filter}
AND search @@ query
"""
# Execute both queries

View File

@@ -4,31 +4,29 @@ ALTER TABLE "StoreListingVersion" ADD COLUMN "search" tsvector DEFAULT ''::tsvec
-- Add trigger to update the search column with the tsvector of the agent
-- Function to be invoked by trigger
CREATE OR REPLACE FUNCTION update_tsvector_column() RETURNS TRIGGER AS $$
BEGIN
NEW.search := to_tsvector('english', COALESCE(NEW.description, '')|| ' ' ||COALESCE(NEW.name, '')|| ' ' ||COALESCE(NEW.subHeading, '')|| ' ' ||COALESCE(NEW.description, ''));
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY definer SET search_path = public, pg_temp;
-- Trigger that keeps the TSVECTOR up to date
-- Drop the trigger first
DROP TRIGGER IF EXISTS "update_tsvector" ON "StoreListingVersion";
-- Drop the function completely
DROP FUNCTION IF EXISTS update_tsvector_column();
-- Now recreate it fresh
CREATE OR REPLACE FUNCTION update_tsvector_column() RETURNS TRIGGER AS $$
BEGIN
NEW.search := to_tsvector('english',
COALESCE(NEW.name, '') || ' ' ||
COALESCE(NEW.description, '') || ' ' ||
COALESCE(NEW."subHeading", '')
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = platform, pg_temp;
-- Recreate the trigger
CREATE TRIGGER "update_tsvector"
BEFORE INSERT OR UPDATE ON "StoreListingVersion"
FOR EACH ROW
EXECUTE FUNCTION update_tsvector_column ();
BEGIN;
EXECUTE FUNCTION update_tsvector_column();
-- Drop and recreate the StoreAgent view with isAvailable field
DROP VIEW IF EXISTS "StoreAgent";
@@ -68,6 +66,7 @@ SELECT
COALESCE(ar.run_count, 0::bigint) AS runs,
COALESCE(rs.avg_rating, 0.0)::double precision AS rating,
COALESCE(av.versions, ARRAY[slv.version::text]) AS versions,
COALESCE(sl."useForOnboarding", false) AS "useForOnboarding",
slv."isAvailable" AS is_available -- Add isAvailable field to filter sub-agents
FROM "StoreListing" sl
JOIN latest_versions lv