PERF: Don't display days ago on timeline for megatopics.
Analysis using `pg_stat_statements` showed this query to be eating up a significant portion of CPU.
This commit is contained in:
parent
cbdab71179
commit
9c925a66ff
|
@ -151,8 +151,14 @@ createWidget("timeline-scrollarea", {
|
||||||
const current = clamp(Math.floor(total * percentage) + 1, 1, total);
|
const current = clamp(Math.floor(total * percentage) + 1, 1, total);
|
||||||
|
|
||||||
const daysAgo = postStream.closestDaysAgoFor(current);
|
const daysAgo = postStream.closestDaysAgoFor(current);
|
||||||
const date = new Date();
|
let date;
|
||||||
date.setDate(date.getDate() - daysAgo || 0);
|
|
||||||
|
if (daysAgo !== null) {
|
||||||
|
date = new Date();
|
||||||
|
date.setDate(date.getDate() - daysAgo || 0);
|
||||||
|
} else {
|
||||||
|
date = null;
|
||||||
|
}
|
||||||
|
|
||||||
const result = {
|
const result = {
|
||||||
current,
|
current,
|
||||||
|
|
|
@ -372,9 +372,18 @@ class TopicView
|
||||||
# Returns an array of [id, post_number, days_ago] tuples.
|
# Returns an array of [id, post_number, days_ago] tuples.
|
||||||
# `days_ago` is there for the timeline calculations.
|
# `days_ago` is there for the timeline calculations.
|
||||||
def filtered_post_stream
|
def filtered_post_stream
|
||||||
@filtered_post_stream ||= @filtered_posts
|
@filtered_post_stream ||= begin
|
||||||
.order(:sort_order)
|
posts = @filtered_posts
|
||||||
.pluck(:id, :post_number, 'EXTRACT(DAYS FROM CURRENT_TIMESTAMP - created_at)::INT AS days_ago')
|
.order(:sort_order)
|
||||||
|
|
||||||
|
columns = [:id, :post_number]
|
||||||
|
|
||||||
|
if is_mega_topic?
|
||||||
|
columns << 'EXTRACT(DAYS FROM CURRENT_TIMESTAMP - created_at)::INT AS days_ago'
|
||||||
|
end
|
||||||
|
|
||||||
|
posts.pluck(*columns)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def filtered_post_ids
|
def filtered_post_ids
|
||||||
|
@ -554,4 +563,7 @@ class TopicView
|
||||||
filtered_post_ids.index(closest_post.first) || filtered_post_ids[0]
|
filtered_post_ids.index(closest_post.first) || filtered_post_ids[0]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def is_mega_topic?
|
||||||
|
!@topic.private_message? && @topic.posts_count >= SiteSetting.auto_close_topics_post_count
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -549,4 +549,30 @@ describe TopicView do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#filtered_post_stream' do
|
||||||
|
let!(:post) { Fabricate(:post, topic: topic, user: first_poster) }
|
||||||
|
let!(:post2) { Fabricate(:post, topic: topic, user: evil_trout) }
|
||||||
|
let!(:post3) { Fabricate(:post, topic: topic, user: first_poster) }
|
||||||
|
|
||||||
|
it 'should return the right columns' do
|
||||||
|
expect(topic_view.filtered_post_stream).to eq([
|
||||||
|
[post.id, post.post_number, 0],
|
||||||
|
[post2.id, post2.post_number, 0],
|
||||||
|
[post3.id, post3.post_number, 0]
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'for mega topics' do
|
||||||
|
it 'should return the right columns' do
|
||||||
|
SiteSetting.auto_close_topics_post_count = 2
|
||||||
|
|
||||||
|
expect(topic_view.filtered_post_stream).to eq([
|
||||||
|
[post.id, post.post_number],
|
||||||
|
[post2.id, post2.post_number],
|
||||||
|
[post3.id, post3.post_number]
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue