]> source.dussan.org Git - redmine.git/commitdiff
Search engine: added a checkbox to search titles only (usefull when searching on...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 15 Oct 2007 16:53:39 +0000 (16:53 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 15 Oct 2007 16:53:39 +0000 (16:53 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@842 e93f8b46-1217-0410-a6f0-8f06a7374b81

18 files changed:
app/controllers/search_controller.rb
app/views/search/index.rhtml
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fr.yml
lang/it.yml
lang/ja.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/sv.yml
lang/zh.yml
vendor/plugins/acts_as_searchable/lib/acts_as_searchable.rb

index 292472fbac28e73a0d973bfead980d86e4ce2369..2c00b3d7462ca888d26540ed40289eb4aa36dccd 100644 (file)
@@ -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
index 4bf80f0541907056e3c63b636fa5b0befd3677fe..695107fe8f4f6c65bf23b14e8081059ae4d78ae9 100644 (file)
@@ -2,14 +2,16 @@
 \r
 <div class="box">\r
 <% form_tag({}, :method => :get) do %>\r
-<p><%= text_field_tag 'q', @question, :size => 30, :id => 'search-input' %>\r
+<p><%= text_field_tag 'q', @question, :size => 60, :id => 'search-input' %>\r
 <%= javascript_tag "Field.focus('search-input')" %>\r
 \r
 <% @object_types.each do |t| %>\r
 <label><%= check_box_tag t, 1, @scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label>\r
 <% end %>\r
 <br />\r
-<label><%= check_box_tag 'all_words', 1, @all_words %> <%= l(:label_all_words) %></label></p>\r
+<label><%= check_box_tag 'all_words', 1, @all_words %> <%= l(:label_all_words) %></label>\r
+<label><%= check_box_tag 'titles_only', 1, @titles_only %> <%= l(:label_search_titles_only) %></label>\r
+</p>\r
 <%= submit_tag l(:button_submit), :name => 'submit' %>\r
 <% end %>\r
 </div>\r
index f6492c14ae3abbdfd8d2c923c2a2bde7a16d2840..70af1f0a04ba4399f395a12074d395e53a4d7fe6 100644 (file)
@@ -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
index 428fa31e83940792b1f4f6082f01f950c3a08679..325533353533031e7c0fd6270bac2f015abe1bce 100644 (file)
@@ -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
index ddb920fb1d4a0ea2a110e0c27fbf5cbf450a4179..e2f8f79009779f680af39f674ef7275e55e80bc8 100644 (file)
@@ -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
index bc6a51c8e2c8b5481bbaf628e85f932669765620..2dda3dd16879ce430a92c1a16d57d01396e85472 100644 (file)
@@ -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
index bd0caad2a39be8cf0533fe7790e0c4fa5c5f6a01..387600346068f8057ca9a4479125fb3b65a2931e 100644 (file)
@@ -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
index 7a8e4831327304c5c1292513599a84ef04c120f2..d5941ef7f4750ae22dfb5cb0e9bce6608230dba4 100644 (file)
@@ -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
index 1a41a8d50f731ea6ed9202c63abcc6ea4a9da15b..55ba18109561a3e968b314f757d775faa5f3b0dc 100644 (file)
@@ -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
index c5795f2aa74d813c2e25ccd0b7aaf7da45b5959b..5c33d2826c9dd5b49c9247766502eebf5ef345b0 100644 (file)
@@ -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
index f86dee65736965b339a0b8b087f2f589fa000833..aa05904ec88678eb0baa5a7aa4df8fa7a97746fd 100644 (file)
@@ -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
index 58a77cdcb79d259d916ce4ebffbca3e879d5a3fa..8a7a98b832f25c294d24780681786454966c7d32 100644 (file)
@@ -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
index e2031f302fa86880a0d5814ded63306544188606..d1624c0201b3c90eb295fcf531de50ef7505fed6 100644 (file)
@@ -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."\r
 label_theme: Theme\r
 label_default: Default\r
+label_search_titles_only: Search titles only\r
index e6ae7fba6b8021e0502794b2e4641cb4b115eb51..2b6587e74d282946ec7cb829b56cf59cbd74e7a6 100644 (file)
@@ -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
index 81d850e0e8deeebc44d7385f4a6faef9c5e60ddb..730fa2148c282071a50b121876ff651eca12d6c0 100644 (file)
@@ -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
index 79129253947d6ae261a6267515b2d9f02cf6ba37..53549b244c9807c0b69d93de73651695f05e1e51 100644 (file)
@@ -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
index d0d8490f9154b9cca1d6fc8e3013cd0510dce2d2..2bfc3e065b3a846859a5363cb5465af1530c4e31 100644 (file)
@@ -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
index ee4d5d6f8e669b8a131dd667066b3ac8e382b675..e2a323abb619cdb344bd62bbaa63e5659e1f408a 100644 (file)
@@ -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