From 90d77181039d0c7caa64b6b84a0535e3bdf0ede2 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 16 May 2014 00:31:45 +1000 Subject: [PATCH] add search filter --- app/controllers/list_controller.rb | 3 ++- lib/search.rb | 12 +++++++++++- lib/topic_query.rb | 8 +++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index 91f653fe76e..7e0ac7874c4 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -269,7 +269,8 @@ class ListController < ApplicationController ascending: params[:ascending], min_posts: params[:min_posts], max_posts: params[:max_posts], - status: params[:status] + status: params[:status], + search: params[:search] } options[:no_subcategories] = true if params[:no_subcategories] == 'true' diff --git a/lib/search.rb b/lib/search.rb index 2400918799b..2f54d4c140a 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -232,10 +232,20 @@ class Search posts.limit(limit) end - def query_locale + def self.query_locale @query_locale ||= Post.sanitize(Search.long_locale) end + def query_locale + self.class.query_locale + end + + def self.ts_query(term) + all_terms = term.gsub(/[:()&!'"]/,'').split + query = Post.sanitize(all_terms.map {|t| "#{PG::Connection.escape_string(t)}:*"}.join(" & ")) + "TO_TSQUERY(#{query_locale}, #{query})" + end + def ts_query @ts_query ||= begin all_terms = @term.gsub(/[:()&!'"]/,'').split diff --git a/lib/topic_query.rb b/lib/topic_query.rb index 6ee9362587e..5b607145eca 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -22,7 +22,9 @@ class TopicQuery ascending no_subcategories no_definitions - status).map(&:to_sym) + status + search + ).map(&:to_sym) # Maps `order` to a columns in `topics` SORTABLE_MAPPING = { @@ -259,6 +261,10 @@ class TopicQuery result = result.where('topics.id in (?)', options[:topic_ids]).references(:topics) end + if search = options[:search] + result = result.where("topics.id in (select pp.topic_id from post_search_data pd join posts pp on pp.id = pd.post_id where pd.search_data @@ #{Search.ts_query(search.to_s)})") + end + if status = options[:status] case status when 'open'