Merge branch 'main' into glitch-soc/merge-upstream
Conflicts: - `README.md`: Upstream updated copyright year, we don't mention it so kept our version. - `app/controllers/admin/dashboard_controller.rb`: Not really a conflict, upstream change (removing the spam checker) too close to glitch-soc changes. Ported upstream changes. - `app/models/form/admin_settings.rb`: Same. - `app/services/remove_status_service.rb`: Same. - `app/views/admin/settings/edit.html.haml`: Same. - `config/settings.yml`: Same. - `config/environments/production.rb`: Not a real conflict, upstream added a default HTTP header, but we have extra headers in glitch-soc. Added the header.
This commit is contained in:
61
app/workers/scheduler/follow_recommendations_scheduler.rb
Normal file
61
app/workers/scheduler/follow_recommendations_scheduler.rb
Normal file
@@ -0,0 +1,61 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Scheduler::FollowRecommendationsScheduler
|
||||
include Sidekiq::Worker
|
||||
include Redisable
|
||||
|
||||
sidekiq_options retry: 0
|
||||
|
||||
# The maximum number of accounts that can be requested in one page from the
|
||||
# API is 80, and the suggestions API does not allow pagination. This number
|
||||
# leaves some room for accounts being filtered during live access
|
||||
SET_SIZE = 100
|
||||
|
||||
def perform
|
||||
# Maintaining a materialized view speeds-up subsequent queries significantly
|
||||
AccountSummary.refresh
|
||||
|
||||
fallback_recommendations = FollowRecommendation.safe.filtered.limit(SET_SIZE).index_by(&:account_id)
|
||||
|
||||
I18n.available_locales.each do |locale|
|
||||
recommendations = begin
|
||||
if AccountSummary.safe.filtered.localized(locale).exists? # We can skip the work if no accounts with that language exist
|
||||
FollowRecommendation.safe.filtered.localized(locale).limit(SET_SIZE).index_by(&:account_id)
|
||||
else
|
||||
{}
|
||||
end
|
||||
end
|
||||
|
||||
# Use language-agnostic results if there are not enough language-specific ones
|
||||
missing = SET_SIZE - recommendations.keys.size
|
||||
|
||||
if missing.positive?
|
||||
added = 0
|
||||
|
||||
# Avoid duplicate results
|
||||
fallback_recommendations.each_value do |recommendation|
|
||||
next if recommendations.key?(recommendation.account_id)
|
||||
|
||||
recommendations[recommendation.account_id] = recommendation
|
||||
added += 1
|
||||
|
||||
break if added >= missing
|
||||
end
|
||||
end
|
||||
|
||||
redis.pipelined do
|
||||
redis.del(key(locale))
|
||||
|
||||
recommendations.each_value do |recommendation|
|
||||
redis.zadd(key(locale), recommendation.rank, recommendation.account_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def key(locale)
|
||||
"follow_recommendations:#{locale}"
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user