Skip to content

Commit a300206

Browse files
Gargronhiyuki2578
authored andcommitted
Fix trending tags returning less items than requested sometimes (mastodon#11513)
Add better sorting defaults to the hashtags admin UI Add "not reviewed" filter to hashtags admin UI
1 parent f5bf764 commit a300206

5 files changed

Lines changed: 13 additions & 8 deletions

File tree

app/controllers/admin/tags_controller.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ def set_tag
3636
def filtered_tags
3737
scope = Tag
3838
scope = scope.discoverable if filter_params[:context] == 'directory'
39-
scope = scope.reviewed if filter_params[:review] == 'reviewed'
40-
scope = scope.pending_review if filter_params[:review] == 'pending_review'
41-
scope.reorder(score: :desc)
39+
scope = scope.unreviewed if filter_params[:review] == 'unreviewed'
40+
scope = scope.reviewed.order(reviewed_at: :desc) if filter_params[:review] == 'reviewed'
41+
scope = scope.pending_review.order(requested_review_at: :desc) if filter_params[:review] == 'pending_review'
42+
scope.order(score: :desc)
4243
end
4344

4445
def filter_params

app/models/tag.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class Tag < ApplicationRecord
3030
validate :validate_name_change, if: -> { !new_record? && name_changed? }
3131

3232
scope :reviewed, -> { where.not(reviewed_at: nil) }
33-
scope :pending_review, -> { where(reviewed_at: nil).where.not(requested_review_at: nil) }
33+
scope :unreviewed, -> { where(reviewed_at: nil) }
34+
scope :pending_review, -> { unreviewed.where.not(requested_review_at: nil) }
3435
scope :usable, -> { where(usable: [true, nil]) }
3536
scope :discoverable, -> { where(listable: [true, nil]).joins(:account_tag_stat).where(AccountTagStat.arel_table[:accounts_count].gt(0)).order(Arel.sql('account_tag_stats.accounts_count desc')) }
3637
scope :most_used, ->(account) { joins(:statuses).where(statuses: { account: account }).group(:id).order(Arel.sql('count(*) desc')) }

app/models/trending_tags.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ class TrendingTags
55
EXPIRE_HISTORY_AFTER = 7.days.seconds
66
EXPIRE_TRENDS_AFTER = 1.day.seconds
77
THRESHOLD = 5
8+
LIMIT = 10
89

910
class << self
1011
include Redisable
@@ -18,18 +19,18 @@ def record_use!(tag, account, at_time = Time.now.utc)
1819
end
1920

2021
def get(limit, filtered: true)
21-
tag_ids = redis.zrevrange("#{KEY}:#{Time.now.utc.beginning_of_day.to_i}", 0, limit - 1).map(&:to_i)
22+
tag_ids = redis.zrevrange("#{KEY}:#{Time.now.utc.beginning_of_day.to_i}", 0, LIMIT - 1).map(&:to_i)
2223

2324
tags = Tag.where(id: tag_ids)
2425
tags = tags.where(trendable: true) if filtered
2526
tags = tags.each_with_object({}) { |tag, h| h[tag.id] = tag }
2627

27-
tag_ids.map { |tag_id| tags[tag_id] }.compact
28+
tag_ids.map { |tag_id| tags[tag_id] }.compact.take(limit)
2829
end
2930

3031
def trending?(tag)
3132
rank = redis.zrevrank("#{KEY}:#{Time.now.utc.beginning_of_day.to_i}", tag.id)
32-
rank.present? && rank <= 10
33+
rank.present? && rank <= LIMIT
3334
end
3435

3536
private
@@ -59,7 +60,7 @@ def increment_vote!(tag, at_time)
5960
old_rank = redis.zrevrank(key, tag.id)
6061

6162
redis.zadd(key, score, tag.id)
62-
request_review!(tag) if (old_rank.nil? || old_rank > 10) && redis.zrevrank(key, tag.id) <= 10 && !tag.trendable? && tag.requires_review? && !tag.requested_review?
63+
request_review!(tag) if (old_rank.nil? || old_rank > LIMIT) && redis.zrevrank(key, tag.id) <= LIMIT && !tag.trendable? && tag.requires_review? && !tag.requested_review?
6364
end
6465

6566
redis.expire(key, EXPIRE_TRENDS_AFTER)

app/views/admin/tags/index.html.haml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
%strong= t('admin.tags.review')
1313
%ul
1414
%li= filter_link_to t('generic.all'), review: nil
15+
%li= filter_link_to t('admin.tags.unreviewed'), review: 'unreviewed'
1516
%li= filter_link_to t('admin.tags.reviewed'), review: 'reviewed'
1617
%li= filter_link_to safe_join([t('admin.accounts.moderation.pending'), "(#{Tag.pending_review.count})"], ' '), review: 'pending_review'
1718

config/locales/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ en:
499499
title: Hashtags
500500
trending_right_now: Trending right now
501501
unique_uses_today: "%{count} posting today"
502+
unreviewed: Not reviewed
502503
updated_msg: Hashtag settings updated successfully
503504
title: Administration
504505
warning_presets:

0 commit comments

Comments
 (0)