diff --git a/app/logical/tag_relationship_retirement_service.rb b/app/logical/tag_relationship_retirement_service.rb index 0092acd1a..7b4d65133 100644 --- a/app/logical/tag_relationship_retirement_service.rb +++ b/app/logical/tag_relationship_retirement_service.rb @@ -40,13 +40,20 @@ module TagRelationshipRetirementService end def inactive_relationships - (inactive_aliases + TagAlias.active.empty + TagImplication.active.empty).uniq + (inactive_aliases + inactive_implications).uniq + end + + def inactive_implications + TagImplication.active.empty.where.not(consequent_name: "banned_artist") end def inactive_aliases aliases = TagAlias.general.or(TagAlias.artist).active.where("tag_aliases.created_at < ?", THRESHOLD.ago) - aliases.select do |tag_alias| + aliases = aliases.select do |tag_alias| !tag_alias.consequent_tag.posts.exists?(["created_at > ?", THRESHOLD.ago]) end + + aliases += TagAlias.active.empty + aliases end end diff --git a/app/models/tag.rb b/app/models/tag.rb index 423aba1f7..087fc2c7a 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -356,6 +356,14 @@ class Tag < ApplicationRecord cosplay_tags.grep(/\A(.+)_\(cosplay\)\Z/) { "#{TagAlias.to_aliased([$1]).first}_(cosplay)" } + other_tags end + def implied_tags + TagImplication.tags_implied_by([name]) + end + + def implies?(tag_name) + implied_tags.exists?(name: tag_name) + end + def posts Post.system_tag_match(name) end diff --git a/test/jobs/retire_tag_relationships_job_test.rb b/test/jobs/retire_tag_relationships_job_test.rb index c9b5ab490..78be3a4a8 100644 --- a/test/jobs/retire_tag_relationships_job_test.rb +++ b/test/jobs/retire_tag_relationships_job_test.rb @@ -101,5 +101,16 @@ class RetireTagRelationshipsJobTest < ActiveJob::TestCase assert_equal(true, ta3.reload.is_retired?) assert_equal(true, ta4.reload.is_retired?) end + + should "not retire empty banned_artist implications" do + bkub = create(:tag, name: "bkub", post_count: 0, category: Tag.categories.artist) + banned_artist = create(:tag, name: "banned_artist", post_count: 0, category: Tag.categories.artist) + ti = create(:tag_implication, antecedent_name: "bkub", consequent_name: "banned_artist") + + RetireTagRelationshipsJob.perform_now + + assert_equal(false, ti.reload.is_retired?) + assert_equal(true, bkub.implies?("banned_artist")) + end end end