// GetUserIssueStats returns issue statistic information for dashboard by given conditions. func GetUserIssueStats(repoID, uid int64, repoIDs []int64, filterMode int) *IssueStats { stats := &IssueStats{} issue := new(Issue) stats.AssignCount, _ = x.Where("assignee_id=?", uid).And("is_closed=?", false).Count(issue) stats.CreateCount, _ = x.Where("poster_id=?", uid).And("is_closed=?", false).Count(issue) queryStr := "SELECT COUNT(*) FROM `issue` " baseCond := " WHERE issue.is_closed=?" if repoID > 0 { baseCond += " AND issue.repo_id=" + com.ToStr(repoID) } else { baseCond += " AND issue.repo_id IN (" + strings.Join(base.Int64sToStrings(repoIDs), ",") + ")" } switch filterMode { case FM_ASSIGN: baseCond += " AND assignee_id=" + com.ToStr(uid) case FM_CREATE: baseCond += " AND poster_id=" + com.ToStr(uid) } results, _ := x.Query(queryStr+baseCond, false) stats.OpenCount = parseCountResult(results) results, _ = x.Query(queryStr+baseCond, true) stats.ClosedCount = parseCountResult(results) return stats }
// Issues returns a list of issues by given conditions. func Issues(uid, assigneeID, repoID, posterID, milestoneID int64, repoIDs []int64, page int, isClosed, isMention bool, labels, sortType string) ([]*Issue, error) { sess := x.Limit(setting.IssuePagingNum, (page-1)*setting.IssuePagingNum) if repoID > 0 { sess.Where("issue.repo_id=?", repoID).And("issue.is_closed=?", isClosed) } else if repoIDs != nil { // In case repository IDs are provided but actually no repository has issue. if len(repoIDs) == 0 { return make([]*Issue, 0), nil } sess.Where("issue.repo_id IN ("+strings.Join(base.Int64sToStrings(repoIDs), ",")+")").And("issue.is_closed=?", isClosed) } else { sess.Where("issue.is_closed=?", isClosed) } if assigneeID > 0 { sess.And("issue.assignee_id=?", assigneeID) } else if posterID > 0 { sess.And("issue.poster_id=?", posterID) } if milestoneID > 0 { sess.And("issue.milestone_id=?", milestoneID) } switch sortType { case "oldest": sess.Asc("created") case "recentupdate": sess.Desc("updated") case "leastupdate": sess.Asc("updated") case "mostcomment": sess.Desc("num_comments") case "leastcomment": sess.Asc("num_comments") case "priority": sess.Desc("priority") default: sess.Desc("created") } labelIDs := base.StringsToInt64s(strings.Split(labels, ",")) if len(labelIDs) > 0 { validJoin := false queryStr := "issue.id=issue_label.issue_id" for _, id := range labelIDs { if id == 0 { continue } validJoin = true queryStr += " AND issue_label.label_id=" + com.ToStr(id) } if validJoin { sess.Join("INNER", "issue_label", queryStr) } } if isMention { queryStr := "issue.id=issue_user.issue_id AND issue_user.is_mentioned=1" if uid > 0 { queryStr += " AND issue_user.uid=" + com.ToStr(uid) } sess.Join("INNER", "issue_user", queryStr) } issues := make([]*Issue, 0, setting.IssuePagingNum) return issues, sess.Find(&issues) }