mix: add task to compact the database
This commit is contained in:
parent
5d753e1c7c
commit
ef56488349
57
lib/mix/tasks/compact_database.ex
Normal file
57
lib/mix/tasks/compact_database.ex
Normal file
|
@ -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
|
Loading…
Reference in a new issue