FIX: stop counting PMs, deleted topics and whispers in directory and user stats
This commit is contained in:
parent
385372e384
commit
7e841a0495
|
@ -67,27 +67,28 @@ class DirectoryItem < ActiveRecord::Base
|
||||||
", period_type: period_types[period_type]
|
", period_type: period_types[period_type]
|
||||||
|
|
||||||
# Calculate new values and update records
|
# Calculate new values and update records
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# TODO
|
||||||
|
# WARNING: post_count is a wrong name, it should be reply_count (excluding topic post)
|
||||||
|
#
|
||||||
exec_sql "WITH x AS (SELECT
|
exec_sql "WITH x AS (SELECT
|
||||||
u.id user_id,
|
u.id user_id,
|
||||||
SUM(CASE WHEN ua.action_type = :was_liked_type THEN 1 ELSE 0 END) likes_received,
|
SUM(CASE WHEN p.id IS NOT NULL AND t.id IS NOT NULL AND ua.action_type = :was_liked_type THEN 1 ELSE 0 END) likes_received,
|
||||||
SUM(CASE WHEN ua.action_type = :like_type THEN 1 ELSE 0 END) likes_given,
|
SUM(CASE WHEN p.id IS NOT NULL AND t.id IS NOT NULL AND ua.action_type = :like_type THEN 1 ELSE 0 END) likes_given,
|
||||||
COALESCE((SELECT COUNT(topic_id) FROM topic_views AS v WHERE v.user_id = u.id AND v.viewed_at >= :since), 0) topics_entered,
|
COALESCE((SELECT COUNT(topic_id) FROM topic_views AS v WHERE v.user_id = u.id AND v.viewed_at >= :since), 0) topics_entered,
|
||||||
COALESCE((SELECT COUNT(id) FROM user_visits AS uv WHERE uv.user_id = u.id AND uv.visited_at >= :since), 0) days_visited,
|
COALESCE((SELECT COUNT(id) FROM user_visits AS uv WHERE uv.user_id = u.id AND uv.visited_at >= :since), 0) days_visited,
|
||||||
COALESCE((SELECT SUM(posts_read) FROM user_visits AS uv2 WHERE uv2.user_id = u.id AND uv2.visited_at >= :since), 0) posts_read,
|
COALESCE((SELECT SUM(posts_read) FROM user_visits AS uv2 WHERE uv2.user_id = u.id AND uv2.visited_at >= :since), 0) posts_read,
|
||||||
SUM(CASE WHEN ua.action_type = :new_topic_type THEN 1 ELSE 0 END) topic_count,
|
SUM(CASE WHEN t2.id IS NOT NULL AND ua.action_type = :new_topic_type THEN 1 ELSE 0 END) topic_count,
|
||||||
SUM(CASE WHEN ua.action_type = :reply_type THEN 1 ELSE 0 END) post_count
|
SUM(CASE WHEN p.id IS NOT NULL AND t.id IS NOT NULL AND ua.action_type = :reply_type THEN 1 ELSE 0 END) post_count
|
||||||
FROM users AS u
|
FROM users AS u
|
||||||
LEFT OUTER JOIN user_actions AS ua ON ua.user_id = u.id AND COALESCE(ua.created_at, :since) >= :since
|
LEFT OUTER JOIN user_actions AS ua ON ua.user_id = u.id AND COALESCE(ua.created_at, :since) >= :since
|
||||||
LEFT OUTER JOIN topics AS t ON ua.target_topic_id = t.id AND t.archetype = 'regular'
|
LEFT OUTER JOIN posts AS p ON ua.target_post_id = p.id AND p.deleted_at IS NULL AND p.post_type = :regular_post_type AND NOT p.hidden
|
||||||
LEFT OUTER JOIN posts AS p ON ua.target_post_id = p.id
|
LEFT OUTER JOIN topics AS t ON p.topic_id = t.id AND t.archetype = 'regular' AND t.deleted_at IS NULL AND t.visible
|
||||||
|
LEFT OUTER JOIN topics AS t2 ON t2.id = ua.target_topic_id AND t2.archetype = 'regular' AND t2.deleted_at IS NULL AND t2.visible
|
||||||
LEFT OUTER JOIN categories AS c ON t.category_id = c.id
|
LEFT OUTER JOIN categories AS c ON t.category_id = c.id
|
||||||
WHERE u.active
|
WHERE u.active
|
||||||
AND u.silenced_till IS NULL
|
AND u.silenced_till IS NULL
|
||||||
AND t.deleted_at IS NULL
|
|
||||||
AND COALESCE(t.visible, true)
|
|
||||||
AND p.deleted_at IS NULL
|
|
||||||
AND (NOT (COALESCE(p.hidden, false)))
|
|
||||||
AND COALESCE(p.post_type, :regular_post_type) = :regular_post_type
|
|
||||||
AND u.id > 0
|
AND u.id > 0
|
||||||
GROUP BY u.id)
|
GROUP BY u.id)
|
||||||
UPDATE directory_items di SET
|
UPDATE directory_items di SET
|
||||||
|
|
|
@ -23,12 +23,36 @@ describe DirectoryItem do
|
||||||
UserActionCreator.enable
|
UserActionCreator.enable
|
||||||
end
|
end
|
||||||
|
|
||||||
it "creates the record for the user" do
|
it "creates the record for the user and handles likes" do
|
||||||
post = create_post
|
post = create_post
|
||||||
|
_post2 = create_post(topic_id: post.topic_id, user: post.user)
|
||||||
|
|
||||||
|
user2 = Fabricate(:user)
|
||||||
|
|
||||||
|
PostAction.act(user2, post, PostActionType.types[:like])
|
||||||
|
|
||||||
DirectoryItem.refresh!
|
DirectoryItem.refresh!
|
||||||
expect(DirectoryItem.where(period_type: DirectoryItem.period_types[:all])
|
|
||||||
.where(user_id: post.user.id)
|
item1 = DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: post.user_id)
|
||||||
.where(topic_count: 1).count).to eq(1)
|
item2 = DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: user2.id)
|
||||||
|
|
||||||
|
expect(item1.topic_count).to eq(1)
|
||||||
|
expect(item1.likes_received).to eq(1)
|
||||||
|
expect(item1.post_count).to eq(1)
|
||||||
|
|
||||||
|
expect(item2.likes_given).to eq(1)
|
||||||
|
|
||||||
|
post.topic.trash!
|
||||||
|
|
||||||
|
DirectoryItem.refresh!
|
||||||
|
|
||||||
|
item1 = DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: post.user_id)
|
||||||
|
item2 = DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: user2.id)
|
||||||
|
|
||||||
|
expect(item1.likes_given).to eq(0)
|
||||||
|
expect(item1.likes_received).to eq(0)
|
||||||
|
expect(item1.post_count).to eq(0)
|
||||||
|
expect(item1.topic_count).to eq(0)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "handles users with no activity" do
|
it "handles users with no activity" do
|
||||||
|
|
Loading…
Reference in New Issue