From deb62e0cdb07e78d656767c64a7087c6b940cbfb Mon Sep 17 00:00:00 2001 From: Albert Yi Date: Mon, 5 Dec 2016 17:19:21 -0800 Subject: [PATCH] smarter updates on saved searches on tag batch changes #2674 --- app/logical/moderator/tag_batch_change.rb | 8 +++++--- app/models/saved_search.rb | 4 ++++ app/models/tag.rb | 8 ++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/logical/moderator/tag_batch_change.rb b/app/logical/moderator/tag_batch_change.rb index dd8b90bf9..940d0463e 100644 --- a/app/logical/moderator/tag_batch_change.rb +++ b/app/logical/moderator/tag_batch_change.rb @@ -20,9 +20,11 @@ module Moderator 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(/ /, " ") + tags = Tag.scan_tags(antecedent, :strip_metatags => true) + conds = tags.map {|x| "tag_query like ?"}.join(" AND ") + conds = [conds, *tags.map {|x| "%#{x}%"}] + SavedSearch.where(*conds).find_each do |ss| + ss.tag_query = (ss.tag_query_array - tags + antecedent).uniq.join(" ") ss.save end diff --git a/app/models/saved_search.rb b/app/models/saved_search.rb index 689b2a899..64fbfb628 100644 --- a/app/models/saved_search.rb +++ b/app/models/saved_search.rb @@ -152,4 +152,8 @@ class SavedSearch < ActiveRecord::Base user.update_attribute(:has_saved_searches, false) end end + + def tag_query_array + Tag.scan_tags(tag_query) + end end diff --git a/app/models/tag.rb b/app/models/tag.rb index a6b61dff9..1729ba8ec 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -236,10 +236,14 @@ class Tag < ActiveRecord::Base list + tagstr.gsub(/-?source:".*?"/, "").scan(/\S+/).uniq end - def scan_tags(tags) + def scan_tags(tags, options = {}) tagstr = normalize(tags) list = tagstr.scan(/source:".*?"/) || [] - list + tagstr.gsub(/source:".*?"/, "").gsub(/[%,]/, "").scan(/\S+/).uniq + list += tagstr.gsub(/source:".*?"/, "").gsub(/[%,]/, "").scan(/\S+/).uniq + if options[:strip_metatags] + list = list.map {|x| x.sub(/^[-~]/, "")} + end + list end def parse_cast(object, type)