summaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
authorEric Davis <edavis@littlestreamsoftware.com>2010-02-04 17:24:33 +0000
committerEric Davis <edavis@littlestreamsoftware.com>2010-02-04 17:24:33 +0000
commit5bd912e9a2601b00d564a475d37eafb8942cb687 (patch)
tree5ef5b3bebfc019216ebb819da4eb271f0d4b21f4 /app/models
parent112fc993114ba43b94a19d168aaf94fe60873054 (diff)
downloadredmine-5bd912e9a2601b00d564a475d37eafb8942cb687.tar.gz
redmine-5bd912e9a2601b00d564a475d37eafb8942cb687.zip
Refactor: Extracted the select_all calls to a new private method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3365 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models')
-rw-r--r--app/models/issue.rb114
1 files changed, 47 insertions, 67 deletions
diff --git a/app/models/issue.rb b/app/models/issue.rb
index af9086157..e83344109 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -415,89 +415,40 @@ class Issue < ActiveRecord::Base
end
# Extracted from the ReportsController.
- # TODO: refactor into a common factory or named scopes
def self.by_tracker(project)
- ActiveRecord::Base.connection.select_all("select s.id as status_id,
- s.is_closed as closed,
- t.id as tracker_id,
- count(i.id) as total
- from
- #{Issue.table_name} i, #{IssueStatus.table_name} s, #{Tracker.table_name} t
- where
- i.status_id=s.id
- and i.tracker_id=t.id
- and i.project_id=#{project.id}
- group by s.id, s.is_closed, t.id")
+ count_and_group_by(:project => project,
+ :field => 'tracker_id',
+ :joins => Tracker.table_name)
end
def self.by_version(project)
- ActiveRecord::Base.connection.select_all("select s.id as status_id,
- s.is_closed as closed,
- v.id as fixed_version_id,
- count(i.id) as total
- from
- #{Issue.table_name} i, #{IssueStatus.table_name} s, #{Version.table_name} v
- where
- i.status_id=s.id
- and i.fixed_version_id=v.id
- and i.project_id=#{project.id}
- group by s.id, s.is_closed, v.id")
+ count_and_group_by(:project => project,
+ :field => 'fixed_version_id',
+ :joins => Version.table_name)
end
def self.by_priority(project)
- ActiveRecord::Base.connection.select_all("select s.id as status_id,
- s.is_closed as closed,
- p.id as priority_id,
- count(i.id) as total
- from
- #{Issue.table_name} i, #{IssueStatus.table_name} s, #{IssuePriority.table_name} p
- where
- i.status_id=s.id
- and i.priority_id=p.id
- and i.project_id=#{project.id}
- group by s.id, s.is_closed, p.id")
+ count_and_group_by(:project => project,
+ :field => 'priority_id',
+ :joins => IssuePriority.table_name)
end
def self.by_category(project)
- ActiveRecord::Base.connection.select_all("select s.id as status_id,
- s.is_closed as closed,
- c.id as category_id,
- count(i.id) as total
- from
- #{Issue.table_name} i, #{IssueStatus.table_name} s, #{IssueCategory.table_name} c
- where
- i.status_id=s.id
- and i.category_id=c.id
- and i.project_id=#{project.id}
- group by s.id, s.is_closed, c.id")
+ count_and_group_by(:project => project,
+ :field => 'category_id',
+ :joins => IssueCategory.table_name)
end
def self.by_assigned_to(project)
- ActiveRecord::Base.connection.select_all("select s.id as status_id,
- s.is_closed as closed,
- a.id as assigned_to_id,
- count(i.id) as total
- from
- #{Issue.table_name} i, #{IssueStatus.table_name} s, #{User.table_name} a
- where
- i.status_id=s.id
- and i.assigned_to_id=a.id
- and i.project_id=#{project.id}
- group by s.id, s.is_closed, a.id")
+ count_and_group_by(:project => project,
+ :field => 'assigned_to_id',
+ :joins => User.table_name)
end
def self.by_author(project)
- ActiveRecord::Base.connection.select_all("select s.id as status_id,
- s.is_closed as closed,
- a.id as author_id,
- count(i.id) as total
- from
- #{Issue.table_name} i, #{IssueStatus.table_name} s, #{User.table_name} a
- where
- i.status_id=s.id
- and i.author_id=a.id
- and i.project_id=#{project.id}
- group by s.id, s.is_closed, a.id")
+ count_and_group_by(:project => project,
+ :field => 'author_id',
+ :joins => User.table_name)
end
def self.by_subproject(project)
@@ -568,4 +519,33 @@ class Issue < ActiveRecord::Base
@current_journal.save
end
end
+
+ # Query generator for selecting groups of issue counts for a project
+ # based on specific criteria
+ #
+ # Options
+ # * project - Project to search in.
+ # * field - String. Issue field to key off of in the grouping.
+ # * joins - String. The table name to join against.
+ def self.count_and_group_by(options)
+ project = options.delete(:project)
+ select_field = options.delete(:field)
+ joins = options.delete(:joins)
+
+ where = "i.#{select_field}=j.id"
+
+ ActiveRecord::Base.connection.select_all("select s.id as status_id,
+ s.is_closed as closed,
+ j.id as #{select_field},
+ count(i.id) as total
+ from
+ #{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} as j
+ where
+ i.status_id=s.id
+ and #{where}
+ and i.project_id=#{project.id}
+ group by s.id, s.is_closed, j.id")
+ end
+
+
end