Switch to associated_object_id index

This commit is contained in:
Tusooa Zhu 2022-07-11 15:49:58 -04:00
parent 06678fb4ad
commit 3885ee182a
No known key found for this signature in database
GPG Key ID: 7B467EDE43A08224
8 changed files with 50 additions and 20 deletions

View File

@ -154,9 +154,8 @@ def run(["ensure_expiration"]) do
|> join(:inner, [a], o in Object, |> join(:inner, [a], o in Object,
on: on:
fragment( fragment(
"(?->>'id') = COALESCE((?)->'object'->> 'id', (?)->>'object')", "(?->>'id') = associated_object_id((?))",
o.data, o.data,
a.data,
a.data a.data
) )
) )

View File

@ -53,7 +53,7 @@ defmodule Pleroma.Activity do
# #
# ``` # ```
# |> join(:inner, [activity], o in Object, # |> join(:inner, [activity], o in Object,
# on: fragment("(?->>'id') = COALESCE((?)->'object'->> 'id', (?)->>'object')", # on: fragment("(?->>'id') = associated_object_id((?))",
# o.data, activity.data, activity.data)) # o.data, activity.data, activity.data))
# |> preload([activity, object], [object: object]) # |> preload([activity, object], [object: object])
# ``` # ```
@ -69,9 +69,8 @@ def with_joined_object(query, join_type \\ :inner) do
join(query, join_type, [activity], o in Object, join(query, join_type, [activity], o in Object,
on: on:
fragment( fragment(
"(?->>'id') = COALESCE(?->'object'->>'id', ?->>'object')", "(?->>'id') = associated_object_id(?)",
o.data, o.data,
activity.data,
activity.data activity.data
), ),
as: :object as: :object

View File

@ -52,8 +52,7 @@ def by_object_id(query, object_ids) when is_list(object_ids) do
activity in query, activity in query,
where: where:
fragment( fragment(
"coalesce((?)->'object'->>'id', (?)->>'object') = ANY(?)", "associated_object_id((?)) = ANY(?)",
activity.data,
activity.data, activity.data,
^object_ids ^object_ids
) )
@ -64,8 +63,7 @@ def by_object_id(query, object_id) when is_binary(object_id) do
from(activity in query, from(activity in query,
where: where:
fragment( fragment(
"coalesce((?)->'object'->>'id', (?)->>'object') = ?", "associated_object_id((?)) = ?",
activity.data,
activity.data, activity.data,
^object_id ^object_id
) )

View File

@ -183,7 +183,7 @@ def delete_non_create_activities_hashtags do
DELETE FROM hashtags_objects WHERE object_id IN DELETE FROM hashtags_objects WHERE object_id IN
(SELECT DISTINCT objects.id FROM objects (SELECT DISTINCT objects.id FROM objects
JOIN hashtags_objects ON hashtags_objects.object_id = objects.id LEFT JOIN activities JOIN hashtags_objects ON hashtags_objects.object_id = objects.id LEFT JOIN activities
ON COALESCE(activities.data->'object'->>'id', activities.data->>'object') = ON associated_object_id(activities) =
(objects.data->>'id') (objects.data->>'id')
AND activities.data->>'type' = 'Create' AND activities.data->>'type' = 'Create'
WHERE activities.id IS NULL); WHERE activities.id IS NULL);

View File

@ -117,9 +117,8 @@ def for_user_query(user, opts \\ %{}) do
|> join(:left, [n, a], object in Object, |> join(:left, [n, a], object in Object,
on: on:
fragment( fragment(
"(?->>'id') = COALESCE(?->'object'->>'id', ?->>'object')", "(?->>'id') = associated_object_id(?)",
object.data, object.data,
a.data,
a.data a.data
) )
) )
@ -193,13 +192,11 @@ defp exclude_visibility(query, %{exclude_visibilities: visibility})
|> join(:left, [n, a], mutated_activity in Pleroma.Activity, |> join(:left, [n, a], mutated_activity in Pleroma.Activity,
on: on:
fragment( fragment(
"COALESCE((?->'object')->>'id', ?->>'object')", "associated_object_id(?)",
a.data,
a.data a.data
) == ) ==
fragment( fragment(
"COALESCE((?->'object')->>'id', ?->>'object')", "associated_object_id(?)",
mutated_activity.data,
mutated_activity.data mutated_activity.data
) and ) and
fragment("(?->>'type' = 'Like' or ?->>'type' = 'Announce')", a.data, a.data) and fragment("(?->>'type' = 'Like' or ?->>'type' = 'Announce')", a.data, a.data) and

View File

@ -40,8 +40,7 @@ def with_joined_activity(query, activity_type \\ "Create", join_type \\ :inner)
join(query, join_type, [{object, object_position}], a in Activity, join(query, join_type, [{object, object_position}], a in Activity,
on: on:
fragment( fragment(
"COALESCE(?->'object'->>'id', ?->>'object') = (? ->> 'id') AND (?->>'type' = ?) ", "associated_object_id(?) = (? ->> 'id') AND (?->>'type' = ?) ",
a.data,
a.data, a.data,
object.data, object.data,
a.data, a.data,

View File

@ -1150,8 +1150,7 @@ defp restrict_pinned(query, %{pinned: true, pinned_object_ids: ids}) do
[activity, object: o] in query, [activity, object: o] in query,
where: where:
fragment( fragment(
"(?)->>'type' = 'Create' and coalesce((?)->'object'->>'id', (?)->>'object') = any (?)", "(?)->>'type' = 'Create' and associated_object_id((?)) = any (?)",
activity.data,
activity.data, activity.data,
activity.data, activity.data,
^ids ^ids

View File

@ -0,0 +1,39 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Repo.Migrations.SwitchToAssociatedObjectIdIndex do
use Ecto.Migration
@disable_ddl_transaction true
@disable_migration_lock true
def up do
drop_if_exists(
index(:activities, ["(coalesce(data->'object'->>'id', data->>'object'))"],
name: :activities_create_objects_index
)
)
create(
index(:activities, ["associated_object_id(data)"],
name: :activities_create_objects_index,
concurrently: true
)
)
end
def down do
drop_if_exists(
index(:activities, ["associated_object_id(data)"],
name: :activities_create_objects_index
)
)
create(
index(:activities, ["(coalesce(data->'object'->>'id', data->>'object'))"],
name: :activities_create_objects_index,
concurrently: true
)
)
end
end