From a4608daf38de07ebb668876bc624778591352c7c Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 21 Sep 2018 18:53:14 -0500 Subject: [PATCH] /artists: add more search options for other names, group name. Add these search params: * /artists?search[]= * /artists?search[_eq]= * /artists?search[_not_eq]= * /artists?search[_like]= * /artists?search[_not_like]= * /artists?search[_ilike]= * /artists?search[_not_ilike]= * /artists?search[_regex]= * /artists?search[_not_regex]= where `` 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[_like]=` effectively does the same thing that these searches did. --- app/models/artist.rb | 33 +++------------------------------ test/unit/artist_test.rb | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 39 deletions(-) diff --git a/app/models/artist.rb b/app/models/artist.rb index be25cfdfc..7d27dfbe4 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -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]) diff --git a/test/unit/artist_test.rb b/test/unit/artist_test.rb index f2c0db7a8..ecb2cf3e6 100644 --- a/test/unit/artist_test.rb +++ b/test/unit/artist_test.rb @@ -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