From 9c8e50351d07776eba5549fbfcb59e568562a348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 27 Dec 2013 18:10:35 +0100 Subject: [PATCH] first stab at calculating the score of a topic for the top tab --- app/controllers/list_controller.rb | 7 +++---- app/models/top_topic.rb | 19 +++++++++++++++++-- ...20131227164338_add_scores_to_top_topics.rb | 7 +++++++ lib/topic_query.rb | 7 +++---- 4 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 db/migrate/20131227164338_add_scores_to_top_topics.rb diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index 475322ce47e..e19fdefbc61 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -73,8 +73,7 @@ class ListController < ApplicationController end def top - sort_order = params[:sort_order] || "posts" - top = generate_top_lists_by(sort_order) + top = generate_top_lists respond_to do |format| format.html do @@ -179,7 +178,7 @@ class ListController < ApplicationController public_send(method, opts.merge(next_page_params(opts))) end - def generate_top_lists_by(sort_order) + def generate_top_lists top = {} topic_ids = Set.new @@ -188,7 +187,7 @@ class ListController < ApplicationController per_page: SiteSetting.topics_per_period_in_summary, except_topic_ids: topic_ids.to_a } - list = TopicQuery.new(current_user, options).list_top(sort_order, period) + list = TopicQuery.new(current_user, options).list_top_for(period) topic_ids.merge(list.topic_ids) top[period] = list end diff --git a/app/models/top_topic.rb b/app/models/top_topic.rb index e00ebeccb64..9a30df02297 100644 --- a/app/models/top_topic.rb +++ b/app/models/top_topic.rb @@ -20,12 +20,17 @@ class TopTopic < ActiveRecord::Base FROM topics WHERE deleted_at IS NULL AND visible - AND NOT archived") - # update all the counter caches + AND archetype <> :private_message + AND NOT archived", + private_message: Archetype::private_message) + TopTopic.periods.each do |period| + # update all the counter caches TopTopic.sort_orders.each do |sort| TopTopic.send("update_#{sort}_count_for", period) end + # compute top score + TopTopic.compute_top_score_for(period) end end end @@ -61,6 +66,16 @@ class TopTopic < ActiveRecord::Base TopTopic.update_top_topics(period, "likes", sql) end + def self.compute_top_score_for(period) + exec_sql("UPDATE top_topics + SET #{period}_score = log( + 1 + + (#{period}_posts_count) * + (#{period}_likes_count / 2.0 + 1.0) * + (#{period}_views_count / 100.0 + 1.0) + )") + end + def self.start_of(period) case period when :yearly then 1.year.ago diff --git a/db/migrate/20131227164338_add_scores_to_top_topics.rb b/db/migrate/20131227164338_add_scores_to_top_topics.rb new file mode 100644 index 00000000000..e8acad62b30 --- /dev/null +++ b/db/migrate/20131227164338_add_scores_to_top_topics.rb @@ -0,0 +1,7 @@ +class AddScoresToTopTopics < ActiveRecord::Migration + def change + TopTopic.periods.each do |period| + add_column :top_topics, "#{period}_score".to_sym, :float + end + end +end diff --git a/lib/topic_query.rb b/lib/topic_query.rb index a8c199dd147..b7064cf1d19 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -84,12 +84,11 @@ class TopicQuery create_list(:posted) {|l| l.where('tu.user_id IS NOT NULL') } end - def list_top(sort_order, period) - count = "#{period}_#{sort_order}_count" + def list_top_for(period) + score = "#{period}_score" create_list(:top, unordered: true) do |topics| topics.joins(:top_topic) - .where("top_topics.#{count} > 0") - .order("top_topics.#{count} DESC, topics.bumped_at DESC") + .order("top_topics.#{score} DESC, topics.bumped_at DESC") end end