diff --git a/app/controllers/artists_controller.rb b/app/controllers/artists_controller.rb index 1bdef22c1..f297491fd 100644 --- a/app/controllers/artists_controller.rb +++ b/app/controllers/artists_controller.rb @@ -21,7 +21,7 @@ class ArtistsController < ApplicationController @artist = Artist.find(params[:id]) if @artist - @posts = Danbooru.config.select_posts_visible_to_user(CurrentUser.user, Post.find_by_tags(@artist.name, :limit => 6)) + @posts = Danbooru.config.select_posts_visible_to_user(CurrentUser.user, Post.tag_match(@artist.name).limit(6)) end respond_with(@artist) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 5c83f3d84..b5081473c 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -30,7 +30,7 @@ class CommentsController < ApplicationController private def index_by_post - @posts = Post.find_by_tags(params[:tags]).commented_before(params[:before_date] || Time.now).limit(8) + @posts = Post.tag_match(params[:tags]).commented_before(params[:before_date] || Time.now).limit(8) respond_with(@posts) do |format| format.html {render :action => "index_by_post"} end diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index ee7f91bc1..837d15c27 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -51,7 +51,7 @@ module PostSets def load_posts @count = Post.fast_count(tags) - @posts = Post.find_by_tags(tags, :before_id => before_id).all(:order => "posts.id desc", :limit => limit, :offset => offset) + @posts = Post.tag_match(tags).before_id(before_id).all(:order => "posts.id desc", :limit => limit, :offset => offset) end def load_suggestions diff --git a/app/logical/related_tag_calculator.rb b/app/logical/related_tag_calculator.rb index 44ccc59bd..695cb712a 100644 --- a/app/logical/related_tag_calculator.rb +++ b/app/logical/related_tag_calculator.rb @@ -1,6 +1,6 @@ class RelatedTagCalculator def self.find_tags(tag, limit) - Post.find_by_tags(tag, :limit => limit, :select => "posts.tag_string", :order => "posts.md5").map(&:tag_string) + Post.tag_match(tag).limit(limit).select("posts.tag_string").order("posts.md5").map(&:tag_string) end def self.calculate_from_sample_to_array(tags, category_constraint = nil) diff --git a/app/models/artist.rb b/app/models/artist.rb index 8a597e0d9..2048af396 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -159,7 +159,7 @@ class Artist < ActiveRecord::Base Artist.new.tap do |artist| if params[:name] artist.name = params[:name] - post = Post.find_by_tags("source:http* #{artist.name}").first + post = Post.tag_match("source:http* #{artist.name}").first unless post.nil? || post.source.blank? artist.url_string = post.source end diff --git a/app/models/post.rb b/app/models/post.rb index 30489bfeb..5e3305054 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -30,6 +30,8 @@ class Post < ActiveRecord::Base scope :commented_before, lambda {|date| where("last_commented_at < ?", date).order("last_commented_at DESC")} scope :available_for_moderation, lambda {where(["id NOT IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])} scope :hidden_from_moderation, lambda {where(["id IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])} + scope :before_id, lambda {|id| where(["posts.id < ?", options[:before_id]])} + scope :tag_match, lambda {|query| Post.tag_match_helper(query)} module FileMethods def delete_files @@ -463,15 +465,15 @@ class Post < ActiveRecord::Base relation end - def find_by_tags(q, options = {}) + def tag_match_helper(q) unless q.is_a?(Hash) q = Tag.parse_query(q) end if q[:status] == "deleted" - relation = RemovedPost.where("TRUE") + relation = RemovedPost.scoped else - relation = where("TRUE") + relation = Post.scoped end relation = add_range_relation(q[:post_id], "posts.id", relation) @@ -487,10 +489,6 @@ class Post < ActiveRecord::Base relation = add_range_relation(q[:character_tag_count], "posts.tag_count_character", relation) relation = add_range_relation(q[:tag_count], "posts.tag_count", relation) - if options[:before_id] - relation = relation.where(["posts.id < ?", options[:before_id]]) - end - if q[:md5].any? relation = relation.where(["posts.md5 IN (?)", q[:md5]]) end @@ -564,18 +562,6 @@ class Post < ActiveRecord::Base relation = relation.order("posts.id DESC") end - if options[:limit] - relation = relation.limit(options[:limit]) - end - - if options[:offset] - relation = relation.offset(options[:offset]) - end - - if options[:select] - relation = relation.select(options[:select]) - end - relation end end @@ -649,7 +635,7 @@ class Post < ActiveRecord::Base tags = tags.to_s count = Cache.get("pfc:#{Cache.sanitize(tags)}") if count.nil? - count = Post.find_by_tags("#{tags}").count + count = Post.tag_match("#{tags}").count if count > Danbooru.config.posts_per_page * 10 Cache.put("pfc:#{Cache.sanitize(tags)}", count, (count * 4).minutes) end diff --git a/app/models/removed_post.rb b/app/models/removed_post.rb index e4b10423d..740595334 100644 --- a/app/models/removed_post.rb +++ b/app/models/removed_post.rb @@ -13,7 +13,7 @@ class RemovedPost < ActiveRecord::Base def fast_count(tags) count = Cache.get("rpfc:#{Cache.sanitize(tags)}") if count.nil? - count = RemovedPost.find_by_tags("#{tags}").count + count = RemovedPost.tag_match("#{tags}").count if count > Danbooru.config.posts_per_page * 10 Cache.put("rpfc:#{Cache.sanitize(tags)}", count, (count * 4).minutes) end diff --git a/app/models/tag.rb b/app/models/tag.rb index 2dbbde8c2..503057af9 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -109,7 +109,7 @@ class Tag < ActiveRecord::Base module UpdateMethods def mass_edit(start_tags, result_tags, updater_id, updater_ip_addr) updater = User.find(updater_id) - Post.find_by_tags(start_tags).each do |p| + Post.tag_match(start_tags).each do |p| start = TagAlias.to_aliased(scan_tags(start_tags)) result = TagAlias.to_aliased(scan_tags(result_tags)) tags = (p.tag_array - start + result).join(" ") diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index b72cdfc7e..ac4073bfd 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -52,7 +52,7 @@ class TagAlias < ActiveRecord::Base end def update_posts - Post.find_by_tags(antecedent_name).find_each do |post| + Post.tag_match(antecedent_name).find_each do |post| escaped_antecedent_name = Regexp.escape(antecedent_name) fixed_tags = post.tag_string.sub(/(?:\A| )#{escaped_antecedent_name}(?:\Z| )/, " #{consequent_name} ").strip diff --git a/app/models/tag_implication.rb b/app/models/tag_implication.rb index f264dfd58..17966d9e8 100644 --- a/app/models/tag_implication.rb +++ b/app/models/tag_implication.rb @@ -110,7 +110,7 @@ class TagImplication < ActiveRecord::Base end def update_posts - Post.find_by_tags(antecedent_name).find_each do |post| + Post.tag_match(antecedent_name).find_each do |post| escaped_antecedent_name = Regexp.escape(antecedent_name) fixed_tags = post.tag_string.sub(/(?:\A| )#{escaped_antecedent_name}(?:\Z| )/, " #{antecedent_name} #{descendant_names} ").strip post.update_attributes( diff --git a/app/models/tag_subscription.rb b/app/models/tag_subscription.rb index e05d7c1f9..998123b61 100644 --- a/app/models/tag_subscription.rb +++ b/app/models/tag_subscription.rb @@ -24,7 +24,7 @@ class TagSubscription < ActiveRecord::Base def process post_ids = tag_query_array.inject([]) do |all, tag| - all += Post.find_by_tags(tag, :limit => Danbooru.config.tag_subscription_post_limit / 3, :select => "posts.id", :order => "posts.id desc").map(&:id) + all += Post.tag_match(tag).limit(Danbooru.config.tag_subscription_post_limit / 3).select("posts.id").order("posts.id desc").map(&:id) end self.post_ids = post_ids.sort.reverse.slice(0, Danbooru.config.tag_subscription_post_limit).join(",") end diff --git a/test/functional/posts_controller_test.rb b/test/functional/posts_controller_test.rb index ffed8eb14..b664725ea 100644 --- a/test/functional/posts_controller_test.rb +++ b/test/functional/posts_controller_test.rb @@ -3,103 +3,13 @@ require "test_helper" class PostsControllerTest < ActionController::TestCase context "The posts controller" do setup do - @users = {} - @users[:anon] = AnonymousUser.new - @users[:member] = Factory.create(:user) - CurrentUser.user = @users[:member] - CurrentUser.ip_addr = "127.0.0.1" - @users[:banned] = Factory.create(:banned_user) - @users[:priv] = Factory.create(:privileged_user) - @users[:contrib] = Factory.create(:contributor_user) - @users[:janitor] = Factory.create(:janitor_user) - @users[:mod] = Factory.create(:moderator_user) - @users[:admin] = Factory.create(:admin_user) end teardown do - @users = nil - CurrentUser.user = nil - CurrentUser.ip_addr = nil end - context "new action" do - should "render" do - get :new, {}, {:user_id => @users[:member]} - assert_response :success - end - end - - context "create action" do - should "create a post" do - post :create, {:post => {:source => "", :file => upload_jpeg("#{Rails.root}/test/files/test.jpg"), :tag_string => "hoge", :rating => "s"}}, {:user_id => @users[:member].id} - p = Post.last - assert_equal("hoge", p.tag_string) - assert_equal("jpg", p.file_ext) - assert_equal("s", p.rating) - assert_equal("uploader:#{@users[:member].name}", p.uploader_string) - assert_equal(true, File.exists?(p.file_path)) - assert_equal(true, File.exists?(p.preview_path)) - end - end - - context "update action" do - setup do - @p1 = Factory.create(:post, :tag_string => "hoge") - end + context "index action" do - should "update a post" do - put :update, {:post => {:tags => "moge", :rating => "Explicit"}, :id => @p1.id}, {:user_id => @users[:member].id} - @p1.reload - assert_equal("moge", p1.cached_tags) - assert_equal("e", p1.rating) - - assert_equal(2, p1.tag_history.size) - post :update, {:post => {:rating => "Safe"}, :id => p1.id}, {:user_id => 3} - assert_equal(3, p1.tag_history.size) - - p1.update_attribute(:is_rating_locked, true) - post :update, {:post => {:rating => "Questionable"}, :id => p1.id}, {:user_id => 3} - p1.reload - assert_equal("s", p1.rating) - end end - - should "update a post" do - end - - should "list posts" do - get :index, {}, {:user_id => 3} - assert_response :success - - get :index, {:tags => "tag1"}, {:user_id => 3} - assert_response :success - - get :index, {:format => "json"}, {:user_id => 3} - assert_response :success - - get :index, {:format => "xml"}, {:user_id => 3} - assert_response :success - - get :index, {:tags => "-tag1"}, {:user_id => 3} - assert_response :success - end - - should "list posts through an atom feed" do - get :atom, {}, {:user_id => 3} - assert_response :success - - get :atom, {:tags => "tag1"}, {:user_id => 3} - assert_response :success - end - - should "display a post" do - get :show, {:id => 1}, {:user_id => 3} - assert_response :success - end - end - - def test_popular - get :popular_by_day, {}, {:user_id => 3} - assert_response :success end end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 1a16a024e..dee5ab65f 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -417,7 +417,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :tag_string => "aaa") post2 = Factory.create(:post, :tag_string => "aaa bbb") post3 = Factory.create(:post, :tag_string => "bbb ccc") - relation = Post.find_by_tags("aaa") + relation = Post.tag_match("aaa") assert_equal(2, relation.count) assert_equal(post2.id, relation.all[0].id) assert_equal(post1.id, relation.all[1].id) @@ -427,7 +427,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :tag_string => "aaa") post2 = Factory.create(:post, :tag_string => "aaa bbb") post3 = Factory.create(:post, :tag_string => "bbb ccc") - relation = Post.find_by_tags("aaa bbb") + relation = Post.tag_match("aaa bbb") assert_equal(1, relation.count) assert_equal(post2.id, relation.first.id) end @@ -436,7 +436,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :tag_string => "aaa") post2 = Factory.create(:post, :tag_string => "aaa bbb") post3 = Factory.create(:post, :tag_string => "bbb ccc") - relation = Post.find_by_tags("aaa -bbb") + relation = Post.tag_match("aaa -bbb") assert_equal(1, relation.count) assert_equal(post1.id, relation.first.id) end @@ -445,7 +445,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :tag_string => "aaa") post2 = Factory.create(:post, :tag_string => "aaab bbb") post3 = Factory.create(:post, :tag_string => "bbb ccc") - relation = Post.find_by_tags("a*") + relation = Post.tag_match("a*") assert_equal(2, relation.count) assert_equal(post2.id, relation.all[0].id) assert_equal(post1.id, relation.all[1].id) @@ -455,7 +455,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :tag_string => "aaa") post2 = Factory.create(:post, :tag_string => "aaab bbb") post3 = Factory.create(:post, :tag_string => "bbb ccc") - relation = Post.find_by_tags("a* bbb") + relation = Post.tag_match("a* bbb") assert_equal(1, relation.count) assert_equal(post2.id, relation.first.id) end @@ -464,13 +464,13 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post) post2 = Factory.create(:post) post3 = Factory.create(:post) - relation = Post.find_by_tags("id:#{post2.id}") + relation = Post.tag_match("id:#{post2.id}") assert_equal(1, relation.count) assert_equal(post2.id, relation.first.id) - relation = Post.find_by_tags("id:>#{post2.id}") + relation = Post.tag_match("id:>#{post2.id}") assert_equal(1, relation.count) assert_equal(post3.id, relation.first.id) - relation = Post.find_by_tags("id:<#{post2.id}") + relation = Post.tag_match("id:<#{post2.id}") assert_equal(1, relation.count) assert_equal(post1.id, relation.first.id) end @@ -481,7 +481,7 @@ class PostTest < ActiveSupport::TestCase post3 = Factory.create(:post) user = Factory.create(:user) post1.add_favorite(user) - relation = Post.find_by_tags("fav:#{user.name}") + relation = Post.tag_match("fav:#{user.name}") assert_equal(1, relation.count) assert_equal(post1.id, relation.first.id) end @@ -492,7 +492,7 @@ class PostTest < ActiveSupport::TestCase post3 = Factory.create(:post) pool = Factory.create(:pool) post1.add_pool(pool) - relation = Post.find_by_tags("pool:#{pool.name}") + relation = Post.tag_match("pool:#{pool.name}") assert_equal(1, relation.count) assert_equal(post1.id, relation.first.id) end @@ -506,7 +506,7 @@ class PostTest < ActiveSupport::TestCase post3 = Factory.create(:post) end - relation = Post.find_by_tags("uploader:#{CurrentUser.user.name}") + relation = Post.tag_match("uploader:#{CurrentUser.user.name}") assert_equal(1, relation.count) assert_equal(post1.id, relation.first.id) end @@ -515,7 +515,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :md5 => "abcd") post2 = Factory.create(:post) post3 = Factory.create(:post) - relation = Post.find_by_tags("md5:abcd") + relation = Post.tag_match("md5:abcd") assert_equal(1, relation.count) assert_equal(post1.id, relation.first.id) end @@ -524,7 +524,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :source => "abcd") post2 = Factory.create(:post, :source => "abcdefg") post3 = Factory.create(:post, :source => "xyz") - relation = Post.find_by_tags("source:abcde") + relation = Post.tag_match("source:abcde") assert_equal(1, relation.count) assert_equal(post2.id, relation.first.id) end @@ -535,7 +535,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :rating => "s") post2 = Factory.create(:post, :rating => "q") post3 = Factory.create(:post, :rating => "e") - relation = Post.find_by_tags("rating:e") + relation = Post.tag_match("rating:e") assert_equal(1, relation.count) assert_equal(post3.id, relation.first.id) end @@ -544,7 +544,7 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :rating => "s") post2 = Factory.create(:post, :rating => "s") post3 = Factory.create(:post, :rating => "e") - relation = Post.find_by_tags("-rating:s") + relation = Post.tag_match("-rating:s") assert_equal(1, relation.count) assert_equal(post3.id, relation.first.id) end @@ -553,11 +553,11 @@ class PostTest < ActiveSupport::TestCase post1 = Factory.create(:post, :rating => "s") post2 = Factory.create(:post, :rating => "s") post3 = Factory.create(:post, :rating => "e", :score => 5, :image_width => 1000) - relation = Post.find_by_tags("order:id") + relation = Post.tag_match("order:id") assert_equal(post1.id, relation.first.id) - relation = Post.find_by_tags("order:mpixels") + relation = Post.tag_match("order:mpixels") assert_equal(post3.id, relation.first.id) - relation = Post.find_by_tags("order:landscape") + relation = Post.tag_match("order:landscape") assert_equal(post3.id, relation.first.id) end end