Update in chunks.
[akkoma] / priv / repo / migrations / 20171109091239_add_actor_to_activity.exs
1 defmodule Pleroma.Repo.Migrations.AddActorToActivity do
2 use Ecto.Migration
3
4 alias Pleroma.{Repo, Activity}
5
6 @disable_ddl_transaction true
7
8 def up do
9 alter table(:activities) do
10 add :actor, :string
11 end
12
13 max = Repo.aggregate(Activity, :max, :id)
14 IO.puts("#{max} activities")
15 chunks = 0..(round(max / 10_000))
16
17 Enum.each(chunks, fn (i) ->
18 min = i * 10_000
19 max = min + 10_000
20 IO.puts("Updating #{min}")
21 execute """
22 update activities set actor = data->>'actor' where id > #{min} and id <= #{max};
23 """
24 end)
25
26 create index(:activities, [:actor, "id DESC NULLS LAST"], concurrently: true)
27 end
28
29 def down do
30 drop index(:activities, [:actor, "id DESC NULLS LAST"])
31 alter table(:activities) do
32 remove :actor
33 end
34 end
35 end