mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Add combined index for issue_user.uid and issue_id (#28080)
fixes #27877 --------- Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		| @@ -14,8 +14,8 @@ import ( | |||||||
| // IssueUser represents an issue-user relation. | // IssueUser represents an issue-user relation. | ||||||
| type IssueUser struct { | type IssueUser struct { | ||||||
| 	ID          int64 `xorm:"pk autoincr"` | 	ID          int64 `xorm:"pk autoincr"` | ||||||
| 	UID         int64 `xorm:"INDEX"` // User ID. | 	UID         int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID. | ||||||
| 	IssueID     int64 `xorm:"INDEX"` | 	IssueID     int64 `xorm:"INDEX unique(uid_to_issue)"` | ||||||
| 	IsRead      bool | 	IsRead      bool | ||||||
| 	IsMentioned bool | 	IsMentioned bool | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,20 @@ | |||||||
|  | - | ||||||
|  |   id: 1 | ||||||
|  |   uid: 1 | ||||||
|  |   issue_id: 1 | ||||||
|  |   is_read: true | ||||||
|  |   is_mentioned: false | ||||||
|  |  | ||||||
|  | - | ||||||
|  |   id: 2 | ||||||
|  |   uid: 2 | ||||||
|  |   issue_id: 1 | ||||||
|  |   is_read: true | ||||||
|  |   is_mentioned: false | ||||||
|  |  | ||||||
|  | - | ||||||
|  |   id: 3 | ||||||
|  |   uid: 2 | ||||||
|  |   issue_id: 1 # duplicated with id 2 | ||||||
|  |   is_read: false | ||||||
|  |   is_mentioned: true | ||||||
| @@ -550,6 +550,8 @@ var migrations = []Migration{ | |||||||
| 	NewMigration("Add auth_token table", v1_22.CreateAuthTokenTable), | 	NewMigration("Add auth_token table", v1_22.CreateAuthTokenTable), | ||||||
| 	// v282 -> v283 | 	// v282 -> v283 | ||||||
| 	NewMigration("Add Index to pull_auto_merge.doer_id", v1_22.AddIndexToPullAutoMergeDoerID), | 	NewMigration("Add Index to pull_auto_merge.doer_id", v1_22.AddIndexToPullAutoMergeDoerID), | ||||||
|  | 	// v283 -> v284 | ||||||
|  | 	NewMigration("Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser), | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetCurrentDBVersion returns the current db version | // GetCurrentDBVersion returns the current db version | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								models/migrations/v1_22/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								models/migrations/v1_22/main_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | // Copyright 2023 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package v1_22 //nolint | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/models/migrations/base" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestMain(m *testing.M) { | ||||||
|  | 	base.MainTest(m) | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								models/migrations/v1_22/v283.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								models/migrations/v1_22/v283.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | // Copyright 2023 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package v1_22 //nolint | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func AddCombinedIndexToIssueUser(x *xorm.Engine) error { | ||||||
|  | 	type OldIssueUser struct { | ||||||
|  | 		IssueID int64 | ||||||
|  | 		UID     int64 | ||||||
|  | 		Cnt     int64 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var duplicatedIssueUsers []OldIssueUser | ||||||
|  | 	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"). | ||||||
|  | 		Find(&duplicatedIssueUsers); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	for _, issueUser := range duplicatedIssueUsers { | ||||||
|  | 		if _, err := x.Exec("delete from issue_user where id in (SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?)", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	type IssueUser struct { | ||||||
|  | 		UID     int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID. | ||||||
|  | 		IssueID int64 `xorm:"INDEX unique(uid_to_issue)"` | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return x.Sync(&IssueUser{}) | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								models/migrations/v1_22/v283_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								models/migrations/v1_22/v283_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | // Copyright 2023 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package v1_22 //nolint | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/models/migrations/base" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func Test_AddCombinedIndexToIssueUser(t *testing.T) { | ||||||
|  | 	type IssueUser struct { | ||||||
|  | 		UID     int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID. | ||||||
|  | 		IssueID int64 `xorm:"INDEX unique(uid_to_issue)"` | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Prepare and load the testing database | ||||||
|  | 	x, deferable := base.PrepareTestEnv(t, 0, new(IssueUser)) | ||||||
|  | 	defer deferable() | ||||||
|  | 	if x == nil || t.Failed() { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := AddCombinedIndexToIssueUser(x); err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user