Change trending hashtags to not disappear instantly after midnight (#11712)
parent
eab0addad7
commit
436266ca27
@ -0,0 +1,11 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Scheduler::TrendingTagsScheduler
|
||||||
|
include Sidekiq::Worker
|
||||||
|
|
||||||
|
sidekiq_options unique: :until_executed, retry: 0
|
||||||
|
|
||||||
|
def perform
|
||||||
|
TrendingTags.update! if Setting.trends
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
class AddMaxScoreToTags < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :tags, :max_score, :float
|
||||||
|
add_column :tags, :max_score_at, :datetime
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,12 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class RemoveScoreFromTags < ActiveRecord::Migration[5.2]
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
def change
|
||||||
|
safety_assured do
|
||||||
|
remove_column :tags, :score, :int
|
||||||
|
remove_column :tags, :last_trend_at, :datetime
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,68 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe TrendingTags do
|
||||||
|
describe '.record_use!' do
|
||||||
|
pending
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.update!' do
|
||||||
|
let!(:at_time) { Time.now.utc }
|
||||||
|
let!(:tag1) { Fabricate(:tag, name: 'Catstodon') }
|
||||||
|
let!(:tag2) { Fabricate(:tag, name: 'DogsOfMastodon') }
|
||||||
|
let!(:tag3) { Fabricate(:tag, name: 'OCs') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(Redis.current).to receive(:pfcount) do |key|
|
||||||
|
case key
|
||||||
|
when "activity:tags:#{tag1.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts"
|
||||||
|
2
|
||||||
|
when "activity:tags:#{tag1.id}:#{at_time.beginning_of_day.to_i}:accounts"
|
||||||
|
16
|
||||||
|
when "activity:tags:#{tag2.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts"
|
||||||
|
0
|
||||||
|
when "activity:tags:#{tag2.id}:#{at_time.beginning_of_day.to_i}:accounts"
|
||||||
|
4
|
||||||
|
when "activity:tags:#{tag3.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts"
|
||||||
|
13
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Redis.current.zadd('trending_tags', 0.9, tag3.id)
|
||||||
|
Redis.current.sadd("trending_tags:used:#{at_time.beginning_of_day.to_i}", [tag1.id, tag2.id])
|
||||||
|
|
||||||
|
tag3.update(max_score: 0.9, max_score_at: (at_time - 1.day).beginning_of_day + 12.hours)
|
||||||
|
|
||||||
|
described_class.update!(at_time)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates and re-calculates scores' do
|
||||||
|
expect(described_class.get(10, filtered: false)).to eq [tag1, tag3]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'omits hashtags below threshold' do
|
||||||
|
expect(described_class.get(10, filtered: false)).to_not include(tag2)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'decays scores' do
|
||||||
|
expect(Redis.current.zscore('trending_tags', tag3.id)).to be < 0.9
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.trending?' do
|
||||||
|
let(:tag) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
10.times { |i| Redis.current.zadd('trending_tags', i + 1, Fabricate(:tag).id) }
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns true if the hashtag is within limit' do
|
||||||
|
Redis.current.zadd('trending_tags', 11, tag.id)
|
||||||
|
expect(described_class.trending?(tag)).to be true
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false if the hashtag is outside the limit' do
|
||||||
|
Redis.current.zadd('trending_tags', 0, tag.id)
|
||||||
|
expect(described_class.trending?(tag)).to be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue