Skip to content

Commit 8820bb9

Browse files
committed
refactor: remove duplication of issue filtering conditions
1 parent f2c1fbe commit 8820bb9

File tree

1 file changed

+65
-83
lines changed

1 file changed

+65
-83
lines changed

models/issue.go

Lines changed: 65 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,8 +1151,7 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) {
11511151
}
11521152

11531153
if len(opts.RepoIDs) > 0 {
1154-
// In case repository IDs are provided but actually no repository has issue.
1155-
sess.In("issue.repo_id", opts.RepoIDs)
1154+
applyReposCondition(sess, opts.RepoIDs)
11561155
}
11571156

11581157
switch opts.IsClosed {
@@ -1163,26 +1162,19 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) {
11631162
}
11641163

11651164
if opts.AssigneeID > 0 {
1166-
sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1167-
And("issue_assignees.assignee_id = ?", opts.AssigneeID)
1165+
applyAssigneeCondition(sess, opts.AssigneeID)
11681166
}
11691167

11701168
if opts.PosterID > 0 {
1171-
sess.And("issue.poster_id=?", opts.PosterID)
1169+
applyPosterCondition(sess, opts.PosterID)
11721170
}
11731171

11741172
if opts.MentionedID > 0 {
1175-
sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").
1176-
And("issue_user.is_mentioned = ?", true).
1177-
And("issue_user.uid = ?", opts.MentionedID)
1173+
applyMentionedCondition(sess, opts.MentionedID)
11781174
}
11791175

11801176
if opts.ReviewRequestedID > 0 {
1181-
sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1182-
And("r.type = ?", ReviewTypeRequest).
1183-
And("r.reviewer_id = ? and r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id and type in (?, ?, ?))"+
1184-
" or r.reviewer_team_id in (select team_id from team_user where uid = ?)",
1185-
opts.ReviewRequestedID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, opts.ReviewRequestedID)
1177+
applyReviewRequestedCondition(sess, opts.ReviewRequestedID)
11861178
}
11871179

11881180
if len(opts.MilestoneIDs) > 0 {
@@ -1236,6 +1228,33 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) {
12361228
}
12371229
}
12381230

1231+
func applyReposCondition(sess *xorm.Session, repoIDs []int64) *xorm.Session {
1232+
return sess.In("issue.repo_id", repoIDs)
1233+
}
1234+
1235+
func applyAssigneeCondition(sess *xorm.Session, assigneeID int64) *xorm.Session {
1236+
return sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1237+
And("issue_assignees.assignee_id = ?", assigneeID)
1238+
}
1239+
1240+
func applyPosterCondition(sess *xorm.Session, posterID int64) *xorm.Session {
1241+
return sess.And("issue.poster_id=?", posterID)
1242+
}
1243+
1244+
func applyMentionedCondition(sess *xorm.Session, mentionedID int64) *xorm.Session {
1245+
return sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").
1246+
And("issue_user.is_mentioned = ?", true).
1247+
And("issue_user.uid = ?", mentionedID)
1248+
}
1249+
1250+
func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64) *xorm.Session {
1251+
return sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1252+
And("r.type = ?", ReviewTypeRequest).
1253+
And("r.reviewer_id = ? and r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id and type in (?, ?, ?))"+
1254+
" or r.reviewer_team_id in (select team_id from team_user where uid = ?)",
1255+
reviewRequestedID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, reviewRequestedID)
1256+
}
1257+
12391258
// CountIssuesByRepo map from repoID to number of issues matching the options
12401259
func CountIssuesByRepo(opts *IssuesOptions) (map[int64]int64, error) {
12411260
sess := x.NewSession()
@@ -1468,26 +1487,19 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats,
14681487
}
14691488

14701489
if opts.AssigneeID > 0 {
1471-
sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1472-
And("issue_assignees.assignee_id = ?", opts.AssigneeID)
1490+
applyAssigneeCondition(sess, opts.AssigneeID)
14731491
}
14741492

14751493
if opts.PosterID > 0 {
1476-
sess.And("issue.poster_id = ?", opts.PosterID)
1494+
applyPosterCondition(sess, opts.PosterID)
14771495
}
14781496

