mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
Extract methods to improve flog score of TopicView
This commit is contained in:
parent
879652f055
commit
2ea15adad9
|
@ -14,13 +14,14 @@ class TopicView
|
||||||
@guardian = Guardian.new(@user)
|
@guardian = Guardian.new(@user)
|
||||||
check_and_raise_exceptions
|
check_and_raise_exceptions
|
||||||
|
|
||||||
@post_number, @page = options[:post_number], options[:page].to_i
|
options.each do |key, value|
|
||||||
@page = 1 if @page == 0
|
self.instance_variable_set("@#{key}".to_sym, value)
|
||||||
|
end
|
||||||
|
|
||||||
|
@page = @page.to_i
|
||||||
|
@page = 1 if @page.zero?
|
||||||
|
@limit ||= SiteSetting.posts_per_page
|
||||||
|
|
||||||
@limit = options[:limit] || SiteSetting.posts_per_page;
|
|
||||||
@username_filters = options[:username_filters]
|
|
||||||
@best = options[:best]
|
|
||||||
@filter = options[:filter]
|
|
||||||
setup_filtered_posts
|
setup_filtered_posts
|
||||||
|
|
||||||
@initial_load = true
|
@initial_load = true
|
||||||
|
@ -112,34 +113,11 @@ class TopicView
|
||||||
# Filter to all posts near a particular post number
|
# Filter to all posts near a particular post number
|
||||||
def filter_posts_near(post_number)
|
def filter_posts_near(post_number)
|
||||||
|
|
||||||
# Find the closest number we have
|
min_idx, max_idx = get_minmax_ids(post_number)
|
||||||
closest_post_id = @filtered_posts.order("@(post_number - #{post_number})").first.try(:id)
|
|
||||||
return nil if closest_post_id.blank?
|
|
||||||
|
|
||||||
closest_index = filtered_post_ids.index(closest_post_id)
|
|
||||||
return nil if closest_index.blank?
|
|
||||||
|
|
||||||
# Make sure to get at least one post before, even with rounding
|
|
||||||
posts_before = (SiteSetting.posts_per_page.to_f / 4).floor
|
|
||||||
posts_before = 1 if posts_before == 0
|
|
||||||
|
|
||||||
min_idx = closest_index - posts_before
|
|
||||||
min_idx = 0 if min_idx < 0
|
|
||||||
max_idx = min_idx + (SiteSetting.posts_per_page - 1)
|
|
||||||
|
|
||||||
# Get a full page even if at the end
|
|
||||||
upper_limit = (filtered_post_ids.length - 1)
|
|
||||||
if max_idx >= upper_limit
|
|
||||||
max_idx = upper_limit
|
|
||||||
min_idx = (upper_limit - SiteSetting.posts_per_page) + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
filter_posts_in_range(min_idx, max_idx)
|
filter_posts_in_range(min_idx, max_idx)
|
||||||
end
|
end
|
||||||
|
|
||||||
def filtered_post_ids
|
|
||||||
@filtered_post_ids ||= @filtered_posts.order(:sort_order).pluck(:id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def filter_posts_paged(page)
|
def filter_posts_paged(page)
|
||||||
page = [page, 1].max
|
page = [page, 1].max
|
||||||
|
@ -149,7 +127,6 @@ class TopicView
|
||||||
filter_posts_in_range(min, max)
|
filter_posts_in_range(min, max)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def filter_best(max, opts={})
|
def filter_best(max, opts={})
|
||||||
filter = FilterBestPosts.new(@topic, @filtered_posts, max, opts)
|
filter = FilterBestPosts.new(@topic, @filtered_posts, max, opts)
|
||||||
@posts = filter.posts
|
@posts = filter.posts
|
||||||
|
@ -224,6 +201,10 @@ class TopicView
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def filtered_post_ids
|
||||||
|
@filtered_post_ids ||= filter_post_ids_by(:sort_order)
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def read_posts_set
|
def read_posts_set
|
||||||
|
@ -293,4 +274,42 @@ class TopicView
|
||||||
guardian.ensure_can_see!(@topic)
|
guardian.ensure_can_see!(@topic)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def filter_post_ids_by(sort_order)
|
||||||
|
@filtered_posts.order(sort_order).pluck(:id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_minmax_ids(post_number)
|
||||||
|
# Find the closest number we have
|
||||||
|
closest_index = closest_post_to(post_number)
|
||||||
|
return nil if closest_index.nil?
|
||||||
|
|
||||||
|
# Make sure to get at least one post before, even with rounding
|
||||||
|
posts_before = (SiteSetting.posts_per_page.to_f / 4).floor
|
||||||
|
posts_before = 1 if posts_before.zero?
|
||||||
|
|
||||||
|
min_idx = closest_index - posts_before
|
||||||
|
min_idx = 0 if min_idx < 0
|
||||||
|
max_idx = min_idx + (SiteSetting.posts_per_page - 1)
|
||||||
|
|
||||||
|
# Get a full page even if at the end
|
||||||
|
ensure_full_page(min_idx, max_idx)
|
||||||
|
end
|
||||||
|
|
||||||
|
def ensure_full_page(min, max)
|
||||||
|
upper_limit = (filtered_post_ids.length - 1)
|
||||||
|
if max >= upper_limit
|
||||||
|
return (upper_limit - SiteSetting.posts_per_page) + 1, upper_limit
|
||||||
|
else
|
||||||
|
return min, max
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def closest_post_to(post_number)
|
||||||
|
closest_posts = filter_post_ids_by("@(post_number - #{post_number})")
|
||||||
|
return nil if closest_posts.empty?
|
||||||
|
|
||||||
|
filtered_post_ids.index(closest_posts.first)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user