Extract constants for annual report calculations

pull/32982/head
Matt Jankowski 2024-11-19 11:51:45 -05:00
parent 37f00fb018
commit 0bea4c9be6
4 changed files with 12 additions and 6 deletions

View File

@ -5,6 +5,9 @@ class AnnualReport::Archetype < AnnualReport::Source
# each active user in a single year (2023) # each active user in a single year (2023)
AVERAGE_PER_YEAR = 113 AVERAGE_PER_YEAR = 113
SCORE_MULTIPLIER = 2
SCORE_REDUCER = 0.1
def generate def generate
{ {
archetype: archetype, archetype: archetype,
@ -16,11 +19,11 @@ class AnnualReport::Archetype < AnnualReport::Source
def archetype def archetype
if (standalone_count + replies_count + reblogs_count) < AVERAGE_PER_YEAR if (standalone_count + replies_count + reblogs_count) < AVERAGE_PER_YEAR
:lurker :lurker
elsif reblogs_count > (standalone_count * 2) elsif reblogs_count > (standalone_count * SCORE_MULTIPLIER)
:booster :booster
elsif polls_count > (standalone_count * 0.1) # standalone_count includes posts with polls elsif polls_count > (standalone_count * SCORE_REDUCER) # standalone_count includes posts with polls
:pollster :pollster
elsif replies_count > (standalone_count * 2) elsif replies_count > (standalone_count * SCORE_MULTIPLIER)
:replier :replier
else else
:oracle :oracle

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
MINIMUM_INTERACTIONS = 1
SET_SIZE = 40 SET_SIZE = 40
def generate def generate
@ -17,6 +18,6 @@ class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
private private
def commonly_interacted_with_accounts def commonly_interacted_with_accounts
report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having('count(*) > 1').order(count_all: :desc).limit(SET_SIZE).count report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having(Arel.star.count.gt(MINIMUM_INTERACTIONS)).order(count_all: :desc).limit(SET_SIZE).count
end end
end end

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class AnnualReport::MostRebloggedAccounts < AnnualReport::Source class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
MINIMUM_COUNT = 1
SET_SIZE = 10 SET_SIZE = 10
def generate def generate
@ -17,6 +18,6 @@ class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
private private
def most_reblogged_accounts def most_reblogged_accounts
report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group(accounts: [:id]).having('count(*) > 1').order(count_all: :desc).limit(SET_SIZE).count report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group(accounts: [:id]).having(Arel.star.count.gt(MINIMUM_COUNT)).order(count_all: :desc).limit(SET_SIZE).count
end end
end end

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class AnnualReport::TopHashtags < AnnualReport::Source class AnnualReport::TopHashtags < AnnualReport::Source
MINIMUM_COUNT = 1
SET_SIZE = 40 SET_SIZE = 40
def generate def generate
@ -17,7 +18,7 @@ class AnnualReport::TopHashtags < AnnualReport::Source
private private
def top_hashtags def top_hashtags
Tag.joins(:statuses).where(statuses: { id: report_statuses.select(:id) }).group(coalesced_tag_names).having('count(*) > 1').order(count_all: :desc).limit(SET_SIZE).count Tag.joins(:statuses).where(statuses: { id: report_statuses.select(:id) }).group(coalesced_tag_names).having(Arel.star.count.gt(MINIMUM_COUNT)).order(count_all: :desc).limit(SET_SIZE).count
end end
def coalesced_tag_names def coalesced_tag_names