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:
parent
d9b62e34da
commit
519119f657
7 changed files with 70 additions and 21 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue