[#2053] Changed Notification/for_user_query/2 to use join to filter out inactive actors instead of subselect of _all_ inactive AP ids from users.

This commit is contained in:
Ivan Tashkinov 2021-02-15 09:08:04 +03:00
parent db716f860a
commit 284504f689

View file

@ -112,13 +112,6 @@ def for_user_query(user, opts \\ %{}) do
Notification Notification
|> where(user_id: ^user.id) |> where(user_id: ^user.id)
|> where(
[n, a],
fragment(
"? not in (SELECT ap_id FROM users WHERE is_active = 'false')",
a.actor
)
)
|> join(:inner, [n], activity in assoc(n, :activity)) |> join(:inner, [n], activity in assoc(n, :activity))
|> join(:left, [n, a], object in Object, |> join(:left, [n, a], object in Object,
on: on:
@ -129,7 +122,9 @@ def for_user_query(user, opts \\ %{}) do
a.data a.data
) )
) )
|> join(:inner, [_n, a], u in User, on: u.ap_id == a.actor, as: :user_actor)
|> preload([n, a, o], activity: {a, object: o}) |> preload([n, a, o], activity: {a, object: o})
|> where([user_actor: user_actor], user_actor.is_active)
|> exclude_notification_muted(user, exclude_notification_muted_opts) |> exclude_notification_muted(user, exclude_notification_muted_opts)
|> exclude_blocked(user, exclude_blocked_opts) |> exclude_blocked(user, exclude_blocked_opts)
|> exclude_filtered(user) |> exclude_filtered(user)
@ -156,9 +151,10 @@ defp exclude_notification_muted(query, user, opts) do
query query
|> where([n, a], a.actor not in ^notification_muted_ap_ids) |> where([n, a], a.actor not in ^notification_muted_ap_ids)
|> join(:left, [n, a], tm in ThreadMute, |> join(:left, [n, a], tm in ThreadMute,
on: tm.user_id == ^user.id and tm.context == fragment("?->>'context'", a.data) on: tm.user_id == ^user.id and tm.context == fragment("?->>'context'", a.data),
as: :thread_mute
) )
|> where([n, a, o, tm], is_nil(tm.user_id)) |> where([thread_mute: thread_mute], is_nil(thread_mute.user_id))
end end
defp exclude_filtered(query, user) do defp exclude_filtered(query, user) do