Add a migration to remove embeded objects

This commit is contained in:
rinpatch 2019-04-18 13:10:38 +03:00
parent 83589ca6a5
commit a11ca87f40
2 changed files with 10 additions and 57 deletions

View file

@ -1,57 +0,0 @@
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

View file

@ -0,0 +1,10 @@
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