|
|
|
@ -193,6 +193,25 @@ class Account < ApplicationRecord |
|
|
|
|
nil |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def triadic_closures(account, limit = 5) |
|
|
|
|
sql = <<SQL |
|
|
|
|
WITH first_degree AS ( |
|
|
|
|
SELECT target_account_id |
|
|
|
|
FROM follows |
|
|
|
|
WHERE account_id = ? |
|
|
|
|
) |
|
|
|
|
SELECT accounts.* |
|
|
|
|
FROM follows |
|
|
|
|
INNER JOIN accounts ON follows.target_account_id = accounts.id |
|
|
|
|
WHERE account_id IN (SELECT * FROM first_degree) AND target_account_id NOT IN (SELECT * FROM first_degree) AND target_account_id <> ? |
|
|
|
|
GROUP BY target_account_id, accounts.id |
|
|
|
|
ORDER BY count(account_id) DESC |
|
|
|
|
LIMIT ? |
|
|
|
|
SQL |
|
|
|
|
|
|
|
|
|
Account.find_by_sql([sql, account.id, account.id, limit]) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def following_map(target_account_ids, account_id) |
|
|
|
|
follow_mapping(Follow.where(target_account_id: target_account_ids, account_id: account_id), :target_account_id) |
|
|
|
|
end |
|
|
|
|