14791497
if opts.MentionedID > 0 {
1480-
sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").
1481-
And("issue_user.uid = ?", opts.MentionedID).
1482-
And("issue_user.is_mentioned = ?", true)
1498+
applyMentionedCondition(sess, opts.MentionedID)
14831499
}
14841500

14851501
if opts.ReviewRequestedID > 0 {
1486-
sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1487-
And("r.type = ?", ReviewTypeRequest).
1488-
And("r.reviewer_id = ? and r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id and type in (?, ?, ?))"+
1489-
" or r.reviewer_team_id in (select team_id from team_user where uid = ?)",
1490-
opts.ReviewRequestedID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, opts.ReviewRequestedID)
1502+
applyReviewRequestedCondition(sess, opts.ReviewRequestedID)
14911503
}
14921504

14931505
switch opts.IsPull {
@@ -1550,122 +1562,94 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
15501562

15511563
switch opts.FilterMode {
15521564
case FilterModeAll:
1553-
stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
1554-
And(builder.In("issue.repo_id", opts.UserRepoIDs)).
1565+
stats.OpenCount, err = applyReposCondition(sess(cond), opts.UserRepoIDs).
1566+
And("issue.is_closed = ?", false).
15551567
Count(new(Issue))
15561568
if err != nil {
15571569
return nil, err
15581570
}
1559-
stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
1560-
And(builder.In("issue.repo_id", opts.UserRepoIDs)).
1571+
stats.ClosedCount, err = applyReposCondition(sess(cond), opts.UserRepoIDs).
1572+
And("issue.is_closed = ?", true).
15611573
Count(new(Issue))
15621574
if err != nil {
15631575
return nil, err
15641576
}
15651577
case FilterModeAssign:
1566-
stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
1567-
Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1568-
And("issue_assignees.assignee_id = ?", opts.UserID).
1578+
stats.OpenCount, err = applyAssigneeCondition(sess(cond), opts.UserID).
1579+
And("issue.is_closed = ?", false).
15691580
Count(new(Issue))
15701581
if err != nil {
15711582
return nil, err
15721583
}
1573-
stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
1574-
Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1575-
And("issue_assignees.assignee_id = ?", opts.UserID).
1584+
stats.ClosedCount, err = applyAssigneeCondition(sess(cond), opts.UserID).
1585+
And("issue.is_closed = ?", true).
15761586
Count(new(Issue))
15771587
if err != nil {
15781588
return nil, err
15791589
}
15801590
case FilterModeCreate:
1581-
stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
1582-
And("issue.poster_id = ?", opts.UserID).
1591+
stats.OpenCount, err = applyPosterCondition(sess(cond), opts.UserID).
1592+
And("issue.is_closed = ?", false).
15831593
Count(new(Issue))
15841594
if err != nil {
15851595
return nil, err
15861596
}
1587-
stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
1588-
And("issue.poster_id = ?", opts.UserID).
1597+
stats.ClosedCount, err = applyPosterCondition(sess(cond), opts.UserID).
1598+
And("issue.is_closed = ?", true).
15891599
Count(new(Issue))
15901600
if err != nil {
15911601
return nil, err
15921602
}
15931603
case FilterModeMention:
1594-
stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
1595-
Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
1596-
And("issue_user.uid = ?", opts.UserID).
1604+
stats.OpenCount, err = applyMentionedCondition(sess(cond), opts.UserID).
1605+
And("issue.is_closed = ?", false).
15971606
Count(new(Issue))
15981607
if err != nil {
15991608
return nil, err
16001609
}
1601-
stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
1602-
Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
1603-
And("issue_user.uid = ?", opts.UserID).
1610+
stats.ClosedCount, err = applyMentionedCondition(sess(cond), opts.UserID).
1611+
And("issue.is_closed = ?", true).
16041612
Count(new(Issue))
16051613
if err != nil {
16061614
return nil, err
16071615
}
16081616
case FilterModeReviewRequested:
1609-
stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false).
1610-
Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1611-
And("r.type = ?", ReviewTypeRequest).
1612-
And("r.reviewer_id = ? and r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id and type in (?, ?, ?))"+
1613-
" or r.reviewer_team_id in (select team_id from team_user where uid = ?)",
1614-
opts.UserID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, opts.UserID).
1617+
stats.OpenCount, err = applyReviewRequestedCondition(sess(cond), opts.UserID).
1618+
And("issue.is_closed = ?", false).
16151619
Count(new(Issue))
16161620
if err != nil {
16171621
return nil, err
16181622
}
1619-
stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true).
1620-
Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1621-
And("r.type = ?", ReviewTypeRequest).
1622-
And("r.reviewer_id = ? and r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id and type in (?, ?, ?))"+
1623-
" or r.reviewer_team_id in (select team_id from team_user where uid = ?)",
1624-
opts.UserID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, opts.UserID).
1623+
stats.ClosedCount, err = applyReviewRequestedCondition(sess(cond), opts.UserID).
1624+
And("issue.is_closed = ?", true).
16251625
Count(new(Issue))
16261626
if err != nil {
16271627
return nil, err
16281628
}
16291629
}
16301630

