From 6aedbcdc6eac12644d492f4ce9abb8e36f9edeaf Mon Sep 17 00:00:00 2001 From: Toks Date: Sat, 11 Jan 2014 14:34:03 -0500 Subject: [PATCH] fixes #2049 --- app/logical/post_query_builder.rb | 16 +++++++------- ...0111191413_change_source_index_on_posts.rb | 21 +++++++++++++++++++ test/unit/post_test.rb | 4 ++-- 3 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 db/migrate/20140111191413_change_source_index_on_posts.rb diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 6f347c301..bb2f8a7c5 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -170,12 +170,12 @@ class PostQueryBuilder if q[:source] == "none%" relation = relation.where("(posts.source = '' OR posts.source IS NULL)") elsif q[:source] == "http%" - relation = relation.where("(posts.source like ?)", "http%") - elsif q[:source] =~ /^%\.?pixiv(?:\.net(?:\/img)?)?(?:%\/|(?=%$))(.+)$/ - relation = relation.where("SourcePattern(posts.source) LIKE ? ESCAPE E'\\\\'", "pixiv/" + $1) + relation = relation.where("(lower(posts.source) like ?", "http%") + elsif q[:source] =~ /^%\.?pixiv(?:\.net(?:\/img)?)?(?:%\/|(?=%$))(.+)$/i + relation = relation.where("SourcePattern(lower(posts.source)) LIKE lower(?) ESCAPE E'\\\\'", "pixiv/" + $1) has_constraints! else - relation = relation.where("SourcePattern(posts.source) LIKE SourcePattern(?) ESCAPE E'\\\\'", q[:source]) + relation = relation.where("SourcePattern(lower(posts.source)) LIKE SourcePattern(lower(?)) ESCAPE E'\\\\'", q[:source]) has_constraints! end end @@ -184,12 +184,12 @@ class PostQueryBuilder if q[:source_neg] == "none%" relation = relation.where("(posts.source != '' AND posts.source IS NOT NULL)") elsif q[:source_neg] == "http%" - relation = relation.where("(posts.source not like ?)", "http%") - elsif q[:source_neg] =~ /^%\.?pixiv(?:\.net(?:\/img)?)?(?:%\/|(?=%$))(.+)$/ - relation = relation.where("SourcePattern(posts.source) NOT LIKE ? ESCAPE E'\\\\'", "pixiv/" + $1) + relation = relation.where("(lower(posts.source) not like ?)", "http%") + elsif q[:source_neg] =~ /^%\.?pixiv(?:\.net(?:\/img)?)?(?:%\/|(?=%$))(.+)$/i + relation = relation.where("SourcePattern(lower(posts.source)) NOT LIKE lower(?) ESCAPE E'\\\\'", "pixiv/" + $1) has_constraints! else - relation = relation.where("SourcePattern(posts.source) NOT LIKE SourcePattern(?) ESCAPE E'\\\\'", q[:source_neg]) + relation = relation.where("SourcePattern(lower(posts.source)) NOT LIKE SourcePattern(lower(?)) ESCAPE E'\\\\'", q[:source_neg]) has_constraints! end end diff --git a/db/migrate/20140111191413_change_source_index_on_posts.rb b/db/migrate/20140111191413_change_source_index_on_posts.rb new file mode 100644 index 000000000..f27645d27 --- /dev/null +++ b/db/migrate/20140111191413_change_source_index_on_posts.rb @@ -0,0 +1,21 @@ +class ChangeSourceIndexOnPosts < ActiveRecord::Migration + def up + execute "set statement_timeout = 0" + execute "DROP INDEX index_posts_on_source" + execute "DROP INDEX index_posts_on_source_pattern" + execute "CREATE INDEX index_posts_on_source ON posts USING btree + (lower(source))" + execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree + ((SourcePattern(lower(source))) text_pattern_ops)" + end + + def down + execute "set statement_timeout = 0" + execute "DROP INDEX index_posts_on_source" + execute "DROP INDEX index_posts_on_source_pattern" + execute "CREATE INDEX index_posts_on_source ON posts USING btree + (source)" + execute "CREATE INDEX index_posts_on_source_pattern ON posts USING btree + ((SourcePattern(source)) text_pattern_ops)" + end +end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 8b6f8f8de..6efec889a 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -1206,10 +1206,10 @@ class PostTest < ActiveSupport::TestCase assert_equal(post2.id, relation.first.id) end - should "return posts for a case sensitive source search" do + should "return posts for a case insensitive source search" do post1 = FactoryGirl.create(:post, :source => "ABCD") post2 = FactoryGirl.create(:post, :source => "1234") - relation = Post.tag_match("source:ABCD") + relation = Post.tag_match("source:abcd") assert_equal(1, relation.count) end