@@ -1090,6 +1090,7 @@ type IssuesOptions struct {
10901090 AssigneeID int64
10911091 PosterID int64
10921092 MentionedID int64
1093+ ReviewRequestedID int64
10931094 MilestoneIDs []int64
10941095 ProjectID int64
10951096 ProjectBoardID int64
@@ -1176,6 +1177,13 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) {
11761177 And ("issue_user.uid = ?" , opts .MentionedID )
11771178 }
11781179
1180+ if opts .ReviewRequestedID > 0 {
1181+ sess .Join ("INNER" , []string {"review" , "r" }, "issue.id = r.issue_id" ).
1182+ And ("r.reviewer_id = ?" , opts .ReviewRequestedID ).
1183+ And ("r.type = ?" , ReviewTypeRequest ).
1184+ And ("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)" )
1185+ }
1186+
11791187 if len (opts .MilestoneIDs ) > 0 {
11801188 sess .In ("issue.milestone_id" , opts .MilestoneIDs )
11811189 }
@@ -1359,6 +1367,7 @@ type IssueStats struct {
13591367 AssignCount int64
13601368 CreateCount int64
13611369 MentionCount int64
1370+ ReviewRequestedCount int64
13621371}
13631372
13641373// Filter modes.
@@ -1367,6 +1376,7 @@ const (
13671376 FilterModeAssign
13681377 FilterModeCreate
13691378 FilterModeMention
1379+ FilterModeReviewRequested
13701380)
13711381
13721382func parseCountResult (results []map [string ][]byte ) int64 {
@@ -1381,14 +1391,15 @@ func parseCountResult(results []map[string][]byte) int64 {
13811391
13821392// IssueStatsOptions contains parameters accepted by GetIssueStats.
13831393type IssueStatsOptions struct {
1384- RepoID int64
1385- Labels string
1386- MilestoneID int64
1387- AssigneeID int64
1388- MentionedID int64
1389- PosterID int64
1390- IsPull util.OptionalBool
1391- IssueIDs []int64
1394+ RepoID int64
1395+ Labels string
1396+ MilestoneID int64
1397+ AssigneeID int64
1398+ MentionedID int64
1399+ PosterID int64
1400+ ReviewRequestedID int64
1401+ IsPull util.OptionalBool
1402+ IssueIDs []int64
13921403}
13931404
13941405// GetIssueStats returns issue statistic information by given conditions.
@@ -1417,6 +1428,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
14171428 accum .AssignCount += stats .AssignCount
14181429 accum .CreateCount += stats .CreateCount
14191430 accum .OpenCount += stats .MentionCount
1431+ accum .ReviewRequestedCount += stats .ReviewRequestedCount
14201432 i = chunk
14211433 }
14221434 return accum , nil
@@ -1468,6 +1480,13 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats,
14681480 And ("issue_user.is_mentioned = ?" , true )
14691481 }
14701482
1483+ if opts .ReviewRequestedID > 0 {
1484+ sess .Join ("INNER" , []string {"review" , "r" }, "issue.id = r.issue_id" ).
1485+ And ("r.reviewer_id = ?" , opts .ReviewRequestedID ).
1486+ And ("r.type = ?" , ReviewTypeRequest ).
1487+ And ("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)" )
1488+ }
1489+
14711490 switch opts .IsPull {
14721491 case util .OptionalBoolTrue :
14731492 sess .And ("issue.is_pull=?" , true )
@@ -1573,6 +1592,25 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
15731592 if err != nil {
15741593 return nil , err
15751594 }
1595+ case FilterModeReviewRequested :
1596+ stats .OpenCount , err = x .Where (cond ).And ("issue.is_closed = ?" , false ).
1597+ Join ("INNER" , []string {"review" , "r" }, "issue.id = r.issue_id" ).
1598+ And ("r.reviewer_id = ?" , opts .UserID ).
1599+ And ("r.type = ?" , ReviewTypeRequest ).
1600+ And ("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)" ).
1601+ Count (new (Issue ))
1602+ if err != nil {
1603+ return nil , err
1604+ }
1605+ stats .ClosedCount , err = x .Where (cond ).And ("issue.is_closed = ?" , true ).
1606+ Join ("INNER" , []string {"review" , "r" }, "issue.id = r.issue_id" ).
1607+ And ("r.reviewer_id = ?" , opts .UserID ).
1608+ And ("r.type = ?" , ReviewTypeRequest ).
1609+ And ("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)" ).
1610+ Count (new (Issue ))
1611+ if err != nil {
1612+ return nil , err
1613+ }
15761614 }
15771615
15781616 cond = cond .And (builder.Eq {"issue.is_closed" : opts .IsClosed })
@@ -1606,6 +1644,16 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
16061644 return nil , err
16071645 }
16081646
1647+ stats .ReviewRequestedCount , err = x .Where (cond ).
1648+ Join ("INNER" , []string {"review" , "r" }, "issue.id = r.issue_id" ).
1649+ And ("r.reviewer_id = ?" , opts .UserID ).
1650+ And ("r.type = ?" , ReviewTypeRequest ).
1651+ And ("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)" ).
1652+ Count (new (Issue ))
1653+ if err != nil {
1654+ return nil , err
1655+ }
1656+
16091657 return stats , nil
16101658}
16111659
0 commit comments