Skip to content

Commit 68bdaf0

Browse files
ethantkoeniglunny
authored andcommitted
Drop redundant columns from issue_user table (#638)
1 parent 400b6fd commit 68bdaf0

File tree

3 files changed

+22
-105
lines changed

3 files changed

+22
-105
lines changed

models/issue.go

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

190+
// GetIsRead load the `IsRead` field of the issue
191+
func (issue *Issue) GetIsRead(userID int64) error {
192+
issueUser := &IssueUser{IssueID: issue.ID, UID: userID}
193+
if has, err := x.Get(issueUser); err != nil {
194+
return err
195+
} else if !has {
196+
return ErrUserNotExist{UID: userID}
197+
}
198+
issue.IsRead = issueUser.IsRead
199+
return nil
200+
}
201+
190202
// HTMLURL returns the absolute URL to this issue.
191203
func (issue *Issue) HTMLURL() string {
192204
var path string
@@ -554,8 +566,6 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository,
554566

555567
if err = updateIssueCols(e, issue, "is_closed"); err != nil {
556568
return err
557-
} else if err = updateIssueUsersByStatus(e, issue.ID, isClosed); err != nil {
558-
return err
559569
}
560570

561571
// Update issue count of labels
@@ -1087,13 +1097,9 @@ type IssueUser struct {
10871097
ID int64 `xorm:"pk autoincr"`
10881098
UID int64 `xorm:"INDEX"` // User ID.
10891099
IssueID int64
1090-
RepoID int64 `xorm:"INDEX"`
1091-
MilestoneID int64
10921100
IsRead bool
10931101
IsAssigned bool
10941102
IsMentioned bool
1095-
IsPoster bool
1096-
IsClosed bool
10971103
}
10981104

10991105
func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error {
@@ -1109,24 +1115,17 @@ func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error {
11091115
// and just waste 1 unit is cheaper than re-allocate memory once.
11101116
issueUsers := make([]*IssueUser, 0, len(assignees)+1)
11111117
for _, assignee := range assignees {
1112-
isPoster := assignee.ID == issue.PosterID
11131118
issueUsers = append(issueUsers, &IssueUser{
11141119
IssueID: issue.ID,
1115-
RepoID: repo.ID,
11161120
UID: assignee.ID,
1117-
IsPoster: isPoster,
11181121
IsAssigned: assignee.ID == issue.AssigneeID,
11191122
})
1120-
if !isPosterAssignee && isPoster {
1121-
isPosterAssignee = true
1122-
}
1123+
isPosterAssignee = isPosterAssignee || assignee.ID == issue.PosterID
11231124
}
11241125
if !isPosterAssignee {
11251126
issueUsers = append(issueUsers, &IssueUser{
1126-
IssueID: issue.ID,
1127-
RepoID: repo.ID,
1128-
UID: issue.PosterID,
1129-
IsPoster: true,
1127+
IssueID: issue.ID,
1128+
UID: issue.PosterID,
11301129
})
11311130
}
11321131

@@ -1151,62 +1150,6 @@ func NewIssueUsers(repo *Repository, issue *Issue) (err error) {
11511150
return sess.Commit()
11521151
}
11531152

1154-
// PairsContains returns true when pairs list contains given issue.
1155-
func PairsContains(ius []*IssueUser, issueID, uid int64) int {
1156-
for i := range ius {
1157-
if ius[i].IssueID == issueID &&
1158-
ius[i].UID == uid {
1159-
return i
1160-
}
1161-
}
1162-
return -1
1163-
}
1164-
1165-
// GetIssueUsers returns issue-user pairs by given repository and user.
1166-
func GetIssueUsers(rid, uid int64, isClosed bool) ([]*IssueUser, error) {
1167-
ius := make([]*IssueUser, 0, 10)
1168-
err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoID: rid, UID: uid})
1169-
return ius, err
1170-
}
1171-
1172-
// GetIssueUserPairsByRepoIds returns issue-user pairs by given repository IDs.
1173-
func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*IssueUser, error) {
1174-
if len(rids) == 0 {
1175-
return []*IssueUser{}, nil
1176-
}
1177-
1178-
ius := make([]*IssueUser, 0, 10)
1179-
sess := x.
1180-
Limit(20, (page-1)*20).
1181-
Where("is_closed=?", isClosed).
1182-
In("repo_id", rids)
1183-
err := sess.Find(&ius)
1184-
return ius, err
1185-
}
1186-
1187-
// GetIssueUserPairsByMode returns issue-user pairs by given repository and user.
1188-
func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) {
1189-
ius := make([]*IssueUser, 0, 10)
1190-
sess := x.
1191-
Limit(20, (page-1)*20).
1192-
Where("uid=?", uid).
1193-
And("is_closed=?", isClosed)
1194-
if rid > 0 {
1195-
sess.And("repo_id=?", rid)
1196-
}
1197-
1198-
switch filterMode {
1199-
case FilterModeAssign:
1200-
sess.And("is_assigned=?", true)
1201-
case FilterModeCreate:
1202-
sess.And("is_poster=?", true)
1203-
default:
1204-
return ius, nil
1205-
}
1206-
err := sess.Find(&ius)
1207-
return ius, err
1208-
}
1209-
12101153
// UpdateIssueMentions extracts mentioned people from content and
12111154
// updates issue-user relations for them.
12121155
func UpdateIssueMentions(e Engine, issueID int64, mentions []string) error {
@@ -1436,16 +1379,6 @@ func UpdateIssue(issue *Issue) error {
14361379
return updateIssue(x, issue)
14371380
}
14381381

1439-
func updateIssueUsersByStatus(e Engine, issueID int64, isClosed bool) error {
1440-
_, err := e.Exec("UPDATE `issue_user` SET is_closed=? WHERE issue_id=?", isClosed, issueID)
1441-
return err
1442-
}
1443-
1444-
// UpdateIssueUsersByStatus updates issue-user relations by issue status.
1445-
func UpdateIssueUsersByStatus(issueID int64, isClosed bool) error {
1446-
return updateIssueUsersByStatus(x, issueID, isClosed)
1447-
}
1448-
14491382
func updateIssueUserByAssignee(e *xorm.Session, issue *Issue) (err error) {
14501383
if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?", false, issue.ID); err != nil {
14511384
return err
@@ -1790,8 +1723,6 @@ func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilesto
17901723

17911724
if err = updateMilestone(e, m); err != nil {
17921725
return err
1793-
} else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?", issue.ID); err != nil {
1794-
return err
17951726
}
17961727
}
17971728

