diff --git a/app/javascript/src/javascripts/autocomplete.js.erb b/app/javascript/src/javascripts/autocomplete.js.erb
index 5d21046fc..1c5d56c96 100644
--- a/app/javascript/src/javascripts/autocomplete.js.erb
+++ b/app/javascript/src/javascripts/autocomplete.js.erb
@@ -288,6 +288,9 @@ Autocomplete.static_metatags = {
filetype: [
"jpg", "png", "gif", "swf", "zip", "webm", "mp4"
],
+ commentary: [
+ "true", "false", "translated", "untranslated"
+ ],
disapproved: Autocomplete.DISAPPROVAL_REASONS
}
diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb
index cd0d2bad3..0c247a92d 100644
--- a/app/logical/post_query_builder.rb
+++ b/app/logical/post_query_builder.rb
@@ -27,6 +27,7 @@ class PostQueryBuilder
-ordfav ordfav
-favgroup favgroup
-pool pool ordpool
+ -commentary commentary
-id id
-rating rating
-locked locked
@@ -186,6 +187,21 @@ class PostQueryBuilder
relation
end
+ def commentary_matches(query)
+ case query
+ when "none", "false"
+ Post.where.not(artist_commentary: ArtistCommentary.all).or(Post.where(artist_commentary: ArtistCommentary.deleted))
+ when "any", "true"
+ Post.where(artist_commentary: ArtistCommentary.undeleted)
+ when "translated"
+ Post.where(artist_commentary: ArtistCommentary.translated)
+ when "untranslated"
+ Post.where(artist_commentary: ArtistCommentary.untranslated)
+ else
+ Post.where(artist_commentary: ArtistCommentary.text_matches(query))
+ end
+ end
+
def table_for_metatag(metatag)
if metatag.in?(COUNT_METATAGS)
metatag[/(?
[a-z]+)_count\z/i, :table]
@@ -346,6 +362,14 @@ class PostQueryBuilder
end
end
+ q[:commentary_neg].to_a.each do |query|
+ relation = relation.merge(commentary_matches(query).negate)
+ end
+
+ q[:commentary].to_a.each do |query|
+ relation = relation.merge(commentary_matches(query))
+ end
+
if q[:saved_searches]
relation = add_saved_search_relation(q[:saved_searches], relation)
end
@@ -731,8 +755,8 @@ class PostQueryBuilder
class_methods do
def scan_query(query, strip_metatags: false)
tagstr = query.to_s.gsub(/\u3000/, " ").strip
- list = tagstr.scan(/-?source:".*?"/) || []
- list += tagstr.gsub(/-?source:".*?"/, "").scan(/[^[:space:]]+/).uniq
+ list = tagstr.scan(/-?(?:source|commentary):".*?"/) || []
+ list += tagstr.gsub(/-?(?:source|commentary):".*?"/, "").scan(/[^[:space:]]+/).uniq
list = list.map { |tag| tag.sub(/^[-~]/, "") } if strip_metatags
list
end
@@ -867,6 +891,14 @@ class PostQueryBuilder
q[:ordfav] ||= []
q[:ordfav] << g2
+ when "-commentary"
+ q[:commentary_neg] ||= []
+ q[:commentary_neg] << g2.gsub(/\A"(.*)"\Z/, '\1')
+
+ when "commentary"
+ q[:commentary] ||= []
+ q[:commentary] << g2.gsub(/\A"(.*)"\Z/, '\1')
+
when "search"
q[:saved_searches] ||= []
q[:saved_searches] << g2
diff --git a/app/models/artist_commentary.rb b/app/models/artist_commentary.rb
index 3b1c62d1f..64cf215a9 100644
--- a/app/models/artist_commentary.rb
+++ b/app/models/artist_commentary.rb
@@ -11,6 +11,15 @@ class ArtistCommentary < ApplicationRecord
after_save :create_version
after_commit :tag_post
+ scope :original_absent, -> { where(original_title: "").where(original_description: "") }
+ scope :original_present, -> { where.not(original_title: "").or(where.not(original_description: "")) }
+ scope :translation_absent, -> { where(translated_title: "").where(translated_description: "") }
+ scope :translation_present, -> { where.not(translated_title: "").or(where.not(translated_description: "")) }
+ scope :translated, -> { original_present.translation_present }
+ scope :untranslated, -> { original_present.translation_absent }
+ scope :deleted, -> { original_absent.translation_absent }
+ scope :undeleted, -> { original_present.or(translation_present) }
+
module SearchMethods
def text_matches(query)
query = "*#{query}*" unless query =~ /\*/
@@ -21,14 +30,6 @@ class ArtistCommentary < ApplicationRecord
.or(where_ilike(:translated_description, query))
end
- def deleted
- where(original_title: "", original_description: "", translated_title: "", translated_description: "")
- end
-
- def undeleted
- where("original_title != '' OR original_description != '' OR translated_title != '' OR translated_description != ''")
- end
-
def search(params)
q = super
diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb
index fc0e944e1..d5d793e8e 100644
--- a/test/unit/post_test.rb
+++ b/test/unit/post_test.rb
@@ -2228,6 +2228,32 @@ class PostTest < ActiveSupport::TestCase
assert_tag_match([], "commentaryupdater:none")
end
+ should "return posts for the commentary: metatag" do
+ post1 = create(:post)
+ post2 = create(:post)
+ post3 = create(:post)
+ post4 = create(:post)
+
+ artcomm1 = create(:artist_commentary, post: post1, translated_title: "azur lane")
+ artcomm2 = create(:artist_commentary, post: post2, translated_title: "", translated_description: "")
+ artcomm3 = create(:artist_commentary, post: post3, original_title: "", original_description: "", translated_title: "", translated_description: "")
+
+ assert_tag_match([post2, post1], "commentary:true")
+ assert_tag_match([post4, post3], "commentary:false")
+
+ assert_tag_match([post4, post3], "-commentary:true")
+ assert_tag_match([post2, post1], "-commentary:false")
+
+ assert_tag_match([post1], "commentary:translated")
+ assert_tag_match([post4, post3, post2], "-commentary:translated")
+
+ assert_tag_match([post2], "commentary:untranslated")
+ assert_tag_match([post4, post3, post1], "-commentary:untranslated")
+
+ assert_tag_match([post1], 'commentary:"azur lane"')
+ assert_tag_match([post4, post3, post2], '-commentary:"azur lane"')
+ end
+
should "return posts for the date: metatag" do
post = FactoryBot.create(:post, created_at: Time.parse("2017-01-01 12:00"))