summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2022-02-08 01:53:49 +0100
committerGitHub <noreply@github.com>2022-02-08 01:53:49 +0100
commit35850f8195b633c60215461ebde48d2e8725fbd2 (patch)
tree2ba5c513c0494443b3357d4293cdb35e48675a74 /app
parent52c1b86964caddb99e01ff36e928a524bf66ec0e (diff)
Fix localization of cold-start follow recommendations (#17479)
Diffstat (limited to 'app')
-rw-r--r--app/models/account_suggestions/global_source.rb2
-rw-r--r--app/views/admin/follow_recommendations/show.html.haml2
-rw-r--r--app/workers/scheduler/follow_recommendations_scheduler.rb29
3 files changed, 19 insertions, 14 deletions
diff --git a/app/models/account_suggestions/global_source.rb b/app/models/account_suggestions/global_source.rb
index ac764de50f5..03ed1b6c2ae 100644
--- a/app/models/account_suggestions/global_source.rb
+++ b/app/models/account_suggestions/global_source.rb
@@ -6,7 +6,7 @@ class AccountSuggestions::GlobalSource < AccountSuggestions::Source
end
def get(account, skip_account_ids: [], limit: 40)
- account_ids = account_ids_for_locale(account.user_locale) - [account.id] - skip_account_ids
+ account_ids = account_ids_for_locale(I18n.locale.to_str.split(/[_-]/).first) - [account.id] - skip_account_ids
as_ordered_suggestions(
scope(account).where(id: account_ids),
diff --git a/app/views/admin/follow_recommendations/show.html.haml b/app/views/admin/follow_recommendations/show.html.haml
index 5b949a16504..48c1ad1f284 100644
--- a/app/views/admin/follow_recommendations/show.html.haml
+++ b/app/views/admin/follow_recommendations/show.html.haml
@@ -13,7 +13,7 @@
.filter-subset.filter-subset--with-select
%strong= t('admin.follow_recommendations.language')
.input.select.optional
- = select_tag :language, options_for_select(I18n.available_locales.map { |key| [human_locale(key), key]}, @language)
+ = select_tag :language, options_for_select(I18n.available_locales.map { |key| key.to_s.split(/[_-]/).first.to_sym }.uniq.map { |key| [human_locale(key), key]}, @language)
.filter-subset
%strong= t('admin.follow_recommendations.status')
diff --git a/app/workers/scheduler/follow_recommendations_scheduler.rb b/app/workers/scheduler/follow_recommendations_scheduler.rb
index effc63e5981..084619cbd93 100644
--- a/app/workers/scheduler/follow_recommendations_scheduler.rb
+++ b/app/workers/scheduler/follow_recommendations_scheduler.rb
@@ -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