Strip junk from Pixiv URLs before indexing, #726
This commit is contained in:
@@ -150,14 +150,17 @@ class PostQueryBuilder
|
|||||||
relation = relation.where("posts.is_deleted = FALSE")
|
relation = relation.where("posts.is_deleted = FALSE")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# The SourcePattern SQL function replaces Pixiv sources with "pixiv/[suffix]", where
|
||||||
|
# [suffix] is everything past the second-to-last slash in the URL. It leaves non-Pixiv
|
||||||
|
# URLs unchanged. This is to ease database load for Pixiv source searches.
|
||||||
if q[:source]
|
if q[:source]
|
||||||
if q[:source] == "none%"
|
if q[:source] == "none%"
|
||||||
relation = relation.where("(posts.source = '' OR posts.source IS NULL)")
|
relation = relation.where("(posts.source = '' OR posts.source IS NULL)")
|
||||||
elsif q[:source] =~ /pixiv/
|
elsif q[:source] =~ /^%\.?pixiv(\.net(\/img)?)?(%\/|(?=%$))(.+)$/
|
||||||
raise ::Post::SearchError.new("pixiv source searches temporarily disabled")
|
relation = relation.where("SourcePattern(posts.source) LIKE ? ESCAPE E'\\\\'", "pixiv/" + $5)
|
||||||
has_constraints!
|
has_constraints!
|
||||||
else
|
else
|
||||||
relation = relation.where("posts.source LIKE ? ESCAPE E'\\\\'", q[:source])
|
relation = relation.where("SourcePattern(posts.source) LIKE SourcePattern(?) ESCAPE E'\\\\'", q[:source])
|
||||||
has_constraints!
|
has_constraints!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
class ChangeSourcePatternIndexOnPosts < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
execute "set statement_timeout = 0"
|
||||||
|
execute "DROP INDEX index_posts_on_pixiv_suffix;"
|
||||||
|
execute "DROP INDEX index_posts_on_source_pattern;"
|
||||||
|
execute "CREATE FUNCTION SourcePattern(src text) RETURNS text AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN regexp_replace(src, '^[^/]*(//)?[^/]*\.pixiv\.net/img.*(/[^/]*/[^/]*)$', 'pixiv\2');
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql IMMUTABLE RETURNS NULL ON NULL INPUT;"
|
||||||
|
execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree
|
||||||
|
((SourcePattern(source)) text_pattern_ops);"
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
execute "set statement_timeout = 0"
|
||||||
|
execute "DROP INDEX index_posts_on_source_pattern;"
|
||||||
|
execute "DROP FUNCTION SourcePattern(text);"
|
||||||
|
execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree
|
||||||
|
(source text_pattern_ops);"
|
||||||
|
execute "CREATE INDEX index_posts_on_pixiv_suffix ON posts USING btree
|
||||||
|
((substring(source, 'pixiv.net/img.*/([^/]*/[^/]*)$')) text_pattern_ops);"
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user