Refactor:Replace Production Check with Average Metrics (#11096)

This commit is contained in:
Molly Struve 2020-11-12 11:03:10 -05:00 committed by GitHub
parent 025c5213d1
commit 40ecfd6f0f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 10 deletions

View file

@ -23,7 +23,7 @@ module Suggester
def tagged_article_user_ids(num_weeks = 1)
Article.published
.tagged_with(user.decorate.cached_followed_tag_names.sample(5), any: true)
.where("score > ? AND published_at > ?", article_reaction_count, num_weeks.weeks.ago)
.where("score >= ? AND published_at >= ?", article_score_average, num_weeks.weeks.ago)
.pluck(:user_id)
.each_with_object(Hash.new(0)) { |value, counts| counts[value] += 1 }
.sort_by { |_key, value| value }
@ -39,7 +39,7 @@ module Suggester
def recent_top_producers
relation = User.where(
"articles_count > ? AND comments_count > ?",
"articles_count >= ? AND comments_count >= ?",
established_user_article_count, established_user_comment_count
)
relation = relation.select(attributes_to_select) if attributes_to_select
@ -55,15 +55,21 @@ module Suggester
end
def established_user_article_count
Rails.env.production? ? 4 : -1
Rails.cache.fetch("established_user_article_count", expires_in: 1.day) do
User.where("articles_count > 0").average(:articles_count) || User.average(:articles_count)
end
end
def established_user_comment_count
Rails.env.production? ? 4 : -1
Rails.cache.fetch("established_user_comment_count", expires_in: 1.day) do
User.where("comments_count > 0").average(:comments_count) || User.average(:comments_count)
end
end
def article_reaction_count
Rails.env.production? ? 15 : -1
def article_score_average
Rails.cache.fetch("article_score_average", expires_in: 1.day) do
Article.where("score >= 0").average(:score) || Article.average(:score)
end
end
end
end

View file

@ -2,14 +2,36 @@ require "rails_helper"
RSpec.describe Suggester::Users::Recent, type: :service, vcr: {} do
let(:user) { create(:user) }
let(:suggester) { described_class.new(user) }
it "does not include calling user" do
create_list(:user, 3)
expect(described_class.new(user).suggest).not_to include(user)
expect(suggester.suggest).not_to include(user)
end
it "returns the same number created" do
create_list(:user, 3)
expect(described_class.new(user).suggest.size).to eq(3)
context "with cached_followed_tags" do
it "returns recent producers" do
articles = create_list(:article, 3, score: 10)
article = articles.last
article.update(score: 100)
allow(user).to receive(:decorate).and_return(user)
allow(user).to receive(:cached_followed_tag_names).and_return(["css"])
suggested_users = suggester.suggest
expect(suggested_users.size).to eq(1)
expect(suggested_users.map(&:id)).to include(article.user_id)
end
end
context "without cached_followed_tags" do
it "returns recent_commenters and recent top producers" do
productive_user = create(:user, comments_count: 1, articles_count: 1)
unproductive_user = create(:user, comments_count: 0, articles_count: 0)
suggested_users = suggester.suggest
expect(suggested_users.size).to eq(1)
expect(suggested_users.map(&:id)).to include(productive_user.id)
expect(suggested_users.map(&:id)).not_to include(unproductive_user.id)
end
end
end