From b9cc65db61016f88cb63ce639df078f541a3e5a1 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Mon, 15 Oct 2007 16:53:39 +0000 Subject: [PATCH] Search engine: added a checkbox to search titles only (usefull when searching on common words). git-svn-id: http://redmine.rubyforge.org/svn/trunk@842 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/search_controller.rb | 13 +++++++++---- app/views/search/index.rhtml | 6 ++++-- lang/bg.yml | 1 + lang/cs.yml | 1 + lang/de.yml | 1 + lang/en.yml | 1 + lang/es.yml | 1 + lang/fr.yml | 1 + lang/it.yml | 1 + lang/ja.yml | 1 + lang/nl.yml | 1 + lang/pl.yml | 1 + lang/pt-br.yml | 1 + lang/pt.yml | 1 + lang/ro.yml | 1 + lang/sv.yml | 1 + lang/zh.yml | 1 + .../acts_as_searchable/lib/acts_as_searchable.rb | 14 ++++++++------ 18 files changed, 36 insertions(+), 12 deletions(-) diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 292472fba..2c00b3d74 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -25,6 +25,7 @@ class SearchController < ApplicationController @question = params[:q] || "" @question.strip! @all_words = params[:all_words] || (params[:submit] ? false : true) + @titles_only = !params[:titles_only].nil? offset = nil begin; offset = params[:offset].to_time if params[:offset]; rescue; end @@ -58,14 +59,17 @@ class SearchController < ApplicationController # no more than 5 tokens to search for @tokens.slice! 5..-1 if @tokens.size > 5 # strings used in sql like statement - like_tokens = @tokens.collect {|w| "%#{w.downcase}%"} - operator = @all_words ? " AND " : " OR " + like_tokens = @tokens.collect {|w| "%#{w.downcase}%"} @results = [] limit = 10 if @project @scope.each do |s| - @results += s.singularize.camelcase.constantize.search(like_tokens, @all_words, @project, - :limit => (limit+1), :offset => offset, :before => params[:previous].nil?) + @results += s.singularize.camelcase.constantize.search(like_tokens, @project, + :all_words => @all_words, + :titles_only => @titles_only, + :limit => (limit+1), + :offset => offset, + :before => params[:previous].nil?) end @results = @results.sort {|a,b| b.event_datetime <=> a.event_datetime} if params[:previous].nil? @@ -82,6 +86,7 @@ class SearchController < ApplicationController end end else + operator = @all_words ? ' AND ' : ' OR ' Project.with_scope(:find => {:conditions => Project.visible_by(logged_in_user)}) do @results += Project.find(:all, :limit => limit, :conditions => [ (["(LOWER(name) like ? OR LOWER(description) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort] ) if @scope.include? 'projects' end diff --git a/app/views/search/index.rhtml b/app/views/search/index.rhtml index 4bf80f054..695107fe8 100644 --- a/app/views/search/index.rhtml +++ b/app/views/search/index.rhtml @@ -2,14 +2,16 @@
<% form_tag({}, :method => :get) do %> -

<%= text_field_tag 'q', @question, :size => 30, :id => 'search-input' %> +

<%= text_field_tag 'q', @question, :size => 60, :id => 'search-input' %> <%= javascript_tag "Field.focus('search-input')" %> <% @object_types.each do |t| %> <% end %>
-

+ + +

