Allow escaping wildcards (\*) in wildcard searches.
This commit is contained in:
@@ -2,7 +2,18 @@ module Danbooru
|
|||||||
module Extensions
|
module Extensions
|
||||||
module String
|
module String
|
||||||
def to_escaped_for_sql_like
|
def to_escaped_for_sql_like
|
||||||
return self.gsub(/\\/, '\0\0').gsub(/(%|_)/, "\\\\\\1").gsub(/\*/, '%')
|
string = self.gsub(/%|_|\*|\\\*|\\\\|\\/) do |str|
|
||||||
|
case str
|
||||||
|
when '%' then '\%'
|
||||||
|
when '_' then '\_'
|
||||||
|
when '*' then '%'
|
||||||
|
when '\*' then '*'
|
||||||
|
when '\\\\' then '\\\\'
|
||||||
|
when '\\' then '\\\\'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
string
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_escaped_for_tsquery_split
|
def to_escaped_for_tsquery_split
|
||||||
|
|||||||
17
test/unit/string_test.rb
Normal file
17
test/unit/string_test.rb
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class StringTest < ActiveSupport::TestCase
|
||||||
|
context "String#to_escaped_for_sql_like" do
|
||||||
|
should "work" do
|
||||||
|
assert_equal('foo\%bar', 'foo%bar'.to_escaped_for_sql_like)
|
||||||
|
assert_equal('foo\_bar', 'foo_bar'.to_escaped_for_sql_like)
|
||||||
|
assert_equal('foo%bar', 'foo*bar'.to_escaped_for_sql_like)
|
||||||
|
assert_equal('foo*bar', 'foo\*bar'.to_escaped_for_sql_like)
|
||||||
|
assert_equal('foo\\\\%bar', 'foo\\\\*bar'.to_escaped_for_sql_like)
|
||||||
|
assert_equal('foo\\\\bar', 'foo\bar'.to_escaped_for_sql_like)
|
||||||
|
|
||||||
|
assert_equal('%\\\\%', '*\\\\*'.to_escaped_for_sql_like)
|
||||||
|
assert_equal('%*%', '*\**'.to_escaped_for_sql_like)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -310,5 +310,17 @@ class UserTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when searched by name" do
|
||||||
|
should "match wildcards" do
|
||||||
|
user1 = FactoryGirl.create(:user, :name => "foo")
|
||||||
|
user2 = FactoryGirl.create(:user, :name => "foo*bar")
|
||||||
|
user3 = FactoryGirl.create(:user, :name => "bar\*baz")
|
||||||
|
|
||||||
|
assert_equal([user2.id, user1.id], User.search(name: "foo*").map(&:id))
|
||||||
|
assert_equal([user2.id], User.search(name: "foo\*bar").map(&:id))
|
||||||
|
assert_equal([user3.id], User.search(name: "bar\\\*baz").map(&:id))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user