diff options
author | David Yip <yipdw@member.fsf.org> | 2018-04-12 03:30:57 -0500 |
---|---|---|
committer | David Yip <yipdw@member.fsf.org> | 2018-04-12 03:30:57 -0500 |
commit | a817f084eafaf5527445c29ab1d68f42b1a2872f (patch) | |
tree | f146e6c8ff958d60804e33e40e1970784f5b7b90 /app/models/concerns | |
parent | eb72c3398cd70c6b595fae5a0cb6730a3e49bd61 (diff) | |
parent | 8e88a18316d45a459a31d67487bccc247592d187 (diff) |
Merge remote-tracking branch 'tootsuite/master'
Conflicts: app/controllers/statuses_controller.rb
Diffstat (limited to 'app/models/concerns')
-rw-r--r-- | app/models/concerns/status_threading_concern.rb | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/app/models/concerns/status_threading_concern.rb b/app/models/concerns/status_threading_concern.rb index b539ba10e..fffc095ee 100644 --- a/app/models/concerns/status_threading_concern.rb +++ b/app/models/concerns/status_threading_concern.rb @@ -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 |