diff --git a/app/models/tag.rb b/app/models/tag.rb index a043abb3f..064b48258 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -8,6 +8,10 @@ class Tag < ApplicationRecord pool_count deleted_pool_count active_pool_count series_pool_count collection_pool_count appeal_count approval_count replacement_count ] + + # allow e.g. `deleted_comments` as a synonym for `deleted_comment_count` + COUNT_METATAG_SYNONYMS = COUNT_METATAGS.map { |str| str.delete_suffix("_count").pluralize } + METATAGS = %w[ -user user -approver approver commenter comm noter noteupdater artcomm -pool pool ordpool -favgroup favgroup -fav fav ordfav md5 -rating rating @@ -15,7 +19,7 @@ class Tag < ApplicationRecord -source id -id date age order limit -status status tagcount parent -parent child pixiv_id pixiv search upvote downvote filetype -filetype flagger -flagger appealer -appealer disapproval -disapproval - ] + TagCategory.short_name_list.map {|x| "#{x}tags"} + COUNT_METATAGS + ] + TagCategory.short_name_list.map {|x| "#{x}tags"} + COUNT_METATAGS + COUNT_METATAG_SYNONYMS SUBQUERY_METATAGS = %w[commenter comm noter noteupdater artcomm flagger -flagger appealer -appealer] @@ -764,7 +768,14 @@ class Tag < ApplicationRecord q[:child] = g2.downcase when "order" - q[:order] = g2.downcase + g2 = g2.downcase + + order, suffix, _ = g2.partition(/_(asc|desc)\z/i) + if order.in?(COUNT_METATAG_SYNONYMS) + g2 = order.singularize + "_count" + suffix + end + + q[:order] = g2 when "limit" # Do nothing. The controller takes care of it. @@ -801,6 +812,10 @@ class Tag < ApplicationRecord when *COUNT_METATAGS q[g1.to_sym] = parse_helper(g2) + when *COUNT_METATAG_SYNONYMS + g1 = "#{g1.singularize}_count" + q[g1.to_sym] = parse_helper(g2) + end else diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 1e67ecf80..13c5ad6ef 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -2111,6 +2111,10 @@ class PostTest < ActiveSupport::TestCase assert_tag_match([posts[1], posts[0]], "note_count:1") assert_tag_match([posts[0]], "active_note_count:1") assert_tag_match([posts[1]], "deleted_note_count:1") + + assert_tag_match([posts[1], posts[0]], "notes:1") + assert_tag_match([posts[0]], "active_notes:1") + assert_tag_match([posts[1]], "deleted_notes:1") end should "return posts for the artcomm: metatag" do @@ -2418,6 +2422,8 @@ class PostTest < ActiveSupport::TestCase assert_tag_match(posts.reverse, "order:rank") assert_tag_match(posts.reverse, "order:note_count") assert_tag_match(posts.reverse, "order:note_count_desc") + assert_tag_match(posts.reverse, "order:notes") + assert_tag_match(posts.reverse, "order:notes_desc") assert_tag_match(posts, "order:id_asc") assert_tag_match(posts, "order:score_asc") @@ -2436,6 +2442,7 @@ class PostTest < ActiveSupport::TestCase assert_tag_match(posts, "order:chartags_asc") assert_tag_match(posts, "order:copytags_asc") assert_tag_match(posts, "order:note_count_asc") + assert_tag_match(posts, "order:notes_asc") end should "return posts for order:comment_bumped" do