aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/mix/tasks/compact_database.ex57
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/mix/tasks/compact_database.ex b/lib/mix/tasks/compact_database.ex
new file mode 100644
index 000000000..b84b340ac
--- /dev/null
+++ b/lib/mix/tasks/compact_database.ex
@@ -0,0 +1,57 @@
+defmodule Mix.Tasks.CompactDatabase do
+ @moduledoc """
+ Compact the database by flattening the object graph.
+ """
+
+ require Logger
+
+ use Mix.Task
+ import Mix.Ecto
+ import Ecto.Query
+ alias Pleroma.{Repo, Object, Activity}
+
+ defp maybe_compact(%Activity{data: %{"object" => %{"id" => object_id}}} = activity) do
+ data =
+ activity.data
+ |> Map.put("object", object_id)
+
+ {:ok, activity} =
+ Activity.change(activity, %{data: data})
+ |> Repo.update()
+
+ {:ok, activity}
+ end
+
+ defp maybe_compact(%Activity{} = activity), do: {:ok, activity}
+
+ defp activity_query(min_id, max_id) do
+ from(
+ a in Activity,
+ where: fragment("?->>'type' = 'Create'", a.data),
+ where: a.id >= ^min_id,
+ where: a.id < ^max_id
+ )
+ end
+
+ def run(args) do
+ Application.ensure_all_started(:pleroma)
+
+ max = Repo.aggregate(Activity, :max, :id)
+ Logger.info("Considering #{max} activities")
+
+ chunks = 0..(round(max / 100))
+
+ Enum.each(chunks, fn (i) ->
+ min = i * 100
+ max = min + 100
+
+ activity_query(min, max)
+ |> Repo.all()
+ |> Enum.each(&maybe_compact/1)
+
+ IO.write(".")
+ end)
+
+ Logger.info("Finished.")
+ end
+end