Drop redundant columns from issue_user table (#638)
This commit is contained in:
		
							parent
							
								
									400b6fd61c
								
							
						
					
					
						commit
						68bdaf0a6b
					
				
							
								
								
									
										103
									
								
								models/issue.go
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								models/issue.go
									
									
									
									
									
								
							| @ -187,6 +187,18 @@ func (issue *Issue) LoadAttributes() error { | ||||
| 	return issue.loadAttributes(x) | ||||
| } | ||||
| 
 | ||||
| // GetIsRead load the `IsRead` field of the issue
 | ||||
| func (issue *Issue) GetIsRead(userID int64) error { | ||||
| 	issueUser := &IssueUser{IssueID: issue.ID, UID: userID} | ||||
| 	if has, err := x.Get(issueUser); err != nil { | ||||
| 		return err | ||||
| 	} else if !has { | ||||
| 		return ErrUserNotExist{UID: userID} | ||||
| 	} | ||||
| 	issue.IsRead = issueUser.IsRead | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // HTMLURL returns the absolute URL to this issue.
 | ||||
| func (issue *Issue) HTMLURL() string { | ||||
| 	var path string | ||||
| @ -554,8 +566,6 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, | ||||
| 
 | ||||
| 	if err = updateIssueCols(e, issue, "is_closed"); err != nil { | ||||
| 		return err | ||||
| 	} else if err = updateIssueUsersByStatus(e, issue.ID, isClosed); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// Update issue count of labels
 | ||||
| @ -1087,13 +1097,9 @@ type IssueUser struct { | ||||
| 	ID          int64 `xorm:"pk autoincr"` | ||||
| 	UID         int64 `xorm:"INDEX"` // User ID.
 | ||||
| 	IssueID     int64 | ||||
| 	RepoID      int64 `xorm:"INDEX"` | ||||
| 	MilestoneID int64 | ||||
| 	IsRead      bool | ||||
| 	IsAssigned  bool | ||||
| 	IsMentioned bool | ||||
| 	IsPoster    bool | ||||
| 	IsClosed    bool | ||||
| } | ||||
| 
 | ||||
| func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error { | ||||
| @ -1109,24 +1115,17 @@ func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error { | ||||
| 	// and just waste 1 unit is cheaper than re-allocate memory once.
 | ||||
| 	issueUsers := make([]*IssueUser, 0, len(assignees)+1) | ||||
| 	for _, assignee := range assignees { | ||||
| 		isPoster := assignee.ID == issue.PosterID | ||||
| 		issueUsers = append(issueUsers, &IssueUser{ | ||||
| 			IssueID:    issue.ID, | ||||
| 			RepoID:     repo.ID, | ||||
| 			UID:        assignee.ID, | ||||
| 			IsPoster:   isPoster, | ||||
| 			IsAssigned: assignee.ID == issue.AssigneeID, | ||||
| 		}) | ||||
| 		if !isPosterAssignee && isPoster { | ||||
| 			isPosterAssignee = true | ||||
| 		} | ||||
| 		isPosterAssignee = isPosterAssignee || assignee.ID == issue.PosterID | ||||
| 	} | ||||
| 	if !isPosterAssignee { | ||||
| 		issueUsers = append(issueUsers, &IssueUser{ | ||||
| 			IssueID:  issue.ID, | ||||
| 			RepoID:   repo.ID, | ||||
| 			UID:      issue.PosterID, | ||||
| 			IsPoster: true, | ||||
| 			IssueID: issue.ID, | ||||
| 			UID:     issue.PosterID, | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
| @ -1151,62 +1150,6 @@ func NewIssueUsers(repo *Repository, issue *Issue) (err error) { | ||||
| 	return sess.Commit() | ||||
| } | ||||
| 
 | ||||
| // PairsContains returns true when pairs list contains given issue.
 | ||||
| func PairsContains(ius []*IssueUser, issueID, uid int64) int { | ||||
| 	for i := range ius { | ||||
| 		if ius[i].IssueID == issueID && | ||||
| 			ius[i].UID == uid { | ||||
| 			return i | ||||
| 		} | ||||
| 	} | ||||
| 	return -1 | ||||
| } | ||||
| 
 | ||||
| // GetIssueUsers returns issue-user pairs by given repository and user.
 | ||||
| func GetIssueUsers(rid, uid int64, isClosed bool) ([]*IssueUser, error) { | ||||
| 	ius := make([]*IssueUser, 0, 10) | ||||
| 	err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoID: rid, UID: uid}) | ||||
| 	return ius, err | ||||
| } | ||||
| 
 | ||||
| // GetIssueUserPairsByRepoIds returns issue-user pairs by given repository IDs.
 | ||||
| func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*IssueUser, error) { | ||||
| 	if len(rids) == 0 { | ||||
| 		return []*IssueUser{}, nil | ||||
| 	} | ||||
| 
 | ||||
| 	ius := make([]*IssueUser, 0, 10) | ||||
| 	sess := x. | ||||
| 		Limit(20, (page-1)*20). | ||||
| 		Where("is_closed=?", isClosed). | ||||
| 		In("repo_id", rids) | ||||
| 	err := sess.Find(&ius) | ||||
| 	return ius, err | ||||
| } | ||||
| 
 | ||||
| // GetIssueUserPairsByMode returns issue-user pairs by given repository and user.
 | ||||
| func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) { | ||||
| 	ius := make([]*IssueUser, 0, 10) | ||||
| 	sess := x. | ||||
| 		Limit(20, (page-1)*20). | ||||
| 		Where("uid=?", uid). | ||||
| 		And("is_closed=?", isClosed) | ||||
| 	if rid > 0 { | ||||
| 		sess.And("repo_id=?", rid) | ||||
| 	} | ||||
| 
 | ||||
| 	switch filterMode { | ||||
| 	case FilterModeAssign: | ||||
| 		sess.And("is_assigned=?", true) | ||||
| 	case FilterModeCreate: | ||||
| 		sess.And("is_poster=?", true) | ||||
| 	default: | ||||
| 		return ius, nil | ||||
| 	} | ||||
| 	err := sess.Find(&ius) | ||||
| 	return ius, err | ||||
| } | ||||
| 
 | ||||
| // UpdateIssueMentions extracts mentioned people from content and
 | ||||
| // updates issue-user relations for them.
 | ||||
| func UpdateIssueMentions(e Engine, issueID int64, mentions []string) error { | ||||
| @ -1436,16 +1379,6 @@ func UpdateIssue(issue *Issue) error { | ||||
| 	return updateIssue(x, issue) | ||||
| } | ||||
| 
 | ||||
| func updateIssueUsersByStatus(e Engine, issueID int64, isClosed bool) error { | ||||
| 	_, err := e.Exec("UPDATE `issue_user` SET is_closed=? WHERE issue_id=?", isClosed, issueID) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // UpdateIssueUsersByStatus updates issue-user relations by issue status.
 | ||||
| func UpdateIssueUsersByStatus(issueID int64, isClosed bool) error { | ||||
| 	return updateIssueUsersByStatus(x, issueID, isClosed) | ||||
| } | ||||
| 
 | ||||
| func updateIssueUserByAssignee(e *xorm.Session, issue *Issue) (err error) { | ||||
| 	if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?", false, issue.ID); err != nil { | ||||
| 		return err | ||||
| @ -1790,8 +1723,6 @@ func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilesto | ||||
| 
 | ||||
| 		if err = updateMilestone(e, m); err != nil { | ||||
| 			return err | ||||
| 		} else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?", issue.ID); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -1808,8 +1739,6 @@ func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilesto | ||||
| 
 | ||||
| 		if err = updateMilestone(e, m); err != nil { | ||||
| 			return err | ||||
| 		} else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?", m.ID, issue.ID); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -1873,8 +1802,6 @@ func DeleteMilestoneByRepoID(repoID, id int64) error { | ||||
| 
 | ||||
| 	if _, err = sess.Exec("UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { | ||||
| 		return err | ||||
| 	} else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return sess.Commit() | ||||
| } | ||||
|  | ||||
| @ -1424,7 +1424,6 @@ func DeleteRepository(uid, repoID int64) error { | ||||
| 		&Watch{RepoID: repoID}, | ||||
| 		&Star{RepoID: repoID}, | ||||
| 		&Mirror{RepoID: repoID}, | ||||
| 		&IssueUser{RepoID: repoID}, | ||||
| 		&Milestone{RepoID: repoID}, | ||||
| 		&Release{RepoID: repoID}, | ||||
| 		&Collaboration{RepoID: repoID}, | ||||
| @ -1445,6 +1444,9 @@ func DeleteRepository(uid, repoID int64) error { | ||||
| 		if _, err = sess.Delete(&Comment{IssueID: issues[i].ID}); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err = sess.Delete(&IssueUser{IssueID: issues[i].ID}); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
| 		attachments := make([]*Attachment, 0, 5) | ||||
| 		if err = sess. | ||||
|  | ||||
| @ -213,26 +213,14 @@ func Issues(ctx *context.Context) { | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Get issue-user relations.
 | ||||
| 	pairs, err := models.GetIssueUsers(repo.ID, posterID, isShowClosed) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetIssueUsers", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Get posters.
 | ||||
| 	for i := range issues { | ||||
| 		// Check read status
 | ||||
| 		if !ctx.IsSigned { | ||||
| 			issues[i].IsRead = true | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		// Check read status.
 | ||||
| 		idx := models.PairsContains(pairs, issues[i].ID, ctx.User.ID) | ||||
| 		if idx > -1 { | ||||
| 			issues[i].IsRead = pairs[idx].IsRead | ||||
| 		} else { | ||||
| 			issues[i].IsRead = true | ||||
| 		} else if err = issues[i].GetIsRead(ctx.User.ID); err != nil { | ||||
| 			ctx.Handle(500, "GetIsRead", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	ctx.Data["Issues"] = issues | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user