Я передаю права собственности как отношения «Проект -> Владение -> Пользователь», и следующая функция получает имена владельцев проекта в виде текста:
CREATE FUNCTION owners_as_text(projects) RETURNS TEXT AS $$
SELECT trim(both concat_ws(' ', screen_name, first_name, last_name)) FROM users
INNER JOIN ownerships ON users.id = ownerships.user_id
WHERE deleted_at IS NULL AND ownable_id = $1.id AND ownable_type = 'Project'
$$ LANGUAGE SQL IMMUTABLE SET search_path = public, pg_temp;
Затем используется для построения индекса, который игнорирует акценты:
CREATE INDEX index_projects_on_owners_as_text
ON projects
USING GIN(immutable_unaccent(owners_as_text(projects)) gin_trgm_ops)
Когда проект обновляется, этот индекс также обновляется. Однако, когда, например, имя владельца меняется, этот индекс не будет затронут, верно?
Как я могу заставить индекс обновляться на регулярной основе, чтобы наверстать упущенное в этом случае?
(REINDEX
не вариант, так как он блокируется и вызывает взаимные блокировки, если действия записи происходят одновременно.)