Add a migration to remove embeded objects
This commit is contained in:
parent
83589ca6a5
commit
a11ca87f40
|
@ -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
|
|
|
@ -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
|
Loading…
Reference in New Issue