defmodule Memex.Repo.Migrations.CreateNotes do use Ecto.Migration def up do create table(:notes, primary_key: false) do add :id, :binary_id, primary_key: true add :title, :string add :content, :text add :tags, {:array, :citext} add :visibility, :string add :user_id, references(:users, on_delete: :delete_all, type: :binary_id) timestamps() end flush() execute """ CREATE FUNCTION immutable_array_to_string(text[], text) RETURNS text LANGUAGE sql IMMUTABLE as $$SELECT array_to_string($1, $2)$$ """ execute """ ALTER TABLE notes ADD COLUMN search tsvector GENERATED ALWAYS AS ( setweight(to_tsvector('english', coalesce(title, '')), 'A') || setweight(to_tsvector('english', coalesce(immutable_array_to_string(tags, ' '), '')), 'B') || setweight(to_tsvector('english', coalesce(content, '')), 'C') ) STORED """ execute("CREATE INDEX notes_trgm_idx ON notes USING GIN (search)") end def down do drop table(:notes) execute("DROP FUNCTION immutable_array_to_string(text[], text)") end end