/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.
This commit is contained in:
@@ -153,7 +153,7 @@ module Sources
|
|||||||
end
|
end
|
||||||
|
|
||||||
def artists
|
def artists
|
||||||
Artist.url_matches(normalize_for_artist_finder)
|
Artist.find_artists(normalize_for_artist_finder)
|
||||||
end
|
end
|
||||||
|
|
||||||
def file_url
|
def file_url
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ class Artist < ApplicationRecord
|
|||||||
%r!\Ahttps?://(?:[a-zA-Z0-9_-]+\.)*#{domain}/\z!i
|
%r!\Ahttps?://(?:[a-zA-Z0-9_-]+\.)*#{domain}/\z!i
|
||||||
end)
|
end)
|
||||||
|
|
||||||
def url_matches(url)
|
def find_artists(url)
|
||||||
url = ArtistUrl.normalize(url)
|
url = ArtistUrl.normalize(url)
|
||||||
artists = []
|
artists = []
|
||||||
|
|
||||||
@@ -469,6 +469,18 @@ class Artist < ApplicationRecord
|
|||||||
end
|
end
|
||||||
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)
|
def search(params)
|
||||||
q = super
|
q = super
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ require 'test_helper'
|
|||||||
|
|
||||||
class ArtistTest < ActiveSupport::TestCase
|
class ArtistTest < ActiveSupport::TestCase
|
||||||
def assert_artist_found(expected_name, source_url)
|
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(1, artists.size)
|
||||||
assert_equal(expected_name, artists.first.name, "Testing URL: #{source_url}")
|
assert_equal(expected_name, artists.first.name, "Testing URL: #{source_url}")
|
||||||
@@ -11,7 +11,7 @@ class ArtistTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def assert_artist_not_found(source_url)
|
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}")
|
assert_equal(0, artists.size, "Testing URL: #{source_url}")
|
||||||
rescue Net::OpenTimeout
|
rescue Net::OpenTimeout
|
||||||
skip "Remote connection failed for #{source_url}"
|
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)
|
assert_not_nil(Artist.search(:any_name_matches => "/cat/").first)
|
||||||
end
|
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
|
should "search on has_tag and return matches" do
|
||||||
post = FactoryBot.create(:post, tag_string: "bkub")
|
post = FactoryBot.create(:post, tag_string: "bkub")
|
||||||
bkub = FactoryBot.create(:artist, name: "bkub")
|
bkub = FactoryBot.create(:artist, name: "bkub")
|
||||||
|
|||||||
Reference in New Issue
Block a user