Add method for retrieving triadic closures

This commit is contained in:
Eugen Rochko 2017-03-16 20:10:51 +01:00
parent a2696cf542
commit 017350e0ea
1 changed files with 19 additions and 0 deletions

View File

@ -193,6 +193,25 @@ class Account < ApplicationRecord
nil nil
end 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) 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) follow_mapping(Follow.where(target_account_id: target_account_ids, account_id: account_id), :target_account_id)
end end