# Using an SQL CTE to avoid unneeded back-and-forth with SQL server in case of long threads
!Status.count_by_sql([<<-SQL.squish, id: @notification.target_status.in_reply_to_id, recipient_id: @recipient.id, sender_id: @notification.from_account.id]).zero?
- WITH RECURSIVE ancestors(id, in_reply_to_id, replying_to_sender) AS (
+ WITH RECURSIVE ancestors(id, in_reply_to_id, replying_to_sender, path) AS (
SELECT
- s.id, s.in_reply_to_id, (CASE
+ s.id,
+ s.in_reply_to_id,
+ (CASE
WHEN s.account_id = :recipient_id THEN
EXISTS (
SELECT *
)
ELSE
FALSE
- END)
+ END),
+ ARRAY[s.id]
FROM statuses s
WHERE s.id = :id
UNION ALL
)
ELSE
FALSE
- END)
+ END),
+ st.path || s.id
FROM ancestors st
JOIN statuses s ON s.id = st.in_reply_to_id
- WHERE st.replying_to_sender IS FALSE
+ WHERE st.replying_to_sender IS FALSE AND NOT s.id = ANY(path)
)
SELECT COUNT(*)
FROM ancestors st