diff --git a/app/lib/annual_report/archetype.rb b/app/lib/annual_report/archetype.rb index c02b28dfda..ff7e14e2a0 100644 --- a/app/lib/annual_report/archetype.rb +++ b/app/lib/annual_report/archetype.rb @@ -32,7 +32,7 @@ class AnnualReport::Archetype < AnnualReport::Source end def reblogs_count - @reblogs_count ||= report_statuses.where.not(reblog_of_id: nil).count + @reblogs_count ||= report_statuses.only_reblogs.count end def replies_count diff --git a/app/lib/annual_report/most_reblogged_accounts.rb b/app/lib/annual_report/most_reblogged_accounts.rb index a23734fce3..df4dedb734 100644 --- a/app/lib/annual_report/most_reblogged_accounts.rb +++ b/app/lib/annual_report/most_reblogged_accounts.rb @@ -18,7 +18,7 @@ class AnnualReport::MostRebloggedAccounts < AnnualReport::Source private def most_reblogged_accounts - report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group(accounts: [:id]).having(minimum_reblog_count).order(count_all: :desc).limit(SET_SIZE).count + report_statuses.only_reblogs.joins(reblog: :account).group(accounts: [:id]).having(minimum_reblog_count).order(count_all: :desc).limit(SET_SIZE).count end def minimum_reblog_count diff --git a/app/lib/annual_report/type_distribution.rb b/app/lib/annual_report/type_distribution.rb index fe38d8a8a2..bdafe34c13 100644 --- a/app/lib/annual_report/type_distribution.rb +++ b/app/lib/annual_report/type_distribution.rb @@ -5,7 +5,7 @@ class AnnualReport::TypeDistribution < AnnualReport::Source { type_distribution: { total: report_statuses.count, - reblogs: report_statuses.where.not(reblog_of_id: nil).count, + reblogs: report_statuses.only_reblogs.count, replies: report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count, standalone: report_statuses.without_replies.without_reblogs.count, }, diff --git a/app/models/status.rb b/app/models/status.rb index 8287583bc3..4aac3b62d7 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -120,6 +120,7 @@ class Status < ApplicationRecord scope :with_accounts, ->(ids) { where(id: ids).includes(:account) } scope :without_replies, -> { not_reply.or(reply_to_account) } scope :not_reply, -> { where(reply: false) } + scope :only_reblogs, -> { where.not(reblog_of_id: nil) } scope :reply_to_account, -> { where(arel_table[:in_reply_to_account_id].eq arel_table[:account_id]) } scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) } scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) } diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 8a87d35366..e6c49f1013 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -352,6 +352,17 @@ RSpec.describe Status do end end + describe '.only_reblogs' do + let!(:status) { Fabricate :status } + let!(:reblog) { Fabricate :status, reblog: Fabricate(:status) } + + it 'returns the expected statuses' do + expect(described_class.only_reblogs) + .to include(reblog) + .and not_include(status) + end + end + describe '.tagged_with' do let(:tag_cats) { Fabricate(:tag, name: 'cats') } let(:tag_dogs) { Fabricate(:tag, name: 'dogs') }