From: Jean-Philippe Lang Date: Sat, 13 Dec 2014 18:36:35 +0000 (+0000) Subject: Don't use #downcase on search tokens, let the database handle it (#18537). X-Git-Tag: 3.0.0~234 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6ad8ff4e13bc8ccf75a0cc857a0256422c9b05ca;p=redmine.git Don't use #downcase on search tokens, let the database handle it (#18537). git-svn-id: http://svn.redmine.org/redmine/trunk@13754 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index 2d4fdfc05..000f52e30 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -1,5 +1,7 @@

<%= l(:label_home) %>

+<%= "Ö".downcase %> +
<%= textilizable Setting.welcome_text %> <% if @news.any? %> diff --git a/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb b/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb index fa5fa202b..37c8b400d 100644 --- a/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb +++ b/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb @@ -86,7 +86,7 @@ module Redmine columns = searchable_options[:columns] columns = columns[0..0] if options[:titles_only] - token_clauses = columns.collect {|column| "(LOWER(#{column}) LIKE ?)"} + token_clauses = columns.collect {|column| "(LOWER(#{column}) LIKE LOWER(?))"} if !options[:titles_only] && searchable_options[:search_custom_fields] searchable_custom_fields = CustomField.where(:type => "#{self.name}CustomField", :searchable => true) @@ -97,7 +97,7 @@ module Redmine fields_by_visibility.each do |visibility, fields| ids = fields.map(&:id).join(',') sql = "#{table_name}.id IN (SELECT cfs.customized_id FROM #{CustomValue.table_name} cfs" + - " WHERE cfs.customized_type='#{self.name}' AND cfs.customized_id=#{table_name}.id AND LOWER(cfs.value) LIKE ?" + + " WHERE cfs.customized_type='#{self.name}' AND cfs.customized_id=#{table_name}.id AND LOWER(cfs.value) LIKE LOWER(?)" + " AND cfs.custom_field_id IN (#{ids})" + " AND #{visibility})" token_clauses << sql @@ -106,7 +106,7 @@ module Redmine sql = (['(' + token_clauses.join(' OR ') + ')'] * tokens.size).join(options[:all_words] ? ' AND ' : ' OR ') - tokens_conditions = [sql, * (tokens.collect {|w| "%#{w.downcase}%"} * token_clauses.size).sort] + tokens_conditions = [sql, * (tokens.collect {|w| "%#{w}%"} * token_clauses.size).sort] scope = (searchable_options[:scope] || self) if scope.is_a? Proc diff --git a/test/unit/search_test.rb b/test/unit/search_test.rb index c98982e8a..48f39033d 100644 --- a/test/unit/search_test.rb +++ b/test/unit/search_test.rb @@ -1,3 +1,5 @@ +# encoding: utf-8 +# # Redmine - project management software # Copyright (C) 2006-2014 Jean-Philippe Lang # @@ -137,6 +139,13 @@ class SearchTest < ActiveSupport::TestCase assert_equal issue, r.first end + def test_search_should_not_use_ruby_downcase + issue = Issue.generate!(:subject => "Special chars: ÖÖ") + r = Issue.search_results('%ÖÖ%') + assert_equal 1, r.size + assert_equal issue, r.first + end + private def remove_permission(role, permission)