From 09a8198979c1b1e7daaa5ea5e923b83276ace8ca Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 21 Sep 2018 21:03:24 -0500 Subject: [PATCH] /artists: add wildcard, regex search to url field (#3900) Allow searching the URL field by regex or by wildcard. If the query looks like `/twitter/` do a regex search, otherwise if it looks like `http://www.twitter.com/*` do a wildcard search, otherwise if it looks like an url do an artist finder search, lastly if it looks like `twitter` do a `*twitter*` search. --- app/logical/sources/strategies/base.rb | 2 +- app/models/artist.rb | 14 +++++++++++++- test/unit/artist_test.rb | 13 +++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/logical/sources/strategies/base.rb b/app/logical/sources/strategies/base.rb index 24a3b5fe0..dabb3c6f2 100644 --- a/app/logical/sources/strategies/base.rb +++ b/app/logical/sources/strategies/base.rb @@ -153,7 +153,7 @@ module Sources end def artists - Artist.url_matches(normalize_for_artist_finder) + Artist.find_artists(normalize_for_artist_finder) end def file_url diff --git a/app/models/artist.rb b/app/models/artist.rb index 7d27dfbe4..e35b9cfff 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -147,7 +147,7 @@ class Artist < ApplicationRecord %r!\Ahttps?://(?:[a-zA-Z0-9_-]+\.)*#{domain}/\z!i end) - def url_matches(url) + def find_artists(url) url = ArtistUrl.normalize(url) artists = [] @@ -469,6 +469,18 @@ class Artist < ApplicationRecord end end + def url_matches(query) + if query =~ %r!\A/(.*)/\z! + where(id: ArtistUrl.where_regex(:url, $1).select(:artist_id)) + elsif query.include?("*") + where(id: ArtistUrl.where_like(:url, query).select(:artist_id)) + elsif query =~ %r!\Ahttps?://!i + find_artists(query) + else + where(id: ArtistUrl.where_like(:url, "*#{query}*").select(:artist_id)) + end + end + def search(params) q = super diff --git a/test/unit/artist_test.rb b/test/unit/artist_test.rb index ecb2cf3e6..36c1b7313 100644 --- a/test/unit/artist_test.rb +++ b/test/unit/artist_test.rb @@ -2,7 +2,7 @@ require 'test_helper' class ArtistTest < ActiveSupport::TestCase def assert_artist_found(expected_name, source_url) - artists = Artist.url_matches(source_url).to_a + artists = Artist.find_artists(source_url).to_a assert_equal(1, artists.size) assert_equal(expected_name, artists.first.name, "Testing URL: #{source_url}") @@ -11,7 +11,7 @@ class ArtistTest < ActiveSupport::TestCase end def assert_artist_not_found(source_url) - artists = Artist.url_matches(source_url).to_a + artists = Artist.find_artists(source_url).to_a assert_equal(0, artists.size, "Testing URL: #{source_url}") rescue Net::OpenTimeout skip "Remote connection failed for #{source_url}" @@ -427,6 +427,15 @@ class ArtistTest < ActiveSupport::TestCase assert_not_nil(Artist.search(:any_name_matches => "/cat/").first) end + should "search on url and return matches" do + bkub = FactoryBot.create(:artist, name: "bkub", url_string: "http://bkub.com") + + assert_equal([bkub.id], Artist.search(url_matches: "bkub").map(&:id)) + assert_equal([bkub.id], Artist.search(url_matches: "*bkub*").map(&:id)) + assert_equal([bkub.id], Artist.search(url_matches: "/rifyu|bkub/").map(&:id)) + assert_equal([bkub.id], Artist.search(url_matches: "http://bkub.com/test.jpg").map(&:id)) + end + should "search on has_tag and return matches" do post = FactoryBot.create(:post, tag_string: "bkub") bkub = FactoryBot.create(:artist, name: "bkub")