related_tag_calculator.rb: fix memcache lookup in inner loop.
Remove the category constraint option from RelatedTagCalculator.calculate_from_posts. It slows things down and isn't used. This method is used to calculate the related tags sidebar during searches for single metatags. Using Tag.category_for in the inner loop caused a memcache call on every iteration. At 100 posts per page and 20-30 tags per post, this led to up to 2000-3000 total memcache calls, which significantly slowed pageloads.
This commit is contained in:
@@ -11,24 +11,15 @@ class RelatedTagCalculator
|
|||||||
convert_hash_to_array(calculate_from_sample(tags, Danbooru.config.post_sample_size, category_constraint))
|
convert_hash_to_array(calculate_from_sample(tags, Danbooru.config.post_sample_size, category_constraint))
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.calculate_from_post_set_to_array(post_set, category_constraint = nil)
|
def self.calculate_from_posts_to_array(posts)
|
||||||
convert_hash_to_array(calculate_from_post_set(post_set, category_constraint))
|
convert_hash_to_array(calculate_from_posts(posts))
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.calculate_from_post_set(post_set, category_constraint = nil)
|
def self.calculate_from_posts(posts)
|
||||||
counts = Hash.new {|h, k| h[k] = 0}
|
counts = Hash.new {|h, k| h[k] = 0}
|
||||||
|
|
||||||
post_set.posts.each do |post|
|
posts.flat_map(&:tag_array).each do |tag|
|
||||||
post.tag_array.each do |tag|
|
counts[tag] += 1
|
||||||
category = Tag.category_for(tag)
|
|
||||||
if category_constraint
|
|
||||||
if category == category_constraint
|
|
||||||
counts[tag] += 1
|
|
||||||
end
|
|
||||||
else
|
|
||||||
counts[tag] += 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
counts
|
counts
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
module PostSetPresenters
|
module PostSetPresenters
|
||||||
class Post < Base
|
class Post < Base
|
||||||
attr_accessor :post_set, :tag_set_presenter
|
attr_accessor :post_set
|
||||||
delegate :posts, :to => :post_set
|
delegate :posts, :to => :post_set
|
||||||
|
|
||||||
def initialize(post_set)
|
def initialize(post_set)
|
||||||
@post_set = post_set
|
@post_set = post_set
|
||||||
@tag_set_presenter = TagSetPresenter.new(related_tags)
|
end
|
||||||
|
|
||||||
|
def tag_set_presenter
|
||||||
|
@tag_set_presenter ||= TagSetPresenter.new(related_tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
def related_tags
|
def related_tags
|
||||||
@@ -51,7 +54,7 @@ module PostSetPresenters
|
|||||||
end
|
end
|
||||||
|
|
||||||
def calculate_related_tags_from_post_set
|
def calculate_related_tags_from_post_set
|
||||||
RelatedTagCalculator.calculate_from_post_set_to_array(post_set).map(&:first)
|
RelatedTagCalculator.calculate_from_posts_to_array(post_set.posts).map(&:first)
|
||||||
end
|
end
|
||||||
|
|
||||||
def saved_search_labels
|
def saved_search_labels
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ class RelatedTagCalculatorTest < ActiveSupport::TestCase
|
|||||||
FactoryGirl.create(:post, :tag_string => "aaa bbb ccc ddd")
|
FactoryGirl.create(:post, :tag_string => "aaa bbb ccc ddd")
|
||||||
FactoryGirl.create(:post, :tag_string => "aaa bbb ccc")
|
FactoryGirl.create(:post, :tag_string => "aaa bbb ccc")
|
||||||
FactoryGirl.create(:post, :tag_string => "aaa bbb")
|
FactoryGirl.create(:post, :tag_string => "aaa bbb")
|
||||||
@post_set = PostSets::Post.new("aaa")
|
@posts = Post.tag_match("aaa")
|
||||||
end
|
end
|
||||||
|
|
||||||
should "calculate the related tags" do
|
should "calculate the related tags" do
|
||||||
assert_equal({"aaa"=>3, "bbb"=>3, "ccc"=>2, "ddd"=>1}, RelatedTagCalculator.calculate_from_post_set(@post_set))
|
assert_equal({"aaa"=>3, "bbb"=>3, "ccc"=>2, "ddd"=>1}, RelatedTagCalculator.calculate_from_posts(@posts))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user