/artists: add more search options for other names, group name.
Add these search params: * /artists?search[<field>]= * /artists?search[<field>_eq]= * /artists?search[<field>_not_eq]= * /artists?search[<field>_like]= * /artists?search[<field>_not_like]= * /artists?search[<field>_ilike]= * /artists?search[<field>_not_ilike]= * /artists?search[<field>_regex]= * /artists?search[<field>_not_regex]= where `<field>` can be `name`, `group_name`, or `other_names`. Remove these search params: * /artists?search[name_matches]= * /artists?search[other_names_match]= * /artists?search[group_name_matches]= `/artists?search[<field>_like]=` effectively does the same thing that these searches did.
This commit is contained in:
@@ -455,24 +455,6 @@ class Artist < ApplicationRecord
|
||||
end
|
||||
|
||||
module SearchMethods
|
||||
def other_names_match(string)
|
||||
if string =~ /\*/ && CurrentUser.is_builder?
|
||||
where("artists.other_names ILIKE ? ESCAPE E'\\\\'", string.to_escaped_for_sql_like)
|
||||
else
|
||||
where("artists.other_names_index @@ to_tsquery('danbooru', E?)", Artist.normalize_name(string).to_escaped_for_tsquery)
|
||||
end
|
||||
end
|
||||
|
||||
def group_name_matches(name)
|
||||
stripped_name = normalize_name(name).to_escaped_for_sql_like
|
||||
where("artists.group_name LIKE ? ESCAPE E'\\\\'", stripped_name)
|
||||
end
|
||||
|
||||
def name_matches(name)
|
||||
stripped_name = normalize_name(name).to_escaped_for_sql_like
|
||||
where("artists.name LIKE ? ESCAPE E'\\\\'", stripped_name)
|
||||
end
|
||||
|
||||
def named(name)
|
||||
where(name: normalize_name(name))
|
||||
end
|
||||
@@ -487,21 +469,12 @@ class Artist < ApplicationRecord
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def search(params)
|
||||
q = super
|
||||
|
||||
if params[:name_matches].present?
|
||||
q = q.name_matches(params[:name_matches])
|
||||
end
|
||||
|
||||
if params[:other_names_match].present?
|
||||
q = q.other_names_match(params[:other_names_match])
|
||||
end
|
||||
|
||||
if params[:group_name_matches].present?
|
||||
q = q.group_name_matches(params[:group_name_matches])
|
||||
end
|
||||
q = q.search_text_attribute(:name, params)
|
||||
q = q.search_text_attribute(:other_names, params)
|
||||
q = q.search_text_attribute(:group_name, params)
|
||||
|
||||
if params[:any_name_matches].present?
|
||||
q = q.any_name_matches(params[:any_name_matches])
|
||||
|
||||
@@ -399,30 +399,32 @@ class ArtistTest < ActiveSupport::TestCase
|
||||
|
||||
should "search on its name should return results" do
|
||||
artist = FactoryBot.create(:artist, :name => "artist")
|
||||
|
||||
assert_not_nil(Artist.search(:name => "artist").first)
|
||||
assert_not_nil(Artist.search(:name_matches => "artist").first)
|
||||
assert_not_nil(Artist.search(:name_like => "artist").first)
|
||||
assert_not_nil(Artist.search(:any_name_matches => "artist").first)
|
||||
assert_not_nil(Artist.search(:any_name_matches => "/art/").first)
|
||||
end
|
||||
|
||||
should "search on other names should return matches" do
|
||||
artist = FactoryBot.create(:artist, :name => "artist", :other_names_comma => "aaa, ccc ddd")
|
||||
assert_nil(Artist.other_names_match("artist").first)
|
||||
assert_not_nil(Artist.other_names_match("aaa").first)
|
||||
assert_not_nil(Artist.other_names_match("ccc_ddd").first)
|
||||
assert_not_nil(Artist.search(:name => "artist").first)
|
||||
|
||||
assert_not_nil(Artist.search(:other_names_match => "aaa").first)
|
||||
assert_nil(Artist.search(other_names_like: "*artist*").first)
|
||||
assert_not_nil(Artist.search(other_names_like: "*aaa*").first)
|
||||
assert_not_nil(Artist.search(other_names_like: "*ccc_ddd*").first)
|
||||
assert_not_nil(Artist.search(name: "artist").first)
|
||||
assert_not_nil(Artist.search(:any_name_matches => "aaa").first)
|
||||
assert_not_nil(Artist.search(:any_name_matches => "/a/").first)
|
||||
end
|
||||
|
||||
should "search on group name and return matches" do
|
||||
cat_or_fish = FactoryBot.create(:artist, :name => "cat_or_fish")
|
||||
yuu = FactoryBot.create(:artist, :name => "yuu", :group_name => "cat_or_fish")
|
||||
cat_or_fish.reload
|
||||
assert_equal("yuu", cat_or_fish.member_names)
|
||||
|
||||
assert_not_nil(Artist.search(:group_name_matches => "cat_or_fish").first)
|
||||
assert_equal("yuu", cat_or_fish.member_names)
|
||||
assert_not_nil(Artist.search(:group_name => "cat_or_fish").first)
|
||||
assert_not_nil(Artist.search(:any_name_matches => "cat_or_fish").first)
|
||||
assert_not_nil(Artist.search(:any_name_matches => "/cat/").first)
|
||||
end
|
||||
|
||||
should "search on has_tag and return matches" do
|
||||
|
||||
Reference in New Issue
Block a user