|
|
|
@ -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.
|
|
|
|
|