discourse/app/models/user_search.rb

37 lines
1.0 KiB
Ruby
Raw Normal View History

class UserSearch
2013-02-07 19:50:59 +08:00
def self.search term, topic_id = nil
sql = User.sql_builder(
2013-02-26 00:42:20 +08:00
"select id, username, name, email from users u
/*left_join*/
/*where*/
/*order_by*/")
2013-02-07 18:54:55 +08:00
2013-02-26 00:42:20 +08:00
if topic_id
sql.left_join "(select distinct p.user_id from posts p where topic_id = :topic_id) s on s.user_id = u.id", topic_id: topic_id
end
2013-02-26 00:42:20 +08:00
if term.present?
sql.where("username_lower like :term_like or
to_tsvector('simple', name) @@
to_tsquery('simple',
regexp_replace(
regexp_replace(
cast(plainto_tsquery(:term) as text)
,'\''(?: |$)', ':*''', 'g'),
'''', '', 'g')
)", term: term, term_like: "#{term.downcase}%")
sql.order_by "case when username_lower = :term then 0 else 1 end asc"
end
2013-02-26 00:42:20 +08:00
if topic_id
sql.order_by "case when s.user_id is null then 0 else 1 end desc"
end
sql.order_by "case when last_seen_at is null then 0 else 1 end desc, last_seen_at desc, username asc limit(20)"
2013-02-07 18:54:55 +08:00
sql.exec
end
end