Merge pull request #162 from kytrinyx/projects-stats

Extract duplicate top projects query from stats controller
This commit is contained in:
Matt Rogers 2013-03-01 21:58:34 -08:00
commit 3365b7e79f
2 changed files with 41 additions and 29 deletions

View file

@ -476,35 +476,8 @@ class StatsController < ApplicationController
end
def get_stats_projects
# get the first 10 projects and their action count (all actions)
#
# Went from GROUP BY p.id to p.name for compatibility with postgresql. Since
# the name is forced to be unique, this should work.
@projects_and_actions = current_user.projects.find_by_sql(
"SELECT p.id, p.name, count(*) AS count "+
"FROM projects p, todos t "+
"WHERE p.id = t.project_id "+
"AND t.user_id=#{current_user.id} " +
"GROUP BY p.id, p.name "+
"ORDER BY count DESC " +
"LIMIT 10"
)
# get the first 10 projects with their actions count of actions that have
# been created or completed the past 30 days
# using GROUP BY p.name (was: p.id) for compatibility with Postgresql. Since
# you cannot create two contexts with the same name, this will work.
@projects_and_actions_last30days = current_user.projects.find_by_sql([
"SELECT p.id, p.name, count(*) AS count "+
"FROM todos t, projects p "+
"WHERE t.project_id = p.id AND "+
" (t.created_at > ? OR t.completed_at > ?) "+
"AND t.user_id=#{current_user.id} " +
"GROUP BY p.id, p.name "+
"ORDER BY count DESC " +
"LIMIT 10", @cut_off_month, @cut_off_month]
)
@projects_and_actions = Stats::TopProjectsQuery.new(current_user).result
@projects_and_actions_last30days = Stats::TopProjectsQuery.new(current_user, @cut_off_month).result
# get the first 10 projects and their running time (creation date versus
# now())

View file

@ -0,0 +1,39 @@
# Get the first 10 projects with their actions count of actions.
# When a cutoff is passed in, only actions that have been created
# or completed since that cutoff will be included.
module Stats
class TopProjectsQuery
attr_reader :user, :cutoff
def initialize(user, cutoff = nil)
@user = user
@cutoff = cutoff
end
def result
user.projects.find_by_sql(query_options)
end
private
def query_options
options = [sql, user.id]
options += [cutoff, cutoff] if cutoff
options
end
def sql
query = "SELECT p.id, p.name, count(p.id) AS count "
query << "FROM todos t, projects p "
query << "WHERE t.project_id = p.id "
query << "AND t.user_id= ? "
if cutoff
query << "AND (t.created_at > ? OR t.completed_at > ?) "
end
query << "GROUP BY p.id, p.name "
query << "ORDER BY count DESC "
query << "LIMIT 10"
end
end
end