code.gitea.io/gitea@v1.22.3/models/migrations/v1_22/v283.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package v1_22 //nolint 5 6 import ( 7 "fmt" 8 9 "xorm.io/xorm" 10 "xorm.io/xorm/schemas" 11 ) 12 13 func AddCombinedIndexToIssueUser(x *xorm.Engine) error { 14 type OldIssueUser struct { 15 IssueID int64 16 UID int64 17 Cnt int64 18 } 19 20 var duplicatedIssueUsers []OldIssueUser 21 if err := x.SQL("select * from (select issue_id, uid, count(1) as cnt from issue_user group by issue_id, uid) a where a.cnt > 1"). 22 Find(&duplicatedIssueUsers); err != nil { 23 return err 24 } 25 for _, issueUser := range duplicatedIssueUsers { 26 if x.Dialect().URI().DBType == schemas.MSSQL { 27 if _, err := x.Exec(fmt.Sprintf("delete from issue_user where id in (SELECT top %d id FROM issue_user WHERE issue_id = ? and uid = ?)", issueUser.Cnt-1), issueUser.IssueID, issueUser.UID); err != nil { 28 return err 29 } 30 } else { 31 var ids []int64 32 if err := x.SQL("SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1).Find(&ids); err != nil { 33 return err 34 } 35 if _, err := x.Table("issue_user").In("id", ids).Delete(); err != nil { 36 return err 37 } 38 } 39 } 40 41 type IssueUser struct { 42 UID int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID. 43 IssueID int64 `xorm:"INDEX unique(uid_to_issue)"` 44 } 45 46 return x.Sync(&IssueUser{}) 47 }