|
|
@ -16,28 +16,33 @@ class Scheduler::FollowRecommendationsScheduler |
|
|
|
AccountSummary.refresh |
|
|
|
FollowRecommendation.refresh |
|
|
|
|
|
|
|
fallback_recommendations = FollowRecommendation.order(rank: :desc).limit(SET_SIZE).index_by(&:account_id) |
|
|
|
fallback_recommendations = FollowRecommendation.order(rank: :desc).limit(SET_SIZE) |
|
|
|
|
|
|
|
I18n.available_locales.each do |locale| |
|
|
|
I18n.available_locales.map { |locale| locale.to_s.split(/[_-]/).first }.uniq.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.localized(locale).order(rank: :desc).limit(SET_SIZE).index_by(&:account_id) |
|
|
|
FollowRecommendation.localized(locale).order(rank: :desc).limit(SET_SIZE).map { |recommendation| [recommendation.account_id, recommendation.rank] } |
|
|
|
else |
|
|
|
{} |
|
|
|
[] |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
# Use language-agnostic results if there are not enough language-specific ones |
|
|
|
missing = SET_SIZE - recommendations.keys.size |
|
|
|
missing = SET_SIZE - recommendations.size |
|
|
|
|
|
|
|
if missing.positive? && fallback_recommendations.size.positive? |
|
|
|
max_fallback_rank = fallback_recommendations.first.rank || 0 |
|
|
|
|
|
|
|
# Language-specific results should be above language-agnostic ones, |
|
|
|
# otherwise language-agnostic ones will always overshadow them |
|
|
|
recommendations.map! { |(account_id, rank)| [account_id, rank + max_fallback_rank] } |
|
|
|
|
|
|
|
if missing.positive? |
|
|
|
added = 0 |
|
|
|
|
|
|
|
# Avoid duplicate results |
|
|
|
fallback_recommendations.each_value do |recommendation| |
|
|
|
next if recommendations.key?(recommendation.account_id) |
|
|
|
fallback_recommendations.each do |recommendation| |
|
|
|
next if recommendations.any? { |(account_id, _)| account_id == recommendation.account_id } |
|
|
|
|
|
|
|
recommendations[recommendation.account_id] = recommendation |
|
|
|
recommendations << [recommendation.account_id, recommendation.rank] |
|
|
|
added += 1 |
|
|
|
|
|
|
|
break if added >= missing |
|
|
@ -47,8 +52,8 @@ class Scheduler::FollowRecommendationsScheduler |
|
|
|
redis.pipelined do |
|
|
|
redis.del(key(locale)) |
|
|
|
|
|
|
|
recommendations.each_value do |recommendation| |
|
|
|
redis.zadd(key(locale), recommendation.rank, recommendation.account_id) |
|
|
|
recommendations.each do |(account_id, rank)| |
|
|
|
redis.zadd(key(locale), rank, account_id) |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|