@@ -1808,8 +1739,6 @@ func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilesto
18081739

18091740
if err = updateMilestone(e, m); err != nil {
18101741
return err
1811-
} else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?", m.ID, issue.ID); err != nil {
1812-
return err
18131742
}
18141743
}
18151744

@@ -1873,8 +1802,6 @@ func DeleteMilestoneByRepoID(repoID, id int64) error {
18731802

18741803
if _, err = sess.Exec("UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil {
18751804
return err
1876-
} else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil {
1877-
return err
18781805
}
18791806
return sess.Commit()
18801807
}

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
@@ -213,26 +213,14 @@ func Issues(ctx *context.Context) {
213213
}
214214
}
215215

216-
// Get issue-user relations.
217-
pairs, err := models.GetIssueUsers(repo.ID, posterID, isShowClosed)
218-
if err != nil {
219-
ctx.Handle(500, "GetIssueUsers", err)
220-
return
221-
}
222-
223216
// Get posters.
224217
for i := range issues {
218+
// Check read status
225219
if !ctx.IsSigned {
226220
issues[i].IsRead = true
227-
continue
228-
}
229-
230-
// Check read status.
231-
idx := models.PairsContains(pairs, issues[i].ID, ctx.User.ID)
232-
if idx > -1 {
233-
issues[i].IsRead = pairs[idx].IsRead
234-
} else {
235-
issues[i].IsRead = true
221+
} else if err = issues[i].GetIsRead(ctx.User.ID); err != nil {
222+
ctx.Handle(500, "GetIsRead", err)
223+
return
236224
}
237225
}
238226
ctx.Data["Issues"] = issues

0 commit comments

Comments
 (0)