Skip to content

Commit dbff245

Browse files
committed
Merge pull request risuiowa#29 from michieldewit/casesensitive
Added option to make autocomplete case sensitive
2 parents a5e551a + 3b33c0a commit dbff245

File tree

5 files changed

+21
-10
lines changed

5 files changed

+21
-10
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,11 @@ e.g `:scopes => [:scope1, :scope2]`
209209
By default autocomplete uses method name as column name. Now it can be specified using column_name options
210210
`:column_name => 'name'`
211211

212+
#### :case_sensitive
213+
214+
Normally autocomplete performs a case insentive search. In cases where this is not desirable, or causes too high
215+
a performance penalty, search can be made case sensitive by specifying `:case_sensitive => true`
216+
212217
#### json encoder
213218

214219
Autocomplete uses Yajl as JSON encoder/decoder, but you can specify your own

lib/rails-jquery-autocomplete/orm/active_record.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,15 @@ def get_autocomplete_select_clause(model, method, options)
5050
def get_autocomplete_where_clause(model, term, method, options)
5151
table_name = model.table_name
5252
is_full_search = options[:full]
53-
like_clause = (postgres?(model) ? 'ILIKE' : 'LIKE')
53+
is_case_sensitive_search = options[:case_sensitive]
54+
like_clause = (postgres?(model) && !is_case_sensitive_search ? 'ILIKE' : 'LIKE')
55+
column_transform = is_case_sensitive_search ? '' : 'LOWER'
5456
if options[:hstore]
55-
["LOWER(#{table_name}.#{method} -> '#{options[:hstore][:key]}') LIKE ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"]
57+
["#{column_transform}(#{table_name}.#{method} -> '#{options[:hstore][:key]}') LIKE #{column_transform}(?)", "#{(is_full_search ? '%' : '')}#{term}%"]
5658
elsif sqlite?
57-
["LOWER(#{method}) #{like_clause} ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"]
59+
["#{column_transform}(#{method}) #{like_clause} #{column_transform}(?)", "#{(is_full_search ? '%' : '')}#{term}%"]
5860
else
59-
["LOWER(#{table_name}.#{method}) #{like_clause} ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"]
61+
["#{column_transform}(#{table_name}.#{method}) #{like_clause} #{column_transform}(?)", "#{(is_full_search ? '%' : '')}#{term}%"]
6062
end
6163
end
6264

lib/rails-jquery-autocomplete/orm/mongo_mapper.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ def mongo_mapper_get_autocomplete_items(parameters)
1818
method = parameters[:method]
1919
options = parameters[:options]
2020
is_full_search = options[:full]
21+
is_case_sensitive_search = options[:case_sensitive]
2122
term = parameters[:term]
2223
limit = get_autocomplete_limit(options)
2324
order = mongo_mapper_get_autocomplete_order(method, options)
2425

2526
search = (is_full_search ? '.*' : '^') + term + '.*'
26-
items = model.where(method.to_sym => /#{search}/i).limit(limit).sort(order)
27+
search = Regexp.new(search, !is_case_sensitive_search)
28+
items = model.where(method.to_sym => search).limit(limit).sort(order)
2729
end
2830
end
2931
end

lib/rails-jquery-autocomplete/orm/mongoid.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def mongoid_get_autocomplete_items(parameters)
1818
method = parameters[:method]
1919
options = parameters[:options]
2020
is_full_search = options[:full]
21+
is_case_sensitive_search = options[:case_sensitive]
2122
term = parameters[:term]
2223
limit = get_autocomplete_limit(options)
2324
order = mongoid_get_autocomplete_order(method, options)
@@ -27,7 +28,8 @@ def mongoid_get_autocomplete_items(parameters)
2728
else
2829
search = '^' + Regexp.escape(term)
2930
end
30-
items = model.where(method.to_sym => /#{search}/i).limit(limit).order_by(order)
31+
search = Regexp.new(search, !is_case_sensitive_search)
32+
items = model.where(method.to_sym => search).limit(limit).order_by(order)
3133
end
3234
end
3335
end

test/lib/rails-jquery-autocomplete/orm/active_record_test.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,14 @@ class Dog ; end
130130
context 'Not Postgres' do
131131
should 'return options for where' do
132132
mock(self).postgres?(@model) { false }
133-
assert_equal ["LOWER(table_name.method) LIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
133+
assert_equal ["LOWER(table_name.method) LIKE LOWER(?)", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
134134
end
135135
end
136136

137137
context 'Postgres' do
138138
should 'return options for where with ILIKE' do
139139
mock(self).postgres?(@model) { true }
140-
assert_equal ["LOWER(table_name.method) ILIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
140+
assert_equal ["LOWER(table_name.method) ILIKE LOWER(?)", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
141141
end
142142
end
143143

@@ -146,15 +146,15 @@ class Dog ; end
146146
mock(self).postgres?(@model) { true }
147147
@options[:hstore] = {method: :hsmethod, key: :hskey}
148148
@method = :hsmethod
149-
assert_equal ["LOWER(table_name.hsmethod -> 'hskey') LIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
149+
assert_equal ["LOWER(table_name.hsmethod -> 'hskey') LIKE LOWER(?)", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
150150
end
151151
end
152152

153153
context 'full search' do
154154
should 'return options for where with the term sourrounded by %%' do
155155
mock(self).postgres?(@model) { false }
156156
@options[:full] = true
157-
assert_equal ["LOWER(table_name.method) LIKE ?", "%query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
157+
assert_equal ["LOWER(table_name.method) LIKE LOWER(?)", "%query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
158158
end
159159
end
160160
end

0 commit comments

Comments
 (0)