forked from AkkomaGang/akkoma
[#3213] Speedup of HashtagsTableMigrator (query optimization). State handling fix.
This commit is contained in:
parent
218c519606
commit
f264d930cc
2 changed files with 19 additions and 3 deletions
|
@ -72,6 +72,8 @@ def handle_continue(:init_state, _state) do
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info(:migrate_hashtags, state) do
|
def handle_info(:migrate_hashtags, state) do
|
||||||
|
State.clear()
|
||||||
|
|
||||||
data_migration = data_migration()
|
data_migration = data_migration()
|
||||||
|
|
||||||
persistent_data = Map.take(data_migration.data, ["max_processed_id"])
|
persistent_data = Map.take(data_migration.data, ["max_processed_id"])
|
||||||
|
@ -152,8 +154,6 @@ defp query do
|
||||||
# Note: most objects have Mention-type AS2 tags and no hashtags (but we can't filter them out)
|
# Note: most objects have Mention-type AS2 tags and no hashtags (but we can't filter them out)
|
||||||
from(
|
from(
|
||||||
object in Object,
|
object in Object,
|
||||||
left_join: hashtag in assoc(object, :hashtags),
|
|
||||||
where: is_nil(hashtag.id),
|
|
||||||
where:
|
where:
|
||||||
fragment("(?)->'tag' IS NOT NULL AND (?)->'tag' != '[]'::jsonb", object.data, object.data),
|
fragment("(?)->'tag' IS NOT NULL AND (?)->'tag' != '[]'::jsonb", object.data, object.data),
|
||||||
select: %{
|
select: %{
|
||||||
|
@ -161,12 +161,24 @@ defp query do
|
||||||
tag: fragment("(?)->'tag'", object.data)
|
tag: fragment("(?)->'tag'", object.data)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|> join(:left, [o], hashtags_objects in fragment("SELECT object_id FROM hashtags_objects"),
|
||||||
|
on: hashtags_objects.object_id == o.id
|
||||||
|
)
|
||||||
|
|> where([_o, hashtags_objects], is_nil(hashtags_objects.object_id))
|
||||||
end
|
end
|
||||||
|
|
||||||
defp transfer_object_hashtags(object) do
|
defp transfer_object_hashtags(object) do
|
||||||
embedded_tags = (Map.has_key?(object, :tag) && object.tag) || object.data["tag"]
|
embedded_tags = if Map.has_key?(object, :tag), do: object.tag, else: object.data["tag"]
|
||||||
hashtags = Object.object_data_hashtags(%{"tag" => embedded_tags})
|
hashtags = Object.object_data_hashtags(%{"tag" => embedded_tags})
|
||||||
|
|
||||||
|
if Enum.any?(hashtags) do
|
||||||
|
transfer_object_hashtags(object, hashtags)
|
||||||
|
else
|
||||||
|
{:ok, object.id}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_object_hashtags(object, hashtags) do
|
||||||
Repo.transaction(fn ->
|
Repo.transaction(fn ->
|
||||||
with {:ok, hashtag_records} <- Hashtag.get_or_create_by_names(hashtags) do
|
with {:ok, hashtag_records} <- Hashtag.get_or_create_by_names(hashtags) do
|
||||||
for hashtag_record <- hashtag_records do
|
for hashtag_record <- hashtag_records do
|
||||||
|
|
|
@ -12,6 +12,10 @@ def start_link(_) do
|
||||||
Agent.start_link(fn -> @init_state end, name: @reg_name)
|
Agent.start_link(fn -> @init_state end, name: @reg_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def clear do
|
||||||
|
Agent.update(@reg_name, fn _state -> @init_state end)
|
||||||
|
end
|
||||||
|
|
||||||
def get do
|
def get do
|
||||||
Agent.get(@reg_name, & &1)
|
Agent.get(@reg_name, & &1)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue