mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 03:59:50 +08:00
FIX: ensure consistency on topic featured users
This commit is contained in:
parent
f7d4cb6745
commit
5193c9fd16
|
@ -8,6 +8,7 @@ module Jobs
|
|||
Group.refresh_automatic_groups!
|
||||
Notification.ensure_consistency!
|
||||
UserAction.ensure_consistency!
|
||||
TopicFeaturedUsers.ensure_consistency!
|
||||
UserStat.update_view_counts(13.hours.ago)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,6 +24,50 @@ class TopicFeaturedUsers
|
|||
topic.featured_user4_id].uniq.compact
|
||||
end
|
||||
|
||||
def self.ensure_consistency!
|
||||
|
||||
sql = <<SQL
|
||||
|
||||
WITH cte as (
|
||||
SELECT
|
||||
t.id, p.user_id,
|
||||
ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY COUNT(*) DESC) as rank
|
||||
FROM topics t
|
||||
JOIN posts p ON p.topic_id = t.id
|
||||
WHERE p.deleted_at IS NULL AND NOT p.hidden AND p.user_id <> t.user_id AND
|
||||
p.user_id <> t.last_post_user_id
|
||||
GROUP BY t.id, p.user_id
|
||||
)
|
||||
|
||||
UPDATE topics tt
|
||||
SET
|
||||
featured_user1_id = featured_user1,
|
||||
featured_user2_id = featured_user2,
|
||||
featured_user3_id = featured_user3,
|
||||
featured_user4_id = featured_user4
|
||||
FROM (
|
||||
SELECT
|
||||
c.id,
|
||||
MAX(case when c.rank = 1 then c.user_id end) featured_user1,
|
||||
MAX(case when c.rank = 2 then c.user_id end) featured_user2,
|
||||
MAX(case when c.rank = 3 then c.user_id end) featured_user3,
|
||||
MAX(case when c.rank = 4 then c.user_id end) featured_user4
|
||||
FROM cte as c
|
||||
WHERE c.rank <= 4
|
||||
GROUP BY c.id
|
||||
) x
|
||||
WHERE x.id = tt.id AND
|
||||
(
|
||||
COALESCE(featured_user1_id,-99) <> COALESCE(featured_user1,-99) OR
|
||||
COALESCE(featured_user2_id,-99) <> COALESCE(featured_user2,-99) OR
|
||||
COALESCE(featured_user3_id,-99) <> COALESCE(featured_user3,-99) OR
|
||||
COALESCE(featured_user4_id,-99) <> COALESCE(featured_user4,-99)
|
||||
)
|
||||
SQL
|
||||
|
||||
Topic.exec_sql(sql)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def keys(args)
|
||||
|
|
31
spec/models/topic_featured_users_spec.rb
Normal file
31
spec/models/topic_featured_users_spec.rb
Normal file
|
@ -0,0 +1,31 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe TopicFeaturedUsers do
|
||||
it 'ensures consistenct' do
|
||||
|
||||
t = Fabricate(:topic)
|
||||
Fabricate(:post, topic_id: t.id, user_id: t.user_id)
|
||||
p2 = Fabricate(:post, topic_id: t.id)
|
||||
Fabricate(:post, topic_id: t.id, user_id: p2.user_id)
|
||||
p4 = Fabricate(:post, topic_id: t.id)
|
||||
p5 = Fabricate(:post, topic_id: t.id)
|
||||
|
||||
t.update_columns(featured_user1_id: 66,
|
||||
featured_user2_id: 70,
|
||||
featured_user3_id: 12,
|
||||
featured_user4_id: 7,
|
||||
last_post_user_id: p5.user_id
|
||||
)
|
||||
|
||||
TopicFeaturedUsers.ensure_consistency!
|
||||
|
||||
t.reload
|
||||
|
||||
t.featured_user1_id.should == p2.user_id
|
||||
t.featured_user2_id.should == p4.user_id
|
||||
t.featured_user3_id.should == nil
|
||||
t.featured_user4_id.should == nil
|
||||
|
||||
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user