Change follow recommendation materialized view to be faster in most cases (#26545)
Co-authored-by: Renaud Chaput <renchap@gmail.com>local
parent
e7bea8f004
commit
ee702e36e5
5 changed files with 65 additions and 10 deletions
@ -0,0 +1,8 @@ |
|||||||
|
# frozen_string_literal: true |
||||||
|
|
||||||
|
class CreateGlobalFollowRecommendations < ActiveRecord::Migration[7.0] |
||||||
|
def change |
||||||
|
create_view :global_follow_recommendations, materialized: { no_data: true } |
||||||
|
safety_assured { add_index :global_follow_recommendations, :account_id, unique: true } |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,12 @@ |
|||||||
|
# frozen_string_literal: true |
||||||
|
|
||||||
|
class DropFollowRecommendations < ActiveRecord::Migration[7.0] |
||||||
|
def up |
||||||
|
drop_view :follow_recommendations, materialized: true |
||||||
|
end |
||||||
|
|
||||||
|
def down |
||||||
|
create_view :follow_recommendations, version: 2, materialized: { no_data: true } |
||||||
|
safety_assured { add_index :follow_recommendations, :account_id, unique: true } |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,32 @@ |
|||||||
|
SELECT |
||||||
|
account_id, |
||||||
|
sum(rank) AS rank, |
||||||
|
array_agg(reason) AS reason |
||||||
|
FROM ( |
||||||
|
SELECT |
||||||
|
account_summaries.account_id AS account_id, |
||||||
|
count(follows.id) / (1.0 + count(follows.id)) AS rank, |
||||||
|
'most_followed' AS reason |
||||||
|
FROM follows |
||||||
|
INNER JOIN account_summaries ON account_summaries.account_id = follows.target_account_id |
||||||
|
INNER JOIN users ON users.account_id = follows.account_id |
||||||
|
WHERE users.current_sign_in_at >= (now() - interval '30 days') |
||||||
|
AND account_summaries.sensitive = 'f' |
||||||
|
AND NOT EXISTS (SELECT 1 FROM follow_recommendation_suppressions WHERE follow_recommendation_suppressions.account_id = follows.target_account_id) |
||||||
|
GROUP BY account_summaries.account_id |
||||||
|
HAVING count(follows.id) >= 5 |
||||||
|
UNION ALL |
||||||
|
SELECT account_summaries.account_id AS account_id, |
||||||
|
sum(status_stats.reblogs_count + status_stats.favourites_count) / (1.0 + sum(status_stats.reblogs_count + status_stats.favourites_count)) AS rank, |
||||||
|
'most_interactions' AS reason |
||||||
|
FROM status_stats |
||||||
|
INNER JOIN statuses ON statuses.id = status_stats.status_id |
||||||
|
INNER JOIN account_summaries ON account_summaries.account_id = statuses.account_id |
||||||
|
WHERE statuses.id >= ((date_part('epoch', now() - interval '30 days') * 1000)::bigint << 16) |
||||||
|
AND account_summaries.sensitive = 'f' |
||||||
|
AND NOT EXISTS (SELECT 1 FROM follow_recommendation_suppressions WHERE follow_recommendation_suppressions.account_id = statuses.account_id) |
||||||
|
GROUP BY account_summaries.account_id |
||||||
|
HAVING sum(status_stats.reblogs_count + status_stats.favourites_count) >= 5 |
||||||
|
) t0 |
||||||
|
GROUP BY account_id |
||||||
|
ORDER BY rank DESC |
Loading…
Reference in new issue