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:
		
							parent
							
								
									e85db6c8c3
								
							
						
					
					
						commit
						e08f1a9cbd
					
				
					 6 changed files with 100 additions and 2 deletions
				
			
		| 
						 | 
					@ -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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue