diff options
| -rw-r--r-- | changelog.d/notifications.fix | 1 | ||||
| -rw-r--r-- | lib/pleroma/following_relationship.ex | 10 | ||||
| -rw-r--r-- | lib/pleroma/notification.ex | 6 | 
3 files changed, 9 insertions, 8 deletions
diff --git a/changelog.d/notifications.fix b/changelog.d/notifications.fix new file mode 100644 index 000000000..a2d2eaea9 --- /dev/null +++ b/changelog.d/notifications.fix @@ -0,0 +1 @@ +Notifications: improve performance by filtering on users table instead of activities table
\ No newline at end of file diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 15664c876..f38c2fce9 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -241,13 +241,13 @@ defmodule Pleroma.FollowingRelationship do    end    @doc """ -  For a query with joined activity, -  keeps rows where activity's actor is followed by user -or- is NOT domain-blocked by user. +  For a query with joined activity's actor, +  keeps rows where actor is followed by user -or- is NOT domain-blocked by user.    """    def keep_following_or_not_domain_blocked(query, user) do      where(        query, -      [_, activity], +      [_, user_actor: user_actor],        fragment(          # "(actor's domain NOT in domain_blocks) OR (actor IS in followed AP IDs)"          """ @@ -255,9 +255,9 @@ defmodule Pleroma.FollowingRelationship do            ? = ANY(SELECT ap_id FROM users AS u INNER JOIN following_relationships AS fr              ON u.id = fr.following_id WHERE fr.follower_id = ? AND fr.state = ?)          """, -        activity.actor, +        user_actor.ap_id,          ^user.domain_blocks, -        activity.actor, +        user_actor.ap_id,          ^User.binary_id(user.id),          ^accept_state_code()        ) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 368e609d2..710b19866 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -137,7 +137,7 @@ defmodule Pleroma.Notification do      blocked_ap_ids = opts[:blocked_users_ap_ids] || User.blocked_users_ap_ids(user)      query -    |> where([n, a], a.actor not in ^blocked_ap_ids) +    |> where([..., user_actor: user_actor], user_actor.ap_id not in ^blocked_ap_ids)      |> FollowingRelationship.keep_following_or_not_domain_blocked(user)    end @@ -148,7 +148,7 @@ defmodule Pleroma.Notification do        blocker_ap_ids = User.incoming_relationships_ungrouped_ap_ids(user, [:block])        query -      |> where([n, a], a.actor not in ^blocker_ap_ids) +      |> where([..., user_actor: user_actor], user_actor.ap_id not in ^blocker_ap_ids)      end    end @@ -161,7 +161,7 @@ defmodule Pleroma.Notification do        opts[:notification_muted_users_ap_ids] || User.notification_muted_users_ap_ids(user)      query -    |> where([n, a], a.actor not in ^notification_muted_ap_ids) +    |> where([..., user_actor: user_actor], user_actor.ap_id not in ^notification_muted_ap_ids)      |> join(:left, [n, a], tm in ThreadMute,        on: tm.user_id == ^user.id and tm.context == fragment("?->>'context'", a.data),        as: :thread_mute  | 
