Skip to content

Commit 04b3bf2

Browse files
committed
Drop redundant columns from issue_user table
1 parent 31c717f commit 04b3bf2

File tree

4 files changed

+23
-106
lines changed

4 files changed

+23
-106
lines changed

models/issue.go

Lines changed: 15 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,18 @@ func (issue *Issue) LoadAttributes() error {
162162
return issue.loadAttributes(x)
163163
}
164164

165+
// GetIsRead load the `IsRead` field of the issue
166+
func (issue *Issue) GetIsRead(userID int64) error {
167+
issueUser := &IssueUser{IssueID: issue.ID, UID: userID}
168+
if has, err := x.Get(issueUser); err != nil {
169+
return err
170+
} else if !has {
171+
return ErrUserNotExist{UID: userID}
172+
}
173+
issue.IsRead = issueUser.IsRead
174+
return nil
175+
}
176+
165177
// HTMLURL returns the absolute URL to this issue.
166178
func (issue *Issue) HTMLURL() string {
167179
var path string
@@ -473,8 +485,6 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository,
473485

474486
if err = updateIssueCols(e, issue, "is_closed"); err != nil {
475487
return err
476-
} else if err = updateIssueUsersByStatus(e, issue.ID, isClosed); err != nil {
477-
return err
478488
}
479489

480490
// Update issue count of labels
@@ -999,13 +1009,9 @@ type IssueUser struct {
9991009
ID int64 `xorm:"pk autoincr"`
10001010
UID int64 `xorm:"INDEX"` // User ID.
10011011
IssueID int64
1002-
RepoID int64 `xorm:"INDEX"`
1003-
MilestoneID int64
10041012
IsRead bool
10051013
IsAssigned bool
10061014
IsMentioned bool
1007-
IsPoster bool
1008-
IsClosed bool
10091015
}
10101016

10111017
func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error {
@@ -1021,24 +1027,17 @@ func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error {
10211027
// and just waste 1 unit is cheaper than re-allocate memory once.
10221028
issueUsers := make([]*IssueUser, 0, len(assignees)+1)
10231029
for _, assignee := range assignees {
1024-
isPoster := assignee.ID == issue.PosterID
10251030
issueUsers = append(issueUsers, &IssueUser{
10261031
IssueID: issue.ID,
1027-
RepoID: repo.ID,
10281032
UID: assignee.ID,
1029-
IsPoster: isPoster,
10301033
IsAssigned: assignee.ID == issue.AssigneeID,
10311034
})
1032-
if !isPosterAssignee && isPoster {
1033-
isPosterAssignee = true
1034-
}
1035+
isPosterAssignee = isPosterAssignee || assignee.ID == issue.PosterID
10351036
}
10361037
if !isPosterAssignee {
10371038
issueUsers = append(issueUsers, &IssueUser{
1038-
IssueID: issue.ID,
1039-
RepoID: repo.ID,
1040-
UID: issue.PosterID,
1041-
IsPoster: true,
1039+
IssueID: issue.ID,
1040+
UID: issue.PosterID,
10421041
})
10431042
}
10441043

@@ -1063,62 +1062,6 @@ func NewIssueUsers(repo *Repository, issue *Issue) (err error) {
10631062
return sess.Commit()
10641063
}
10651064

1066-
// PairsContains returns true when pairs list contains given issue.
1067-
func PairsContains(ius []*IssueUser, issueID, uid int64) int {
1068-
for i := range ius {
1069-
if ius[i].IssueID == issueID &&
1070-
ius[i].UID == uid {
1071-
return i
1072-
}
1073-
}
1074-
return -1
1075-
}
1076-
1077-
// GetIssueUsers returns issue-user pairs by given repository and user.
1078-
func GetIssueUsers(rid, uid int64, isClosed bool) ([]*IssueUser, error) {
1079-
ius := make([]*IssueUser, 0, 10)
1080-
err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoID: rid, UID: uid})
1081-
return ius, err
1082-
}
1083-
1084-
// GetIssueUserPairsByRepoIds returns issue-user pairs by given repository IDs.
1085-
func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*IssueUser, error) {
1086-
if len(rids) == 0 {
1087-
return []*IssueUser{}, nil
1088-
}
1089-
1090-
ius := make([]*IssueUser, 0, 10)
1091-
sess := x.
1092-
Limit(20, (page-1)*20).
1093-
Where("is_closed=?", isClosed).
1094-
In("repo_id", rids)
1095-
err := sess.Find(&ius)
1096-
return ius, err
1097-
}
1098-
1099-
// GetIssueUserPairsByMode returns issue-user pairs by given repository and user.
1100-
func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) {
1101-
ius := make([]*IssueUser, 0, 10)
1102-
sess := x.
1103-
Limit(20, (page-1)*20).
1104-
Where("uid=?", uid).
1105-
And("is_closed=?", isClosed)
1106-
if rid > 0 {
1107-
sess.And("repo_id=?", rid)
1108-
}
1109-
1110-
switch filterMode {
1111-
case FilterModeAssign:
1112-
sess.And("is_assigned=?", true)
1113-
case FilterModeCreate:
1114-
sess.And("is_poster=?", true)
1115-
default:
1116-
return ius, nil
1117-
}
1118-
err := sess.Find(&ius)
1119-
return ius, err
1120-
}
1121-
11221065
// UpdateIssueMentions extracts mentioned people from content and
11231066
// updates issue-user relations for them.
11241067
func UpdateIssueMentions(e Engine, issueID int64, mentions []string) error {
@@ -1348,16 +1291,6 @@ func UpdateIssue(issue *Issue) error {
13481291
return updateIssue(x, issue)
13491292
}
13501293

1351-
func updateIssueUsersByStatus(e Engine, issueID int64, isClosed bool) error {
1352-
_, err := e.Exec("UPDATE `issue_user` SET is_closed=? WHERE issue_id=?", isClosed, issueID)
1353-
return err
1354-
}
1355-
1356-
// UpdateIssueUsersByStatus updates issue-user relations by issue status.
1357-
func UpdateIssueUsersByStatus(issueID int64, isClosed bool) error {
1358-
return updateIssueUsersByStatus(x, issueID, isClosed)
1359-
}
1360-
13611294
func updateIssueUserByAssignee(e *xorm.Session, issue *Issue) (err error) {
13621295
if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?", false, issue.ID); err != nil {
13631296
return err
@@ -1702,8 +1635,6 @@ func changeMilestoneAssign(e *xorm.Session, issue *Issue, oldMilestoneID int64)
17021635

17031636
if err = updateMilestone(e, m); err != nil {
17041637
return err
1705-
} else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?", issue.ID); err != nil {
1706-
return err
17071638
}
17081639
}
17091640

