From 8413ca93a4ba74b594c54fd6f8783f88eb79653d Mon Sep 17 00:00:00 2001 From: Fosco Marotto Date: Thu, 21 Jan 2021 17:09:46 -0500 Subject: [PATCH] [home feed] Changes to reduce database use. --- app/lib/feed_manager.rb | 34 +++++++++++++++++----------------- app/models/home_feed.rb | 2 ++ app/models/status.rb | 5 ++++- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 3046bb4f..f008314d 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -88,28 +88,28 @@ class FeedManager def filter_from_home?(status, receiver_id) return false if receiver_id == status.account_id - return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) + # return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) return true if phrase_filtered?(status, receiver_id, :home) - check_for_blocks = status.active_mentions.pluck(:account_id) - check_for_blocks.concat([status.account_id]) + # check_for_blocks = status.active_mentions.pluck(:account_id) + # check_for_blocks.concat([status.account_id]) - if status.reblog? - check_for_blocks.concat([status.reblog.account_id]) - check_for_blocks.concat(status.reblog.active_mentions.pluck(:account_id)) - end + # if status.reblog? + # check_for_blocks.concat([status.reblog.account_id]) + # check_for_blocks.concat(status.reblog.active_mentions.pluck(:account_id)) + # end - return true if blocks_or_mutes?(receiver_id, check_for_blocks, :home) + # return true if blocks_or_mutes?(receiver_id, check_for_blocks, :home) - if status.reply? && !status.in_reply_to_account_id.nil? # Filter out if it's a reply - should_filter = !Follow.where(account_id: receiver_id, target_account_id: status.in_reply_to_account_id).exists? # and I'm not following the person it's a reply to - should_filter &&= receiver_id != status.in_reply_to_account_id # and it's not a reply to me - should_filter &&= status.account_id != status.in_reply_to_account_id # and it's not a self-reply - return should_filter - elsif status.reblog? # Filter out a reblog - should_filter ||= Block.where(account_id: status.reblog.account_id, target_account_id: receiver_id).exists? # or if the author of the reblogged status is blocking me - return should_filter - end + # if status.reply? && !status.in_reply_to_account_id.nil? # Filter out if it's a reply + # should_filter = !Follow.where(account_id: receiver_id, target_account_id: status.in_reply_to_account_id).exists? # and I'm not following the person it's a reply to + # should_filter &&= receiver_id != status.in_reply_to_account_id # and it's not a reply to me + # should_filter &&= status.account_id != status.in_reply_to_account_id # and it's not a self-reply + # return should_filter + #elsif status.reblog? # Filter out a reblog + # should_filter ||= Block.where(account_id: status.reblog.account_id, target_account_id: receiver_id).exists? # or if the author of the reblogged status is blocking me + # return should_filter + #end return false if status.group_id diff --git a/app/models/home_feed.rb b/app/models/home_feed.rb index 595e5a52..00e91664 100644 --- a/app/models/home_feed.rb +++ b/app/models/home_feed.rb @@ -20,6 +20,8 @@ class HomeFeed < Feed def from_database(limit, max_id, since_id, min_id) Status.as_home_timeline(@account) .paginate_by_id(limit, max_id: max_id, since_id: since_id, min_id: min_id) + .excluding_blocked_reblogs(@account) + .not_excluded_by_account(@account) .reject { |status| FeedManager.instance.filter?(:home, status, @account.id) } end end diff --git a/app/models/status.rb b/app/models/status.rb index 195e600f..a490c89a 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -101,6 +101,9 @@ class Status < ApplicationRecord scope :tagged_with, ->(tag) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag }) } scope :excluding_silenced_accounts, -> { left_outer_joins(:account).where(accounts: { silenced_at: nil }) } scope :including_silenced_accounts, -> { left_outer_joins(:account).where.not(accounts: { silenced_at: nil }) } + + scope :excluding_blocked_reblogs, ->(account) { left_outer_joins(:reblog).where.not(accounts: account.excluded_from_timeline_account_ids) } + scope :popular_accounts, -> { left_outer_joins(:account).where('accounts.is_verified=true OR accounts.is_pro=true AND accounts.locked=false') } scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) } scope :not_domain_blocked_by_account, ->(account) { account.excluded_from_timeline_domains.blank? ? left_outer_joins(:account) : left_outer_joins(:account).where('accounts.domain IS NULL OR accounts.domain NOT IN (?)', account.excluded_from_timeline_domains) } @@ -290,7 +293,7 @@ class Status < ApplicationRecord end def as_home_timeline(account) - query = where('created_at > ?', 3.days.ago) + query = where('statuses.created_at > ?', 3.days.ago) query.where(account: [account] + account.following).without_replies end