From 5c808ee0decac075b105e1f3a36933ce38d76255 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 19 Apr 2022 14:54:43 +0200 Subject: Revert support from loading Home timeline from database Unfortunately, the database query could turn out very inefficient and I did not manage to find a way to improve that. Furthermore, there were still behavior inconsistencies between fetching the timeline from Redis and fetching it from Postgres. --- app/models/home_feed.rb | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) (limited to 'app/models/home_feed.rb') diff --git a/app/models/home_feed.rb b/app/models/home_feed.rb index 53550b7db..d6ebb5fa6 100644 --- a/app/models/home_feed.rb +++ b/app/models/home_feed.rb @@ -9,52 +9,4 @@ class HomeFeed < Feed def regenerating? redis.exists?("account:#{@account.id}:regeneration") end - - def get(limit, max_id = nil, since_id = nil, min_id = nil) - limit = limit.to_i - max_id = max_id.to_i if max_id.present? - since_id = since_id.to_i if since_id.present? - min_id = min_id.to_i if min_id.present? - - if min_id.present? - redis_min_id = fetch_min_redis_id - return from_redis(limit, max_id, since_id, min_id) if redis_min_id && min_id >= redis_min_id - - statuses = from_database(limit, redis_min_id, since_id, min_id) - return statuses if statuses.size >= limit - - remaining_limit = limit - statuses.size - min_id = statuses.first.id unless statuses.empty? - from_redis(remaining_limit, max_id, since_id, min_id) + statuses - else - statuses = from_redis(limit, max_id, since_id, min_id) - return statuses if statuses.size >= limit - - if since_id.present? - redis_min_id = fetch_min_redis_id - return statuses if redis_min_id.present? && since_id >= redis_min_id - end - - remaining_limit = limit - statuses.size - max_id = statuses.last.id unless statuses.empty? - statuses + from_database(remaining_limit, max_id, since_id, min_id) - end - end - - protected - - def from_database(limit, max_id, since_id, min_id) - scope = Status.where(account: @account).or(Status.where(account: @account.following)) - scope = scope.where(visibility: %i(public unlisted private)) - scope - .to_a_paginated_by_id(limit, min_id: min_id, max_id: max_id, since_id: since_id) - .reject { |status| FeedManager.instance.filter?(:home, status, @account) } - .sort_by { |status| -status.id } - end - - private - - def fetch_min_redis_id - redis.zrangebyscore(key, '(0', '(+inf', limit: [0, 1], with_scores: true).first&.first&.to_i - end end -- cgit