Merge pull request #4566 from tgxworld/fix_perf_redirect_to_top
Fix perf redirect to top
This commit is contained in:
commit
63a88ee6e7
|
@ -327,14 +327,20 @@ class ListController < ApplicationController
|
||||||
exclude_category_ids.pluck(:id)
|
exclude_category_ids.pluck(:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.best_period_for(previous_visit_at, category_id=nil)
|
def self.best_period_with_topics_for(previous_visit_at, category_id=nil)
|
||||||
best_periods_for(previous_visit_at).each do |period|
|
best_periods_for(previous_visit_at).each do |period|
|
||||||
top_topics = TopTopic.where("#{period}_score > 0")
|
top_topics = TopTopic.where("#{period}_score > 0")
|
||||||
top_topics = top_topics.joins(:topic).where("topics.category_id = ?", category_id) if category_id
|
top_topics = top_topics.joins(:topic).where("topics.category_id = ?", category_id) if category_id
|
||||||
return period if top_topics.count >= SiteSetting.topics_per_period_in_top_page
|
top_topics = top_topics.limit(SiteSetting.topics_per_period_in_top_page)
|
||||||
|
return period if top_topics.count == SiteSetting.topics_per_period_in_top_page
|
||||||
end
|
end
|
||||||
# default period is yearly
|
|
||||||
SiteSetting.top_page_default_timeframe.to_sym
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.best_period_for(previous_visit_at, category_id=nil)
|
||||||
|
best_period_with_topics_for(previous_visit_at, category_id) ||
|
||||||
|
SiteSetting.top_page_default_timeframe.to_sym
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.best_periods_for(date)
|
def self.best_periods_for(date)
|
||||||
|
|
|
@ -547,7 +547,9 @@ end
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# index_categories_on_email_in (email_in) UNIQUE
|
# index_categories_on_background_url (background_url)
|
||||||
# index_categories_on_topic_count (topic_count)
|
# index_categories_on_email_in (email_in) UNIQUE
|
||||||
# unique_index_categories_on_name (name) UNIQUE
|
# index_categories_on_logo_url (logo_url)
|
||||||
|
# index_categories_on_topic_count (topic_count)
|
||||||
|
# unique_index_categories_on_name (name) UNIQUE
|
||||||
#
|
#
|
||||||
|
|
|
@ -13,5 +13,7 @@ end
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# idx_unique_post_uploads (post_id,upload_id) UNIQUE
|
# idx_unique_post_uploads (post_id,upload_id) UNIQUE
|
||||||
|
# index_post_uploads_on_post_id (post_id)
|
||||||
|
# index_post_uploads_on_upload_id (upload_id)
|
||||||
#
|
#
|
||||||
|
|
|
@ -99,8 +99,8 @@ class SiteSetting < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.min_redirected_to_top_period(duration)
|
def self.min_redirected_to_top_period(duration)
|
||||||
period = ListController.best_period_for(duration)
|
period = ListController.best_period_with_topics_for(duration)
|
||||||
return period if TopTopic.topics_per_period(period) >= SiteSetting.topics_per_period_in_top_page
|
return period if period
|
||||||
|
|
||||||
# not enough topics
|
# not enough topics
|
||||||
nil
|
nil
|
||||||
|
|
|
@ -4,12 +4,6 @@ class TopTopic < ActiveRecord::Base
|
||||||
|
|
||||||
belongs_to :topic
|
belongs_to :topic
|
||||||
|
|
||||||
def self.topics_per_period(period)
|
|
||||||
DistributedMemoizer.memoize("#{Discourse.current_hostname}_topics_per_period_#{period}", 1.day) do
|
|
||||||
TopTopic.where("#{period}_score > 0").count
|
|
||||||
end.to_i
|
|
||||||
end
|
|
||||||
|
|
||||||
# The top topics we want to refresh often
|
# The top topics we want to refresh often
|
||||||
def self.refresh_daily!
|
def self.refresh_daily!
|
||||||
transaction do
|
transaction do
|
||||||
|
@ -52,6 +46,8 @@ class TopTopic < ActiveRecord::Base
|
||||||
all: 6)
|
all: 6)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
def self.sort_orders
|
def self.sort_orders
|
||||||
@@sort_orders ||= [:posts, :views, :likes, :op_likes].freeze
|
@@sort_orders ||= [:posts, :views, :likes, :op_likes].freeze
|
||||||
end
|
end
|
||||||
|
@ -224,10 +220,6 @@ class TopTopic < ActiveRecord::Base
|
||||||
AND tt.#{period}_#{sort}_count <> c.count",
|
AND tt.#{period}_#{sort}_count <> c.count",
|
||||||
from: start_of(period))
|
from: start_of(period))
|
||||||
end
|
end
|
||||||
|
|
||||||
private_class_method :sort_orders, :update_counts_and_compute_scores_for, :remove_invisible_topics,
|
|
||||||
:add_new_visible_topics, :update_posts_count_for, :update_views_count_for, :update_likes_count_for,
|
|
||||||
:compute_top_score_for, :start_of, :update_top_topics
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
|
@ -265,13 +257,16 @@ end
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
# index_top_topics_on_all_score (all_score)
|
||||||
# index_top_topics_on_daily_likes_count (daily_likes_count)
|
# index_top_topics_on_daily_likes_count (daily_likes_count)
|
||||||
# index_top_topics_on_daily_op_likes_count (daily_op_likes_count)
|
# index_top_topics_on_daily_op_likes_count (daily_op_likes_count)
|
||||||
# index_top_topics_on_daily_posts_count (daily_posts_count)
|
# index_top_topics_on_daily_posts_count (daily_posts_count)
|
||||||
|
# index_top_topics_on_daily_score (daily_score)
|
||||||
# index_top_topics_on_daily_views_count (daily_views_count)
|
# index_top_topics_on_daily_views_count (daily_views_count)
|
||||||
# index_top_topics_on_monthly_likes_count (monthly_likes_count)
|
# index_top_topics_on_monthly_likes_count (monthly_likes_count)
|
||||||
# index_top_topics_on_monthly_op_likes_count (monthly_op_likes_count)
|
# index_top_topics_on_monthly_op_likes_count (monthly_op_likes_count)
|
||||||
# index_top_topics_on_monthly_posts_count (monthly_posts_count)
|
# index_top_topics_on_monthly_posts_count (monthly_posts_count)
|
||||||
|
# index_top_topics_on_monthly_score (monthly_score)
|
||||||
# index_top_topics_on_monthly_views_count (monthly_views_count)
|
# index_top_topics_on_monthly_views_count (monthly_views_count)
|
||||||
# index_top_topics_on_quarterly_likes_count (quarterly_likes_count)
|
# index_top_topics_on_quarterly_likes_count (quarterly_likes_count)
|
||||||
# index_top_topics_on_quarterly_op_likes_count (quarterly_op_likes_count)
|
# index_top_topics_on_quarterly_op_likes_count (quarterly_op_likes_count)
|
||||||
|
@ -281,9 +276,11 @@ end
|
||||||
# index_top_topics_on_weekly_likes_count (weekly_likes_count)
|
# index_top_topics_on_weekly_likes_count (weekly_likes_count)
|
||||||
# index_top_topics_on_weekly_op_likes_count (weekly_op_likes_count)
|
# index_top_topics_on_weekly_op_likes_count (weekly_op_likes_count)
|
||||||
# index_top_topics_on_weekly_posts_count (weekly_posts_count)
|
# index_top_topics_on_weekly_posts_count (weekly_posts_count)
|
||||||
|
# index_top_topics_on_weekly_score (weekly_score)
|
||||||
# index_top_topics_on_weekly_views_count (weekly_views_count)
|
# index_top_topics_on_weekly_views_count (weekly_views_count)
|
||||||
# index_top_topics_on_yearly_likes_count (yearly_likes_count)
|
# index_top_topics_on_yearly_likes_count (yearly_likes_count)
|
||||||
# index_top_topics_on_yearly_op_likes_count (yearly_op_likes_count)
|
# index_top_topics_on_yearly_op_likes_count (yearly_op_likes_count)
|
||||||
# index_top_topics_on_yearly_posts_count (yearly_posts_count)
|
# index_top_topics_on_yearly_posts_count (yearly_posts_count)
|
||||||
|
# index_top_topics_on_yearly_score (yearly_score)
|
||||||
# index_top_topics_on_yearly_views_count (yearly_views_count)
|
# index_top_topics_on_yearly_views_count (yearly_views_count)
|
||||||
#
|
#
|
||||||
|
|
|
@ -1096,11 +1096,12 @@ end
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# idx_users_admin (id)
|
# idx_users_admin (id)
|
||||||
# idx_users_moderator (id)
|
# idx_users_moderator (id)
|
||||||
# index_users_on_auth_token (auth_token)
|
# index_users_on_auth_token (auth_token)
|
||||||
# index_users_on_last_posted_at (last_posted_at)
|
# index_users_on_last_posted_at (last_posted_at)
|
||||||
# index_users_on_last_seen_at (last_seen_at)
|
# index_users_on_last_seen_at (last_seen_at)
|
||||||
# index_users_on_username (username) UNIQUE
|
# index_users_on_uploaded_avatar_id (uploaded_avatar_id)
|
||||||
# index_users_on_username_lower (username_lower) UNIQUE
|
# index_users_on_username (username) UNIQUE
|
||||||
|
# index_users_on_username_lower (username_lower) UNIQUE
|
||||||
#
|
#
|
||||||
|
|
|
@ -105,5 +105,7 @@ end
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# index_user_avatars_on_user_id (user_id)
|
# index_user_avatars_on_custom_upload_id (custom_upload_id)
|
||||||
|
# index_user_avatars_on_gravatar_upload_id (gravatar_upload_id)
|
||||||
|
# index_user_avatars_on_user_id (user_id)
|
||||||
#
|
#
|
||||||
|
|
|
@ -124,4 +124,6 @@ end
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# index_user_profiles_on_bio_cooked_version (bio_cooked_version)
|
# index_user_profiles_on_bio_cooked_version (bio_cooked_version)
|
||||||
|
# index_user_profiles_on_card_background (card_background)
|
||||||
|
# index_user_profiles_on_profile_background (profile_background)
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
class AddScoresIndexesToTopTopics < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_index :top_topics, :daily_score
|
||||||
|
add_index :top_topics, :weekly_score
|
||||||
|
add_index :top_topics, :monthly_score
|
||||||
|
add_index :top_topics, :yearly_score
|
||||||
|
add_index :top_topics, :all_score
|
||||||
|
end
|
||||||
|
end
|
|
@ -76,7 +76,11 @@ describe SiteSetting do
|
||||||
before do
|
before do
|
||||||
SiteSetting.topics_per_period_in_top_page = 2
|
SiteSetting.topics_per_period_in_top_page = 2
|
||||||
SiteSetting.top_page_default_timeframe = 'daily'
|
SiteSetting.top_page_default_timeframe = 'daily'
|
||||||
TopTopic.stubs(:topics_per_period).with(:daily).returns(3)
|
|
||||||
|
2.times do
|
||||||
|
TopTopic.create!(daily_score: 2.5)
|
||||||
|
end
|
||||||
|
|
||||||
TopTopic.refresh!
|
TopTopic.refresh!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -91,7 +95,6 @@ describe SiteSetting do
|
||||||
before do
|
before do
|
||||||
SiteSetting.topics_per_period_in_top_page = 20
|
SiteSetting.topics_per_period_in_top_page = 20
|
||||||
SiteSetting.top_page_default_timeframe = 'daily'
|
SiteSetting.top_page_default_timeframe = 'daily'
|
||||||
TopTopic.stubs(:topics_per_period).with(:daily).returns(1)
|
|
||||||
TopTopic.refresh!
|
TopTopic.refresh!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue