diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/account.rb | 53 | ||||
-rw-r--r-- | app/models/list_account.rb | 2 |
2 files changed, 40 insertions, 15 deletions
diff --git a/app/models/account.rb b/app/models/account.rb index b6d46b2cc..77b78ffef 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -277,23 +277,46 @@ class Account < ApplicationRecord find_by_sql([sql, limit]) end - def advanced_search_for(terms, account, limit = 10) + def advanced_search_for(terms, account, limit = 10, following = false) textsearch, query = generate_query_for_search(terms) - sql = <<-SQL.squish - SELECT - accounts.*, - (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank - FROM accounts - LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) - WHERE #{query} @@ #{textsearch} - AND accounts.suspended = false - GROUP BY accounts.id - ORDER BY rank DESC - LIMIT ? - SQL - - find_by_sql([sql, account.id, account.id, limit]) + if following + sql = <<-SQL.squish + WITH first_degree AS ( + SELECT target_account_id + FROM follows + WHERE account_id = ? + ) + SELECT + accounts.*, + (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + FROM accounts + LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) + WHERE accounts.id IN (SELECT * FROM first_degree) + AND #{query} @@ #{textsearch} + AND accounts.suspended = false + GROUP BY accounts.id + ORDER BY rank DESC + LIMIT ? + SQL + + find_by_sql([sql, account.id, account.id, account.id, limit]) + else + sql = <<-SQL.squish + SELECT + accounts.*, + (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + FROM accounts + LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) + WHERE #{query} @@ #{textsearch} + AND accounts.suspended = false + GROUP BY accounts.id + ORDER BY rank DESC + LIMIT ? + SQL + + find_by_sql([sql, account.id, account.id, limit]) + end end private diff --git a/app/models/list_account.rb b/app/models/list_account.rb index c08239aa0..253932590 100644 --- a/app/models/list_account.rb +++ b/app/models/list_account.rb @@ -14,6 +14,8 @@ class ListAccount < ApplicationRecord belongs_to :account, required: true belongs_to :follow, required: true + validates :account_id, uniqueness: { scope: :list_id } + before_validation :set_follow private |