summaryrefslogtreecommitdiff
path: root/lib/mix/tasks
diff options
context:
space:
mode:
authorHaelwenn <contact+git.pleroma.social@hacktivis.me>2020-12-28 10:14:58 +0000
committerHaelwenn <contact+git.pleroma.social@hacktivis.me>2020-12-28 10:14:58 +0000
commitb122b6ffa318af30586f9da0532135959804a6a0 (patch)
treeec01ebec0ec8877af9e4876c3627e0756677e081 /lib/mix/tasks
parente4f1d8f48c85b8a388d6c3945db157de5ce588c5 (diff)
parentd0c2479710b40a88b3a74c85c9ed9e72e9a2bfaf (diff)
downloadpleroma-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.ex51
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()