Merge pull request #3088 from evazion/feat-wiki-other-name-search
Fix #3070: add wildcard support to wiki "other names" search.
This commit is contained in:
@@ -54,7 +54,7 @@ module Sources
|
|||||||
tag
|
tag
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
WikiPage.other_names_match(untranslated_tags).map{|wiki_page| [wiki_page.title, wiki_page.category_name]}
|
WikiPage.other_names_equal(untranslated_tags).map{|wiki_page| [wiki_page.title, wiki_page.category_name]}
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_h
|
def to_h
|
||||||
|
|||||||
@@ -40,12 +40,20 @@ class WikiPage < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def other_names_match(names)
|
def other_names_equal(names)
|
||||||
names = names.map{|name| name.to_escaped_for_tsquery}
|
query_sql = names.map(&:to_escaped_for_tsquery).join(" | ")
|
||||||
query_sql = names.join(" | ")
|
|
||||||
where("other_names_index @@ to_tsquery('danbooru', E?)", query_sql)
|
where("other_names_index @@ to_tsquery('danbooru', E?)", query_sql)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def other_names_match(name)
|
||||||
|
if name =~ /\*/
|
||||||
|
subquery = WikiPage.from("unnest(string_to_array(other_names, ' ')) AS other_name").where("other_name ILIKE ?", name.to_escaped_for_sql_like)
|
||||||
|
where(id: subquery)
|
||||||
|
else
|
||||||
|
other_names_equal([name])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def search(params = {})
|
def search(params = {})
|
||||||
q = where("true")
|
q = where("true")
|
||||||
params = {} if params.blank?
|
params = {} if params.blank?
|
||||||
@@ -63,7 +71,7 @@ class WikiPage < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
if params[:other_names_match].present?
|
if params[:other_names_match].present?
|
||||||
q = q.other_names_match(params[:other_names_match].split(" "))
|
q = q.other_names_match(params[:other_names_match])
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:creator_name].present?
|
if params[:creator_name].present?
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<%= search_field "title", :hint => "Use * for wildcard searches" %>
|
<%= search_field "title", :hint => "Use * for wildcard searches" %>
|
||||||
<%= search_field "creator_name" %>
|
<%= search_field "creator_name" %>
|
||||||
<%= search_field "body_matches", :label => "Body" %>
|
<%= search_field "body_matches", :label => "Body" %>
|
||||||
<%= search_field "other_names_match", :label => "Other names" %>
|
<%= search_field "other_names_match", :label => "Other names", :hint => "Use * for wildcard searches" %>
|
||||||
|
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<label for="search_other_names_present">Other names present?</label>
|
<label for="search_other_names_present">Other names present?</label>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class WikiPageTest < ActiveSupport::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@user = FactoryGirl.create(:user)
|
@user = FactoryGirl.create(:user)
|
||||||
CurrentUser.user = @user
|
CurrentUser.user = @user
|
||||||
@wiki_page = FactoryGirl.create(:wiki_page, :title => "HOT POTATO")
|
@wiki_page = FactoryGirl.create(:wiki_page, :title => "HOT POTATO", :other_names => "foo*bar baz")
|
||||||
end
|
end
|
||||||
|
|
||||||
should "not allow the is_locked attribute to be updated" do
|
should "not allow the is_locked attribute to be updated" do
|
||||||
@@ -67,6 +67,11 @@ class WikiPageTest < ActiveSupport::TestCase
|
|||||||
assert_equal("hot_potato", matches.first.title)
|
assert_equal("hot_potato", matches.first.title)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "search other names with wildcards" do
|
||||||
|
matches = WikiPage.search(other_names_match: "fo*")
|
||||||
|
assert_equal([@wiki_page.id], matches.map(&:id))
|
||||||
|
end
|
||||||
|
|
||||||
should "create versions" do
|
should "create versions" do
|
||||||
assert_difference("WikiPageVersion.count") do
|
assert_difference("WikiPageVersion.count") do
|
||||||
@wiki_page = FactoryGirl.create(:wiki_page, :title => "xxx")
|
@wiki_page = FactoryGirl.create(:wiki_page, :title => "xxx")
|
||||||
|
|||||||
Reference in New Issue
Block a user