Replace embedded object migration with a mix task
authorrinpatch <rinpatch@sdf.org>
Thu, 18 Apr 2019 20:34:01 +0000 (23:34 +0300)
committerrinpatch <rinpatch@sdf.org>
Thu, 18 Apr 2019 20:34:01 +0000 (23:34 +0300)
lib/mix/tasks/pleroma/database.ex [new file with mode: 0644]
priv/repo/migrations/20190418072951_remove_embeded_objects.exs [deleted file]

diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex
new file mode 100644 (file)
index 0000000..ce3252a
--- /dev/null
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Mix.Tasks.Pleroma.Database do
+  alias Mix.Tasks.Pleroma.Common
+  use Mix.Task
+
+  @shortdoc "A collection of database related tasks"
+  @moduledoc """
+   A collection of database related tasks
+
+   ## Replace embedded objects with their references
+
+   Replaces embedded objects with references to them in the `objects` table. Only needs to be ran once. The reason why this is not a migration is because it could significantly increase the database size after being ran, however after this `VACUUM FULL` will be able to reclaim about 20% (really depends on what is in the database, your mileage may vary) of the db size before the migration.
+
+       mix pleroma.database remove_embedded_objects
+
+    Options:
+    - `--vacuum` - run `VACUUM FULL` after the embedded objects are replaced with their references
+  """
+  def run(["remove_embedded_objects" | args]) do
+    {options, [], []} =
+      OptionParser.parse(
+        args,
+        strict: [
+          vacuum: :boolean
+        ]
+      )
+
+    Common.start_pleroma()
+
+    Ecto.Adapters.SQL.query!(
+      Pleroma.Repo,
+      "update activities set data = jsonb_set(data, '{object}'::text[], data->'object'->'id') where data->'object'->>'id' is not null;"
+    )
+
+    if Keyword.get(options, :vacuum) do
+      Ecto.Adapters.SQL.query!(
+        Pleroma.Repo,
+        "vacuum full;"
+      )
+    end
+  end
+end
diff --git a/priv/repo/migrations/20190418072951_remove_embeded_objects.exs b/priv/repo/migrations/20190418072951_remove_embeded_objects.exs
deleted file mode 100644 (file)
index 1280942..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-defmodule Pleroma.Repo.Migrations.RemoveEmbededObjects do
-  use Ecto.Migration
-
-  # TODO: bench on a real DB and add clippy if it takes too long
-  def change do
-  execute """
-  update activities set data = jsonb_set(data, '{object}'::text[], data->'object'->'id') where data->>'type' = 'Create' and data->'object'->>'id' is not null;
-  """
-  end
-end