diff options
author | Haelwenn <contact+git.pleroma.social@hacktivis.me> | 2020-12-28 10:14:58 +0000 |
---|---|---|
committer | Haelwenn <contact+git.pleroma.social@hacktivis.me> | 2020-12-28 10:14:58 +0000 |
commit | b122b6ffa318af30586f9da0532135959804a6a0 (patch) | |
tree | ec01ebec0ec8877af9e4876c3627e0756677e081 /lib/mix/tasks | |
parent | e4f1d8f48c85b8a388d6c3945db157de5ce588c5 (diff) | |
parent | d0c2479710b40a88b3a74c85c9ed9e72e9a2bfaf (diff) | |
download | pleroma-b122b6ffa318af30586f9da0532135959804a6a0.tar.gz pleroma-b122b6ffa318af30586f9da0532135959804a6a0.zip |
Merge branch 'features/hashtag-column' into 'develop'
Insert text representation of hashtags into object["hashtags"]
See merge request pleroma/pleroma!2824
Diffstat (limited to 'lib/mix/tasks')
-rw-r--r-- | lib/mix/tasks/pleroma/database.ex | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 22151ce08..a09852503 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -128,6 +128,57 @@ defmodule Mix.Tasks.Pleroma.Database do |> Stream.run() end + def run(["fill_old_hashtags", month_limit]) do + import Ecto.Query + + start_pleroma() + + month_limit = String.to_integer(month_limit) + + if month_limit < 1 do + shell_error("Invalid `month_limit` argument, needs to be greater than 1") + else + time_limit = DateTime.utc_now() |> Timex.shift(months: -month_limit) + + from( + o in Object, + where: fragment("(?)->>'hashtags' is null", o.data), + where: fragment("(?)->>'tag' != '[]'", o.data), + where: o.inserted_at < ^time_limit, + select: %{id: o.id, tag: fragment("(?)->>'tag'", o.data)} + ) + |> Pleroma.Repo.chunk_stream(200, :batches) + |> Stream.each(fn objects -> + Repo.transaction(fn -> + objects_first = objects |> List.first() + objects_last = objects |> List.last() + + Logger.info( + "fill_old_hashtags: #{objects_first.id} (#{objects_first.inserted_at}) -- #{ + objects_last.id + } (#{objects_last.inserted_at})" + ) + + objects + |> Enum.map(fn object -> + tags = + object.tag + |> Jason.decode!() + |> Enum.filter(&is_bitstring(&1)) + + Object + |> where([o], o.id == ^object.id) + |> update([o], + set: [data: fragment("safe_jsonb_set(?, '{hashtags}', ?, true)", o.data, ^tags)] + ) + |> Repo.update_all([], timeout: :infinity) + end) + end) + end) + |> Stream.run() + end + end + def run(["vacuum", args]) do start_pleroma() |