0
0
Fork 0

Paginate ancestor statuses in public page (#7102)

This also limits the statuses returned by API, but pagination is not
implemented in Web API yet. I still expect it brings user experience
better than making a user wait to fetch all ancestor statuses and flooding
the column with them.
This commit is contained in:
Akihiko Odaki 2018-04-11 19:35:09 +09:00 committed by Eugen Rochko
parent d9b62e34da
commit 519119f657
7 changed files with 70 additions and 21 deletions

View file

@ -3,8 +3,8 @@
module StatusThreadingConcern
extend ActiveSupport::Concern
def ancestors(account = nil)
find_statuses_from_tree_path(ancestor_ids, account)
def ancestors(limit, account = nil)
find_statuses_from_tree_path(ancestor_ids(limit), account)
end
def descendants(account = nil)
@ -13,14 +13,21 @@ module StatusThreadingConcern
private
def ancestor_ids
Rails.cache.fetch("ancestors:#{id}") do
ancestor_statuses.pluck(:id)
def ancestor_ids(limit)
key = "ancestors:#{id}"
ancestors = Rails.cache.fetch(key)
if ancestors.nil? || ancestors[:limit] < limit
ids = ancestor_statuses(limit).pluck(:id).reverse!
Rails.cache.write key, limit: limit, ids: ids
ids
else
ancestors[:ids].last(limit)
end
end
def ancestor_statuses
Status.find_by_sql([<<-SQL.squish, id: in_reply_to_id])
def ancestor_statuses(limit)
Status.find_by_sql([<<-SQL.squish, id: in_reply_to_id, limit: limit])
WITH RECURSIVE search_tree(id, in_reply_to_id, path)
AS (
SELECT id, in_reply_to_id, ARRAY[id]
@ -34,7 +41,8 @@ module StatusThreadingConcern
)
SELECT id
FROM search_tree
ORDER BY path DESC
ORDER BY path
LIMIT :limit
SQL
end