Files
Compass/backend/supabase/rebuild_profile_search.sql

95 lines
3.5 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION rebuild_profile_search(profile_id_param BIGINT)
RETURNS void AS
$$
DECLARE
bio_part TEXT;
interests_part TEXT;
causes_part TEXT;
work_part TEXT;
headline_part TEXT;
occupation_part TEXT;
occupation_title_part TEXT;
company_part TEXT;
university_part TEXT;
city_part TEXT;
country_part TEXT;
born_in_location_part TEXT;
raised_in_city_part TEXT;
raised_in_country_part TEXT;
political_details_part TEXT;
religious_beliefs_part TEXT;
keywords_part TEXT;
BEGIN
-- Bio text
SELECT string_agg(DISTINCT trim(both '"' from value::text), ' ')
INTO bio_part
FROM profiles p,
jsonb_path_query(p.bio, '$.**.text') AS t(value)
WHERE p.id = profile_id_param;
-- Interests text
SELECT string_agg(i.name, ' ')
INTO interests_part
FROM profile_interests pi
JOIN interests i ON i.id = pi.option_id
WHERE pi.profile_id = profile_id_param;
-- Causes text
SELECT string_agg(i.name, ' ')
INTO causes_part
FROM profile_causes pc
JOIN causes i ON i.id = pc.option_id
WHERE pc.profile_id = profile_id_param;
-- Work text
SELECT string_agg(i.name, ' ')
INTO work_part
FROM profile_work pw
JOIN work i ON i.id = pw.option_id
WHERE pw.profile_id = profile_id_param;
-- Direct text fields from profiles table
SELECT headline,
occupation,
occupation_title,
company,
university,
city,
country,
born_in_location,
raised_in_city,
raised_in_country,
political_details,
religious_beliefs
INTO
headline_part, occupation_part, occupation_title_part, company_part,
university_part, city_part, country_part, born_in_location_part,
raised_in_city_part, raised_in_country_part, political_details_part, religious_beliefs_part
FROM profiles
WHERE id = profile_id_param;
-- Keywords array
SELECT string_agg(keyword, ' ')
INTO keywords_part
FROM profiles p,
unnest(p.keywords) AS keyword
WHERE p.id = profile_id_param;
UPDATE profiles
SET bio_text = bio_part,
search_text = concat_ws(' ', bio_part, interests_part, causes_part, work_part,
headline_part, occupation_part, occupation_title_part, company_part,
university_part, city_part, country_part, born_in_location_part,
raised_in_city_part, raised_in_country_part, political_details_part,
religious_beliefs_part, keywords_part),
search_tsv = to_tsvector('english', concat_ws(' ', bio_part, interests_part, causes_part, work_part,
headline_part, occupation_part, occupation_title_part,
company_part,
university_part, city_part, country_part, born_in_location_part,
raised_in_city_part, raised_in_country_part,
political_details_part,
religious_beliefs_part, keywords_part))
WHERE id = profile_id_param;
END;
$$ LANGUAGE plpgsql;