16311631
cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed})
1632-
stats.AssignCount, err = sess(cond).
1633-
Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1634-
And("issue_assignees.assignee_id = ?", opts.UserID).
1635-
Count(new(Issue))
1632+
stats.AssignCount, err = applyAssigneeCondition(sess(cond), opts.UserID).Count(new(Issue))
16361633
if err != nil {
16371634
return nil, err
16381635
}
16391636

1640-
stats.CreateCount, err = sess(cond).
1641-
And("poster_id = ?", opts.UserID).
1642-
Count(new(Issue))
1637+
stats.CreateCount, err = applyPosterCondition(sess(cond), opts.UserID).Count(new(Issue))
16431638
if err != nil {
16441639
return nil, err
16451640
}
16461641

1647-
stats.MentionCount, err = sess(cond).
1648-
Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
1649-
And("issue_user.uid = ?", opts.UserID).
1650-
Count(new(Issue))
1642+
stats.MentionCount, err = applyMentionedCondition(sess(cond), opts.UserID).Count(new(Issue))
16511643
if err != nil {
16521644
return nil, err
16531645
}
16541646

1655-
stats.YourRepositoriesCount, err = sess(cond).
1656-
And(builder.In("issue.repo_id", opts.UserRepoIDs)).
1657-
Count(new(Issue))
1647+
stats.YourRepositoriesCount, err = applyReposCondition(sess(cond), opts.UserRepoIDs).Count(new(Issue))
16581648
if err != nil {
16591649
return nil, err
16601650
}
16611651

1662-
stats.ReviewRequestedCount, err = x.Where(cond).
1663-
Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1664-
And("r.type = ?", ReviewTypeRequest).
1665-
And("r.reviewer_id = ? and r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id and type in (?, ?, ?))"+
1666-
" or r.reviewer_team_id in (select team_id from team_user where uid = ?)",
1667-
opts.UserID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, opts.UserID).
1668-
Count(new(Issue))
1652+
stats.ReviewRequestedCount, err = applyReviewRequestedCondition(sess(cond), opts.UserID).Count(new(Issue))
16691653
if err != nil {
16701654
return nil, err
16711655
}
@@ -1689,13 +1673,11 @@ func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen
16891673

16901674
switch filterMode {
16911675
case FilterModeAssign:
1692-
openCountSession.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1693-
And("issue_assignees.assignee_id = ?", uid)
1694-
closedCountSession.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
1695-
And("issue_assignees.assignee_id = ?", uid)
1676+
applyAssigneeCondition(openCountSession, uid)
1677+
applyAssigneeCondition(closedCountSession, uid)
16961678
case FilterModeCreate:
1697-
openCountSession.And("poster_id = ?", uid)
1698-
closedCountSession.And("poster_id = ?", uid)
1679+
applyPosterCondition(openCountSession, uid)
1680+
applyPosterCondition(closedCountSession, uid)
16991681
}
17001682

17011683
openResult, _ := openCountSession.Count(new(Issue))

0 commit comments

Comments
 (0)