@@ -1720,8 +1651,6 @@ func changeMilestoneAssign(e *xorm.Session, issue *Issue, oldMilestoneID int64)
17201651

17211652
if err = updateMilestone(e, m); err != nil {
17221653
return err
1723-
} else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?", m.ID, issue.ID); err != nil {
1724-
return err
17251654
}
17261655
}
17271656

@@ -1775,8 +1704,6 @@ func DeleteMilestoneByRepoID(repoID, id int64) error {
17751704

17761705
if _, err = sess.Exec("UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil {
17771706
return err
1778-
} else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil {
1779-
return err
17801707
}
17811708
return sess.Commit()
17821709
}

models/pull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ import (
1414
"time"
1515

1616
"code.gitea.io/git"
17+
"code.gitea.io/gitea/modules/base"
1718
"code.gitea.io/gitea/modules/log"
1819
"code.gitea.io/gitea/modules/process"
1920
"code.gitea.io/gitea/modules/setting"
2021
"code.gitea.io/gitea/modules/sync"
2122
api "code.gitea.io/sdk/gitea"
2223
"github.com/Unknwon/com"
2324
"github.com/go-xorm/xorm"
24-
"code.gitea.io/gitea/modules/base"
2525
)
2626

2727
var pullRequestQueue = sync.NewUniqueQueue(setting.Repository.PullRequestQueueLength)

models/repo.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,6 @@ func DeleteRepository(uid, repoID int64) error {
14241424
&Watch{RepoID: repoID},
14251425
&Star{RepoID: repoID},
14261426
&Mirror{RepoID: repoID},
1427-
&IssueUser{RepoID: repoID},
14281427
&Milestone{RepoID: repoID},
14291428
&Release{RepoID: repoID},
14301429
&Collaboration{RepoID: repoID},
@@ -1445,6 +1444,9 @@ func DeleteRepository(uid, repoID int64) error {
14451444
if _, err = sess.Delete(&Comment{IssueID: issues[i].ID}); err != nil {
14461445
return err
14471446
}
1447+
if _, err = sess.Delete(&IssueUser{IssueID: issues[i].ID}); err != nil {
1448+
return err
1449+
}
14481450

14491451
attachments := make([]*Attachment, 0, 5)
14501452
if err = sess.

routers/repo/issue.go

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -230,26 +230,14 @@ func Issues(ctx *context.Context) {
230230
}
231231
}
232232

233-
// Get issue-user relations.
234-
pairs, err := models.GetIssueUsers(repo.ID, posterID, isShowClosed)
235-
if err != nil {
236-
ctx.Handle(500, "GetIssueUsers", err)
237-
return
238-
}
239-
240233
// Get posters.
241234
for i := range issues {
235+
// Check read status
242236
if !ctx.IsSigned {
243237
issues[i].IsRead = true
244-
continue
245-
}
246-
247-
// Check read status.
248-
idx := models.PairsContains(pairs, issues[i].ID, ctx.User.ID)
249-
if idx > -1 {
250-
issues[i].IsRead = pairs[idx].IsRead
251-
} else {
252-
issues[i].IsRead = true
238+
} else if err = issues[i].GetIsRead(ctx.User.ID); err != nil {
239+
ctx.Handle(500, "GetIsRead", err)
240+
return
253241
}
254242
}
255243
ctx.Data["Issues"] = issues

0 commit comments

Comments
 (0)