forked from NYANDEV/forgejo
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…
Reference in a new issue