require 'sequel' def search(params) db = Sequel.connect(adapter: :postgres, database: ENV['DB_DATABASE']) query = params[:q].strip offset = (params[:page] - 1) * 10 username = params[:username].strip case params[:type] when 'threads' sort = case params[:sort] when 'thread' 'threads.created_at DESC' when 'post' 'posts.created_at DESC' else 'threads.created_at DESC' end search_threads(db, query, username, sort, offset) when 'posts' search_posts(db, query, username, offset) else Array.new end end def search_threads(db, query, username, sort, offset) db[<<-SQL, query, username, username, String.new, offset] SELECT threads.* FROM threads WHERE to_tsvector(title) @@ plainto_tsquery(?) AND (LOWER(threads.creator) = LOWER(?) OR ? = '') ORDER BY #{sort} LIMIT 10 OFFSET ?; SQL end def search_posts(db, query, username, offset) db[<<-SQL, query, username, username, offset] SELECT posts.*, threads.title as thread_title, threads.remote_id as remote_thread_id FROM posts INNER JOIN threads on posts.thread_id = threads.id WHERE to_tsvector(body) @@ plainto_tsquery(?) AND ( (LOWER(posts.creator) = LOWER(?)) OR (? = '') ) ORDER BY created_at DESC LIMIT 10 OFFSET ?; SQL end