Allow escaping wildcards (\*) in wildcard searches.

This commit is contained in:
evazion
2017-05-22 12:44:36 -05:00
parent 69fd6e6ca1
commit cebf29f83e
3 changed files with 41 additions and 1 deletions

View File

@@ -2,7 +2,18 @@ module Danbooru
module Extensions
module String
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
def to_escaped_for_tsquery_split

17
test/unit/string_test.rb Normal file
View 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

View File

@@ -310,5 +310,17 @@ class UserTest < ActiveSupport::TestCase
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