Skip to content
Snippets Groups Projects
Commit a11ca87f authored by rinpatch's avatar rinpatch
Browse files

Add a migration to remove embeded objects

parent 83589ca6
Branches
No related tags found
No related merge requests found
defmodule Mix.Tasks.CompactDatabase do
@moduledoc """
Compact the database by flattening the object graph.
"""
require Logger
use Mix.Task
import Ecto.Query
alias Pleroma.Activity
alias Pleroma.Repo
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
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment