CREATE EXTENSION pg_trgm;

ALTER TABLE entries
ADD COLUMN tsvec tsvector;

CREATE FUNCTION public.update_entry_tsvec () RETURNS TRIGGER LANGUAGE plpgsql AS $function$
declare
    v_text text := '';
    x_text text := '';
begin
	select text into v_text from entry_versions ev where ev.entry_id = new.entry_id order by ev.created_at desc limit 1;
	select text into x_text from entry_executions ex where ex.entry_id = new.entry_id order by ex.created_at desc limit 1;
	update entries set tsvec =
		to_tsvector('german', coalesce(v_text, '')) ||
		to_tsvector('german', coalesce(x_text, ''))
		where id = new.entry_id;
	RETURN NEW;
END
$function$;

CREATE TRIGGER entry_versions_update_tsvec
AFTER INSERT
OR
UPDATE ON entry_versions FOR EACH ROW
EXECUTE PROCEDURE update_entry_tsvec ();

CREATE TRIGGER entry_execution_update_tsvec
AFTER INSERT
OR
UPDATE ON entry_executions FOR EACH ROW
EXECUTE PROCEDURE update_entry_tsvec ();

ALTER TABLE patients
ADD COLUMN full_name TEXT GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED;

CREATE INDEX entries_tsvec_idx ON entries USING GIN (tsvec);
CREATE INDEX patients_full_name ON patients USING gin (full_name gin_trgm_ops);
