36 lines
1.1 KiB
Ruby
36 lines
1.1 KiB
Ruby
|
class TrendingProject < ActiveRecord::Base
|
||
|
belongs_to :project
|
||
|
|
||
|
# The number of months to include in the trending calculation.
|
||
|
MONTHS_TO_INCLUDE = 1
|
||
|
|
||
|
# The maximum number of projects to include in the trending set.
|
||
|
PROJECTS_LIMIT = 100
|
||
|
|
||
|
# Populates the trending projects table with the current list of trending
|
||
|
# projects.
|
||
|
def self.refresh!
|
||
|
# The calculation **must** run in a transaction. If the removal of data and
|
||
|
# insertion of new data were to run separately a user might end up with an
|
||
|
# empty list of trending projects for a short period of time.
|
||
|
transaction do
|
||
|
delete_all
|
||
|
|
||
|
timestamp = connection.quote(MONTHS_TO_INCLUDE.months.ago)
|
||
|
|
||
|
connection.execute <<-EOF.strip_heredoc
|
||
|
INSERT INTO #{table_name} (project_id)
|
||
|
SELECT project_id
|
||
|
FROM notes
|
||
|
INNER JOIN projects ON projects.id = notes.project_id
|
||
|
WHERE notes.created_at >= #{timestamp}
|
||
|
AND notes.system IS FALSE
|
||
|
AND projects.visibility_level = #{Gitlab::VisibilityLevel::PUBLIC}
|
||
|
GROUP BY project_id
|
||
|
ORDER BY count(*) DESC
|
||
|
LIMIT #{PROJECTS_LIMIT};
|
||
|
EOF
|
||
|
end
|
||
|
end
|
||
|
end
|