diff --git a/models/issues/issue_stats.go b/models/issues/issue_stats.go index 6c249c2244..1654e6ce75 100644 --- a/models/issues/issue_stats.go +++ b/models/issues/issue_stats.go @@ -116,68 +116,69 @@ func GetIssueStats(opts *IssuesOptions) (*IssueStats, error) { func getIssueStatsChunk(opts *IssuesOptions, issueIDs []int64) (*IssueStats, error) { stats := &IssueStats{} - countSession := func(opts *IssuesOptions, issueIDs []int64) *xorm.Session { - sess := db.GetEngine(db.DefaultContext). - Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - if len(opts.RepoIDs) > 1 { - sess.In("issue.repo_id", opts.RepoIDs) - } else if len(opts.RepoIDs) == 1 { - sess.And("issue.repo_id = ?", opts.RepoIDs[0]) - } + sess := db.GetEngine(db.DefaultContext). + Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - if len(issueIDs) > 0 { - sess.In("issue.id", issueIDs) - } + var err error + stats.OpenCount, err = applyIssuesOptions(sess, opts, issueIDs). + And("issue.is_closed = ?", false). + Count(new(Issue)) + if err != nil { + return stats, err + } + stats.ClosedCount, err = applyIssuesOptions(sess, opts, issueIDs). + And("issue.is_closed = ?", true). + Count(new(Issue)) + return stats, err +} - applyLabelsCondition(sess, opts) +func applyIssuesOptions(sess *xorm.Session, opts *IssuesOptions, issueIDs []int64) *xorm.Session { + if len(opts.RepoIDs) > 1 { + sess.In("issue.repo_id", opts.RepoIDs) + } else if len(opts.RepoIDs) == 1 { + sess.And("issue.repo_id = ?", opts.RepoIDs[0]) + } - applyMilestoneCondition(sess, opts) + if len(issueIDs) > 0 { + sess.In("issue.id", issueIDs) + } - applyProjectCondition(sess, opts) + applyLabelsCondition(sess, opts) - if opts.AssigneeID > 0 { - applyAssigneeCondition(sess, opts.AssigneeID) - } else if opts.AssigneeID == db.NoConditionID { - sess.Where("issue.id NOT IN (SELECT issue_id FROM issue_assignees)") - } + applyMilestoneCondition(sess, opts) - if opts.PosterID > 0 { - applyPosterCondition(sess, opts.PosterID) - } + applyProjectCondition(sess, opts) - if opts.MentionedID > 0 { - applyMentionedCondition(sess, opts.MentionedID) - } + if opts.AssigneeID > 0 { + applyAssigneeCondition(sess, opts.AssigneeID) + } else if opts.AssigneeID == db.NoConditionID { + sess.Where("issue.id NOT IN (SELECT issue_id FROM issue_assignees)") + } - if opts.ReviewRequestedID > 0 { - applyReviewRequestedCondition(sess, opts.ReviewRequestedID) - } + if opts.PosterID > 0 { + applyPosterCondition(sess, opts.PosterID) + } - if opts.ReviewedID > 0 { - applyReviewedCondition(sess, opts.ReviewedID) - } + if opts.MentionedID > 0 { + applyMentionedCondition(sess, opts.MentionedID) + } - switch opts.IsPull { - case util.OptionalBoolTrue: - sess.And("issue.is_pull=?", true) - case util.OptionalBoolFalse: - sess.And("issue.is_pull=?", false) - } + if opts.ReviewRequestedID > 0 { + applyReviewRequestedCondition(sess, opts.ReviewRequestedID) + } - return sess + if opts.ReviewedID > 0 { + applyReviewedCondition(sess, opts.ReviewedID) } - var err error - stats.OpenCount, err = countSession(opts, issueIDs). - And("issue.is_closed = ?", false). - Count(new(Issue)) - if err != nil { - return stats, err + switch opts.IsPull { + case util.OptionalBoolTrue: + sess.And("issue.is_pull=?", true) + case util.OptionalBoolFalse: + sess.And("issue.is_pull=?", false) } - stats.ClosedCount, err = countSession(opts, issueIDs). - And("issue.is_closed = ?", true). - Count(new(Issue)) - return stats, err + + return sess } // GetUserIssueStats returns issue statistic information for dashboard by given conditions.