Exclude status itself from context query (#7083)

ancestor_statuses and descendant_statuses used to include the root status
itself, but the behavior is confusing because the root status is not
an ancestor nor descendant.
This commit is contained in:
Akihiko Odaki 2018-04-09 16:58:53 +09:00 committed by Eugen Rochko
parent 0893b16695
commit 498327b2e3

View File

@ -15,16 +15,12 @@ module StatusThreadingConcern
def ancestor_ids def ancestor_ids
Rails.cache.fetch("ancestors:#{id}") do Rails.cache.fetch("ancestors:#{id}") do
ancestors_without_self.pluck(:id) ancestor_statuses.pluck(:id)
end end
end end
def ancestors_without_self
ancestor_statuses - [self]
end
def ancestor_statuses def ancestor_statuses
Status.find_by_sql([<<-SQL.squish, id: id]) Status.find_by_sql([<<-SQL.squish, id: in_reply_to_id])
WITH RECURSIVE search_tree(id, in_reply_to_id, path) WITH RECURSIVE search_tree(id, in_reply_to_id, path)
AS ( AS (
SELECT id, in_reply_to_id, ARRAY[id] SELECT id, in_reply_to_id, ARRAY[id]
@ -43,11 +39,7 @@ module StatusThreadingConcern
end end
def descendant_ids def descendant_ids
descendants_without_self.pluck(:id) descendant_statuses.pluck(:id)
end
def descendants_without_self
descendant_statuses - [self]
end end
def descendant_statuses def descendant_statuses
@ -56,7 +48,7 @@ module StatusThreadingConcern
AS ( AS (
SELECT id, ARRAY[id] SELECT id, ARRAY[id]
FROM statuses FROM statuses
WHERE id = :id WHERE in_reply_to_id = :id
UNION ALL UNION ALL
SELECT statuses.id, path || statuses.id SELECT statuses.id, path || statuses.id
FROM search_tree FROM search_tree