forked from asonix/mastodon
In from_redis method, statuses retrieved from the database was mapped to the IDs retrieved from Redis. It was equivalent to order from high to low because those IDs are sorted in the same order. Statuses are ordered with the ID by default, so we do not have to reorder. Sorting statuses in the database is even faster since the IDs are indexed with B-tree.
39 lines
1,004 B
Ruby
39 lines
1,004 B
Ruby
# frozen_string_literal: true
|
|
|
|
class Feed
|
|
def initialize(type, account)
|
|
@type = type
|
|
@account = account
|
|
end
|
|
|
|
def get(limit, max_id = nil, since_id = nil)
|
|
if redis.exists("account:#{@account.id}:regeneration")
|
|
from_database(limit, max_id, since_id)
|
|
else
|
|
from_redis(limit, max_id, since_id)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def from_redis(limit, max_id, since_id)
|
|
max_id = '+inf' if max_id.blank?
|
|
since_id = '-inf' if since_id.blank?
|
|
unhydrated = redis.zrevrangebyscore(key, "(#{max_id}", "(#{since_id}", limit: [0, limit], with_scores: true).map(&:last).map(&:to_i)
|
|
Status.where(id: unhydrated).cache_ids
|
|
end
|
|
|
|
def from_database(limit, max_id, since_id)
|
|
Status.as_home_timeline(@account)
|
|
.paginate_by_max_id(limit, max_id, since_id)
|
|
.reject { |status| FeedManager.instance.filter?(:home, status, @account.id) }
|
|
end
|
|
|
|
def key
|
|
FeedManager.instance.key(@type, @account.id)
|
|
end
|
|
|
|
def redis
|
|
Redis.current
|
|
end
|
|
end
|