<%= submit_tag l(:button_submit), :name => 'submit' %> <% end %>
diff --git a/lang/bg.yml b/lang/bg.yml index f6492c14a..70af1f0a0 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/cs.yml b/lang/cs.yml index 428fa31e8..325533353 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/de.yml b/lang/de.yml index ddb920fb1..e2f8f7900 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/en.yml b/lang/en.yml index bc6a51c8e..2dda3dd16 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -435,6 +435,7 @@ label_no_change_option: (No change) label_bulk_edit_selected_issues: Bulk edit selected issues label_theme: Theme label_default: Default +label_search_titles_only: Search titles only button_login: Login button_submit: Submit diff --git a/lang/es.yml b/lang/es.yml index bd0caad2a..387600346 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -527,3 +527,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/fr.yml b/lang/fr.yml index 7a8e48313..d5941ef7f 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -435,6 +435,7 @@ label_no_change_option: (Pas de changement) label_bulk_edit_selected_issues: Modifier les demandes sélectionnées label_theme: Thème label_default: Défaut +label_search_titles_only: Uniquement dans les titres button_login: Connexion button_submit: Soumettre diff --git a/lang/it.yml b/lang/it.yml index 1a41a8d50..55ba18109 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/ja.yml b/lang/ja.yml index c5795f2aa..5c33d2826 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -525,3 +525,4 @@ label_no_change_option: (変更無し) notice_failed_to_save_issues: "%d件の問題が保存できませんでした(%d件選択のうち) : %s." label_theme: テーマ label_default: 既定 +label_search_titles_only: Search titles only diff --git a/lang/nl.yml b/lang/nl.yml index f86dee657..aa05904ec 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -525,3 +525,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/pl.yml b/lang/pl.yml index 58a77cdcb..8a7a98b83 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/pt-br.yml b/lang/pt-br.yml index e2031f302..d1624c020 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/pt.yml b/lang/pt.yml index e6ae7fba6..2b6587e74 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/ro.yml b/lang/ro.yml index 81d850e0e..730fa2148 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -524,3 +524,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/sv.yml b/lang/sv.yml index 791292539..53549b244 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -525,3 +525,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/lang/zh.yml b/lang/zh.yml index d0d8490f9..2bfc3e065 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -527,3 +527,4 @@ label_no_change_option: (No change) notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s." label_theme: Theme label_default: Default +label_search_titles_only: Search titles only diff --git a/vendor/plugins/acts_as_searchable/lib/acts_as_searchable.rb b/vendor/plugins/acts_as_searchable/lib/acts_as_searchable.rb index ee4d5d6f8..e2a323abb 100644 --- a/vendor/plugins/acts_as_searchable/lib/acts_as_searchable.rb +++ b/vendor/plugins/acts_as_searchable/lib/acts_as_searchable.rb @@ -59,24 +59,26 @@ module Redmine end module ClassMethods - def search(tokens, all_tokens, project, options={}) + def search(tokens, project, options={}) tokens = [] << tokens unless tokens.is_a?(Array) find_options = {:include => searchable_options[:include]} find_options[:limit] = options[:limit] if options[:limit] find_options[:order] = "#{searchable_options[:date_column]} " + (options[:before] ? 'DESC' : 'ASC') - - sql = ([ '(' + searchable_options[:columns].collect {|column| "(LOWER(#{column}) LIKE ?)"}.join(' OR ') + ')' ] * tokens.size).join(all_tokens ? ' AND ' : ' OR ') + columns = searchable_options[:columns] + columns.slice!(1..-1) if options[:titles_only] + + sql = ([ '(' + columns.collect {|column| "(LOWER(#{column}) LIKE ?)"}.join(' OR ') + ')' ] * tokens.size).join(options[:all_words] ? ' AND ' : ' OR ') if options[:offset] sql = "(#{sql}) AND (#{searchable_options[:date_column]} " + (options[:before] ? '<' : '>') + "'#{connection.quoted_date(options[:offset])}')" end - find_options[:conditions] = [sql, * (tokens * searchable_options[:columns].size).sort] + find_options[:conditions] = [sql, * (tokens * columns.size).sort] results = with_scope(:find => {:conditions => ["#{searchable_options[:project_key]} = ?", project.id]}) do find(:all, find_options) end - if searchable_options[:with] + if searchable_options[:with] && !options[:titles_only] searchable_options[:with].each do |model, assoc| - results += model.to_s.camelcase.constantize.search(tokens, all_tokens, project, options).collect {|r| r.send assoc} + results += model.to_s.camelcase.constantize.search(tokens, project, options).collect {|r| r.send assoc} end results.uniq! end