commit: 017350e0ead4715ef4180eb7b1f6fecb67fbf554
parent: a2696cf54284107b3ac846d5ac311f5d471022fd
Author: Eugen Rochko <eugen@zeonfederated.com>
Date: Thu, 16 Mar 2017 20:10:51 +0100
Add method for retrieving triadic closures
Diffstat:
1 file changed, 19 insertions(+), 0 deletions(-)
diff --git a/app/models/account.rb b/app/models/account.rb
@@ -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