fixes for source pattern search, fixed tests
This commit is contained in:
@@ -124,6 +124,7 @@ class PostQueryBuilder
|
|||||||
relation = add_range_relation(q[:copyright_tag_count], "posts.tag_count_copyright", relation)
|
relation = add_range_relation(q[:copyright_tag_count], "posts.tag_count_copyright", relation)
|
||||||
relation = add_range_relation(q[:character_tag_count], "posts.tag_count_character", relation)
|
relation = add_range_relation(q[:character_tag_count], "posts.tag_count_character", relation)
|
||||||
relation = add_range_relation(q[:post_tag_count], "posts.tag_count", relation)
|
relation = add_range_relation(q[:post_tag_count], "posts.tag_count", relation)
|
||||||
|
# relation = add_range_relation(q[:pixiv_id], "substring(posts.source, 'pixiv.net/img.*/([0-9]+)[^/]*$')::integer", relation)
|
||||||
|
|
||||||
if q[:md5]
|
if q[:md5]
|
||||||
relation = relation.where(["posts.md5 IN (?)", q[:md5]])
|
relation = relation.where(["posts.md5 IN (?)", q[:md5]])
|
||||||
@@ -156,8 +157,8 @@ class PostQueryBuilder
|
|||||||
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(\.net(\/img)?)?(%\/|(?=%$))(.+)$/
|
elsif q[:source] =~ /^%\.?pixiv(?:\.net(?:\/img)?)?(?:%\/|(?=%$))(.+)$/
|
||||||
relation = relation.where("SourcePattern(posts.source) LIKE ? ESCAPE E'\\\\'", "pixiv/" + $5)
|
relation = relation.where("SourcePattern(posts.source) LIKE ? ESCAPE E'\\\\'", "pixiv/" + $1)
|
||||||
has_constraints!
|
has_constraints!
|
||||||
else
|
else
|
||||||
relation = relation.where("SourcePattern(posts.source) LIKE SourcePattern(?) ESCAPE E'\\\\'", q[:source])
|
relation = relation.where("SourcePattern(posts.source) LIKE SourcePattern(?) ESCAPE E'\\\\'", q[:source])
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ class ArtistVersion < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def url_array
|
def url_array
|
||||||
url_string.scan(/\S+/)
|
url_string.to_s.scan(/\S+/)
|
||||||
end
|
end
|
||||||
|
|
||||||
def other_names_array
|
def other_names_array
|
||||||
other_names.scan(/\S+/)
|
other_names.to_s.scan(/\S+/)
|
||||||
end
|
end
|
||||||
|
|
||||||
def urls_diff(version)
|
def urls_diff(version)
|
||||||
|
|||||||
@@ -1,24 +1,30 @@
|
|||||||
class ChangeSourcePatternIndexOnPosts < ActiveRecord::Migration
|
class ChangeSourcePatternIndexOnPosts < ActiveRecord::Migration
|
||||||
def up
|
def up
|
||||||
execute "set statement_timeout = 0"
|
execute "set statement_timeout = 0"
|
||||||
execute "DROP INDEX index_posts_on_pixiv_suffix;"
|
begin
|
||||||
execute "DROP INDEX index_posts_on_source_pattern;"
|
execute "DROP INDEX index_posts_on_pixiv_suffix"
|
||||||
|
execute "DROP INDEX index_posts_on_source_pattern"
|
||||||
|
rescue Exception
|
||||||
|
end
|
||||||
execute "CREATE FUNCTION SourcePattern(src text) RETURNS text AS $$
|
execute "CREATE FUNCTION SourcePattern(src text) RETURNS text AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN regexp_replace(src, '^[^/]*(//)?[^/]*\.pixiv\.net/img.*(/[^/]*/[^/]*)$', 'pixiv\2');
|
RETURN regexp_replace(src, '^[^/]*(//)?[^/]*\.pixiv\.net/img.*(/[^/]*/[^/]*)$', E'pixiv\\\\2');
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql IMMUTABLE RETURNS NULL ON NULL INPUT;"
|
$$ LANGUAGE plpgsql IMMUTABLE RETURNS NULL ON NULL INPUT"
|
||||||
execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree
|
execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree
|
||||||
((SourcePattern(source)) text_pattern_ops);"
|
((SourcePattern(source)) text_pattern_ops)"
|
||||||
|
# execute "CREATE INDEX index_posts_on_pixiv_id ON posts USING btree
|
||||||
|
# ((substring(source, 'pixiv.net/img.*/([0-9]+)[^/]*$')::integer))"
|
||||||
end
|
end
|
||||||
|
|
||||||
def down
|
def down
|
||||||
execute "set statement_timeout = 0"
|
execute "set statement_timeout = 0"
|
||||||
execute "DROP INDEX index_posts_on_source_pattern;"
|
execute "DROP INDEX index_posts_on_source_pattern"
|
||||||
execute "DROP FUNCTION SourcePattern(text);"
|
execute "DROP FUNCTION SourcePattern(text)"
|
||||||
execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree
|
execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree
|
||||||
(source text_pattern_ops);"
|
(source text_pattern_ops)"
|
||||||
execute "CREATE INDEX index_posts_on_pixiv_suffix ON posts USING btree
|
execute "CREATE INDEX index_posts_on_pixiv_suffix ON posts USING btree
|
||||||
((substring(source, 'pixiv.net/img.*/([^/]*/[^/]*)$')) text_pattern_ops);"
|
((substring(source, 'pixiv.net/img.*/([^/]*/[^/]*)$')) text_pattern_ops)"
|
||||||
|
# execute "DROP INDEX index_posts_on_pixiv_id"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -331,6 +331,19 @@ CREATE FUNCTION favorites_insert_trigger() RETURNS trigger
|
|||||||
$$;
|
$$;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: sourcepattern(text); Type: FUNCTION; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE FUNCTION sourcepattern(src text) RETURNS text
|
||||||
|
LANGUAGE plpgsql IMMUTABLE STRICT
|
||||||
|
AS $_$
|
||||||
|
BEGIN
|
||||||
|
RETURN regexp_replace(src, '^[^/]*(//)?[^/]*.pixiv.net/img.*(/[^/]*/[^/]*)$', E'pixiv\\2');
|
||||||
|
END;
|
||||||
|
$_$;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: testprs_end(internal); Type: FUNCTION; Schema: public; Owner: -
|
-- Name: testprs_end(internal); Type: FUNCTION; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
@@ -5929,13 +5942,6 @@ CREATE INDEX index_posts_on_parent_id ON posts USING btree (parent_id);
|
|||||||
CREATE INDEX index_posts_on_pixiv_id ON posts USING btree ((("substring"((source)::text, 'pixiv.net/img.*/([0-9]+)[^/]*$'::text))::integer));
|
CREATE INDEX index_posts_on_pixiv_id ON posts USING btree ((("substring"((source)::text, 'pixiv.net/img.*/([0-9]+)[^/]*$'::text))::integer));
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: index_posts_on_pixiv_suffix; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX index_posts_on_pixiv_suffix ON posts USING btree ("substring"((source)::text, 'pixiv.net/img.*/([^/]*/[^/]*)$'::text) text_pattern_ops);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_posts_on_source; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
-- Name: index_posts_on_source; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
||||||
--
|
--
|
||||||
@@ -5947,7 +5953,7 @@ CREATE INDEX index_posts_on_source ON posts USING btree (source);
|
|||||||
-- Name: index_posts_on_source_pattern; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
-- Name: index_posts_on_source_pattern; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE INDEX index_posts_on_source_pattern ON posts USING btree (source text_pattern_ops);
|
CREATE INDEX index_posts_on_source_pattern ON posts USING btree (sourcepattern((source)::text) text_pattern_ops);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@@ -6347,3 +6353,5 @@ INSERT INTO schema_migrations (version) VALUES ('20130322173859');
|
|||||||
INSERT INTO schema_migrations (version) VALUES ('20130323160259');
|
INSERT INTO schema_migrations (version) VALUES ('20130323160259');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20130326035904');
|
INSERT INTO schema_migrations (version) VALUES ('20130326035904');
|
||||||
|
|
||||||
|
INSERT INTO schema_migrations (version) VALUES ('20130328092739');
|
||||||
@@ -907,12 +907,6 @@ class PostTest < ActiveSupport::TestCase
|
|||||||
assert_equal(post1.id, relation.first.id)
|
assert_equal(post1.id, relation.first.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "return posts for the <pixiv> metatag" do
|
|
||||||
post = FactoryGirl.create(:post, :source => "http://i1.pixiv.net/img123/img/artist-name/789.png")
|
|
||||||
assert_equal(1, Post.tag_match("pixiv:789").count)
|
|
||||||
assert_equal(0, Post.tag_match("pixiv:790").count)
|
|
||||||
end
|
|
||||||
|
|
||||||
should "return posts for a list of md5 hashes" do
|
should "return posts for a list of md5 hashes" do
|
||||||
post1 = FactoryGirl.create(:post, :md5 => "abcd")
|
post1 = FactoryGirl.create(:post, :md5 => "abcd")
|
||||||
post2 = FactoryGirl.create(:post)
|
post2 = FactoryGirl.create(:post)
|
||||||
@@ -939,13 +933,44 @@ class PostTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "return posts for a pixiv source search" do
|
should "return posts for a pixiv source search" do
|
||||||
post = FactoryGirl.create(:post, :source => "http://i1.pixiv.net/img123/img/artist-name/789.png")
|
url = "http://i1.pixiv.net/img123/img/artist-name/789.png"
|
||||||
|
post = FactoryGirl.create(:post, :source => url)
|
||||||
assert_equal(1, Post.tag_match("source:pixiv/artist-name/*").count)
|
assert_equal(1, Post.tag_match("source:pixiv/artist-name/*").count)
|
||||||
assert_equal(0, Post.tag_match("source:pixiv/artist-fake/*").count)
|
assert_equal(0, Post.tag_match("source:pixiv/artist-fake/*").count)
|
||||||
assert_equal(1, Post.tag_match("source:*.pixiv.net/img*/artist-name/*").count)
|
assert_equal(1, Post.tag_match("source:*.pixiv.net/img*/artist-name/*").count)
|
||||||
assert_equal(0, Post.tag_match("source:*.pixiv.net/img*/artist-fake/*").count)
|
assert_equal(0, Post.tag_match("source:*.pixiv.net/img*/artist-fake/*").count)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "return posts for a pixiv id search (type 1)" do
|
||||||
|
url = "http://i1.pixiv.net/img-inf/img/2013/03/14/03/02/36/34228050_s.jpg"
|
||||||
|
post = FactoryGirl.create(:post, :source => url)
|
||||||
|
assert_equal(1, Post.tag_match("pixiv_id:34228050").count)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return posts for a pixiv id search (type 2)" do
|
||||||
|
url = "http://i1.pixiv.net/img123/img/artist-name/789.png"
|
||||||
|
post = FactoryGirl.create(:post, :source => url)
|
||||||
|
assert_equal(1, Post.tag_match("pixiv_id:789").count)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return posts for a pixiv id search (type 3)" do
|
||||||
|
url = "http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=19113635&page=0"
|
||||||
|
post = FactoryGirl.create(:post, :source => url)
|
||||||
|
assert_equal(1, Post.tag_match("pixiv_id:19113635").count)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return posts for a pixiv id search (type 4)" do
|
||||||
|
url = "http://i2.pixiv.net/img70/img/disappearedstump/34551381_p3.jpg?1364424318"
|
||||||
|
post = FactoryGirl.create(:post, :source => url)
|
||||||
|
assert_equal(1, Post.tag_match("pixiv_id:34551381").count)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return posts for a pixiv novel id search" do
|
||||||
|
url = "http://www.pixiv.net/novel/show.php?id=2156088"
|
||||||
|
post = FactoryGirl.create(:post, :source => url)
|
||||||
|
assert_equal(1, Post.tag_match("pixiv_novel_id:2156088").count)
|
||||||
|
end
|
||||||
|
|
||||||
should "return posts for a tag subscription search" do
|
should "return posts for a tag subscription search" do
|
||||||
post1 = FactoryGirl.create(:post, :tag_string => "aaa")
|
post1 = FactoryGirl.create(:post, :tag_string => "aaa")
|
||||||
sub = FactoryGirl.create(:tag_subscription, :tag_query => "aaa", :name => "zzz")
|
sub = FactoryGirl.create(:tag_subscription, :tag_query => "aaa", :name => "zzz")
|
||||||
|
|||||||
Reference in New Issue
Block a user