From 2634723958ea4397e8106e1f42fc79f03ff6857d Mon Sep 17 00:00:00 2001 From: itepechi <72330683+itepechi@users.noreply.github.com> Date: Sun, 6 Aug 2023 06:16:38 +0900 Subject: [PATCH] Support for setting PGroonga indexing options --- lib/mix/tasks/pleroma/database.ex | 70 +++++++++++-------- .../20230802195431_create_pgroonga_index.exs | 4 +- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index fca1e6d9c..c6efb87ee 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -331,51 +331,59 @@ defmodule Mix.Tasks.Pleroma.Database do shell_info("Error: #{inspect(msg, pretty: true)}") else rum_enabled = Pleroma.Config.get([:database, :rum_enabled]) - pgroonga_enabled = Pleroma.Config.get([:database, :pgroonga_enabled]) - shell_info("Recreate index, RUM: #{rum_enabled}, PGroonga: #{pgroonga_enabled}") + shell_info("Recreate index, RUM: #{rum_enabled}") # Note SQL below needs to be kept up-to-date with latest GIN or RUM index definition in future - cond do - rum_enabled -> - Ecto.Adapters.SQL.query!( - Pleroma.Repo, - "CREATE OR REPLACE FUNCTION objects_fts_update() RETURNS trigger AS $$ BEGIN + if rum_enabled do + Ecto.Adapters.SQL.query!( + Pleroma.Repo, + "CREATE OR REPLACE FUNCTION objects_fts_update() RETURNS trigger AS $$ BEGIN new.fts_content := to_tsvector(new.data->>'content'); RETURN new; END $$ LANGUAGE plpgsql", - [], - timeout: :infinity - ) + [], + timeout: :infinity + ) - shell_info("Refresh RUM index") - Ecto.Adapters.SQL.query!(Pleroma.Repo, "UPDATE objects SET updated_at = NOW();") + shell_info("Refresh RUM index") + Ecto.Adapters.SQL.query!(Pleroma.Repo, "UPDATE objects SET updated_at = NOW();") + else + Ecto.Adapters.SQL.query!(Pleroma.Repo, "DROP INDEX IF EXISTS objects_fts;") - pgroonga_enabled -> - Ecto.Adapters.SQL.query!(Pleroma.Repo, "DROP INDEX IF EXISTS object_content_pgroonga;") - - Ecto.Adapters.SQL.query!( - Pleroma.Repo, - "CREATE INDEX object_content_pgroonga ON objects USING pgroonga ((data->'content')) WITH (tokenizer='TokenMecab');", - [], - timeout: :infinity - ) - - true -> - Ecto.Adapters.SQL.query!(Pleroma.Repo, "DROP INDEX IF EXISTS objects_fts;") - - Ecto.Adapters.SQL.query!( - Pleroma.Repo, - "CREATE INDEX CONCURRENTLY objects_fts ON objects USING gin(to_tsvector('#{tsconfig}', data->>'content'));", - [], - timeout: :infinity - ) + Ecto.Adapters.SQL.query!( + Pleroma.Repo, + "CREATE INDEX CONCURRENTLY objects_fts ON objects USING gin(to_tsvector('#{tsconfig}', data->>'content'));", + [], + timeout: :infinity + ) end shell_info('Done.') end end + def run(["set_pgroonga_options", pg_options]) do + start_pleroma() + pgroonga_enabled = Pleroma.Config.get([:database, :pgroonga_enabled]) + + if pgroonga_enabled do + shell_info("Recreate index with options #{pg_options}") + Ecto.Adapters.SQL.query!(Pleroma.Repo, "DROP INDEX IF EXISTS object_content_pgroonga;") + + Ecto.Adapters.SQL.query!( + Pleroma.Repo, + "CREATE INDEX object_content_pgroonga ON objects USING pgroonga ((data->'content')) WITH (#{pg_options});", + [], + timeout: :infinity + ) + + shell_info('Done.') + else + shell_info('PGroonga is not enabled.') + end + end + # Rolls back a specific migration (leaving subsequent migrations applied). # WARNING: imposes a risk of unrecoverable data loss — proceed at your own responsibility. # Based on https://stackoverflow.com/a/53825840 diff --git a/priv/repo/optional_migrations/pgroonga/20230802195431_create_pgroonga_index.exs b/priv/repo/optional_migrations/pgroonga/20230802195431_create_pgroonga_index.exs index 0e006b58f..54717b5d2 100644 --- a/priv/repo/optional_migrations/pgroonga/20230802195431_create_pgroonga_index.exs +++ b/priv/repo/optional_migrations/pgroonga/20230802195431_create_pgroonga_index.exs @@ -11,9 +11,7 @@ defmodule Pleroma.Repo.Migrations.CreatePgroongaIndex do ) ) - execute( - "CREATE INDEX object_content_pgroonga ON objects USING pgroonga ((data->'content')) WITH (tokenizer='TokenMecab')" - ) + execute("CREATE INDEX object_content_pgroonga ON objects USING pgroonga ((data->'content'))") end def down do