diff --git a/app/logical/moderator/tag_batch_change.rb b/app/logical/moderator/tag_batch_change.rb index 0adefef39..56fd204e5 100644 --- a/app/logical/moderator/tag_batch_change.rb +++ b/app/logical/moderator/tag_batch_change.rb @@ -17,6 +17,13 @@ module Moderator tags = (post.tag_array - normalized_antecedent + normalized_consequent).join(" ") post.update_attributes(:tag_string => tags) end + + escaped = Regexp.escape(antecedent) + SavedSearch.where("tag_query like ?", "%#{antecedent}%").find_each do |ss| + ss.tag_query = ss.tag_query.sub(/(?:^| )#{escaped}(?:$| )/, " #{consequent} ").strip.gsub(/ /, " ") + ss.save + end + end end end diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index eb838ee45..ebbe6d148 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -103,6 +103,7 @@ class TagAlias < ActiveRecord::Base CurrentUser.scoped(admin, "127.0.0.1") do update_column(:status, "processing") move_aliases_and_implications + move_saved_searches clear_all_cache ensure_category_consistency update_posts @@ -166,6 +167,14 @@ class TagAlias < ActiveRecord::Base end end + def move_saved_searches + escaped = Regexp.escape(antecedent_name) + SavedSearch.where("tag_query like ?", "%#{antecedent_name}%").find_each do |ss| + ss.tag_query = ss.tag_query.sub(/(?:^| )#{escaped}(?:$| )/, " #{consequent_name} ").strip.gsub(/ /, " ") + ss.save + end + end + def move_aliases_and_implications aliases = TagAlias.where(["consequent_name = ?", antecedent_name]) aliases.each do |ta| diff --git a/test/unit/moderator/tag_batch_change_test.rb b/test/unit/moderator/tag_batch_change_test.rb index 6780a64e7..51eae0bc6 100644 --- a/test/unit/moderator/tag_batch_change_test.rb +++ b/test/unit/moderator/tag_batch_change_test.rb @@ -16,14 +16,22 @@ module Moderator end should "execute" do - tag_batch_change = TagBatchChange.new("aaa", "bbb", @user, "127.0.0.1") + tag_batch_change = TagBatchChange.new("aaa", "bbb", @user.id, "127.0.0.1") tag_batch_change.perform @post.reload assert_equal("bbb", @post.tag_string) end + should "move saved searches" do + ss = FactoryGirl.create(:saved_search, :user => @user, :tag_query => "123 ... 456") + tag_batch_change = TagBatchChange.new("...", "bbb", @user.id, "127.0.0.1") + tag_batch_change.perform + ss.reload + assert_equal("123 bbb 456", ss.tag_query) + end + should "raise an error if there is no predicate" do - tag_batch_change = TagBatchChange.new("", "bbb", @user, "127.0.0.1") + tag_batch_change = TagBatchChange.new("", "bbb", @user.id, "127.0.0.1") assert_raises(TagBatchChange::Error) do tag_batch_change.perform end diff --git a/test/unit/tag_alias_test.rb b/test/unit/tag_alias_test.rb index 7eb6c36bd..5ad89ca74 100644 --- a/test/unit/tag_alias_test.rb +++ b/test/unit/tag_alias_test.rb @@ -41,6 +41,15 @@ class TagAliasTest < ActiveSupport::TestCase assert_nil(Cache.get("ta:aaa")) end + should "move saved searches" do + tag1 = FactoryGirl.create(:tag, :name => "...") + tag2 = FactoryGirl.create(:tag, :name => "bbb") + ss = FactoryGirl.create(:saved_search, :tag_query => "123 ... 456", :user => CurrentUser.user) + ta = FactoryGirl.create(:tag_alias, :antecedent_name => "...", :consequent_name => "bbb") + ss.reload + assert_equal("123 bbb 456", ss.tag_query) + end + should "update any affected posts when saved" do assert_equal(0, TagAlias.count) post1 = FactoryGirl.create(:post, :tag_string => "aaa bbb")