Skip to content

Commit e08f1a9

Browse files
sebastian-sauer6543lunny
authored
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>
1 parent e85db6c commit e08f1a9

File tree

6 files changed

+100
-2
lines changed

6 files changed

+100
-2
lines changed

models/issues/issue_user.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import (
1414
// IssueUser represents an issue-user relation.
1515
type IssueUser struct {
1616
ID int64 `xorm:"pk autoincr"`
17-
UID int64 `xorm:"INDEX"` // User ID.
18-
IssueID int64 `xorm:"INDEX"`
17+
UID int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID.
18+
IssueID int64 `xorm:"INDEX unique(uid_to_issue)"`
1919
IsRead bool
2020
IsMentioned bool
2121
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-
2+
id: 1
3+
uid: 1
4+
issue_id: 1
5+
is_read: true
6+
is_mentioned: false
7+
8+
-
9+
id: 2
10+
uid: 2
11+
issue_id: 1
12+
is_read: true
13+
is_mentioned: false
14+
15+
-
16+
id: 3
17+
uid: 2
18+
issue_id: 1 # duplicated with id 2
19+
is_read: false
20+
is_mentioned: true

models/migrations/migrations.go

+2
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,8 @@ var migrations = []Migration{
550550
NewMigration("Add auth_token table", v1_22.CreateAuthTokenTable),
551551
// v282 -> v283
552552
NewMigration("Add Index to pull_auto_merge.doer_id", v1_22.AddIndexToPullAutoMergeDoerID),
553+
// v283 -> v284
554+
NewMigration("Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser),
553555
}
554556

555557
// GetCurrentDBVersion returns the current db version

models/migrations/v1_22/main_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_22 //nolint
5+
6+
import (
7+
"testing"
8+
9+
"code.gitea.io/gitea/models/migrations/base"
10+
)
11+
12+
func TestMain(m *testing.M) {
13+
base.MainTest(m)
14+
}

models/migrations/v1_22/v283.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_22 //nolint
5+
6+
import (
7+
"xorm.io/xorm"
8+
)
9+
10+
func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
11+
type OldIssueUser struct {
12+
IssueID int64
13+
UID int64
14+
Cnt int64
15+
}
16+
17+
var duplicatedIssueUsers []OldIssueUser
18+
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").
19+
Find(&duplicatedIssueUsers); err != nil {
20+
return err
21+
}
22+
for _, issueUser := range duplicatedIssueUsers {
23+
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 {
24+
return err
25+
}
26+
}
27+
28+
type IssueUser struct {
29+
UID int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID.
30+
IssueID int64 `xorm:"INDEX unique(uid_to_issue)"`
31+
}
32+
33+
return x.Sync(&IssueUser{})
34+
}

models/migrations/v1_22/v283_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_22 //nolint
5+
6+
import (
7+
"testing"
8+
9+
"code.gitea.io/gitea/models/migrations/base"
10+
)
11+
12+
func Test_AddCombinedIndexToIssueUser(t *testing.T) {
13+
type IssueUser struct {
14+
UID int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID.
15+
IssueID int64 `xorm:"INDEX unique(uid_to_issue)"`
16+
}
17+
18+
// Prepare and load the testing database
19+
x, deferable := base.PrepareTestEnv(t, 0, new(IssueUser))
20+
defer deferable()
21+
if x == nil || t.Failed() {
22+
return
23+
}
24+
25+
if err := AddCombinedIndexToIssueUser(x); err != nil {
26+
t.Fatal(err)
27+
}
28+
}

0 commit comments

Comments
 (0)