2020-10-24 17:11:30 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-10-24 17:11:30 +03:00
2022-11-02 11:54:36 +03:00
package v1_14 //nolint
2020-10-24 17:11:30 +03:00
import (
"xorm.io/xorm"
)
2022-11-02 11:54:36 +03:00
func FixRepoTopics ( x * xorm . Engine ) error {
2023-04-20 05:08:01 +03:00
type Topic struct { //nolint:unused
2020-10-24 17:11:30 +03:00
ID int64 ` xorm:"pk autoincr" `
Name string ` xorm:"UNIQUE VARCHAR(25)" `
RepoCount int
}
2023-04-20 05:08:01 +03:00
type RepoTopic struct { //nolint:unused
2020-10-24 17:11:30 +03:00
RepoID int64 ` xorm:"pk" `
TopicID int64 ` xorm:"pk" `
}
type Repository struct {
ID int64 ` xorm:"pk autoincr" `
Topics [ ] string ` xorm:"TEXT JSON" `
}
const batchSize = 100
sess := x . NewSession ( )
defer sess . Close ( )
repos := make ( [ ] * Repository , 0 , batchSize )
topics := make ( [ ] string , 0 , batchSize )
for start := 0 ; ; start += batchSize {
repos = repos [ : 0 ]
if err := sess . Begin ( ) ; err != nil {
return err
}
if err := sess . Limit ( batchSize , start ) . Find ( & repos ) ; err != nil {
return err
}
if len ( repos ) == 0 {
break
}
for _ , repo := range repos {
topics = topics [ : 0 ]
if err := sess . Select ( "name" ) . Table ( "topic" ) .
Join ( "INNER" , "repo_topic" , "repo_topic.topic_id = topic.id" ) .
Where ( "repo_topic.repo_id = ?" , repo . ID ) . Desc ( "topic.repo_count" ) . Find ( & topics ) ; err != nil {
return err
}
repo . Topics = topics
if _ , err := sess . ID ( repo . ID ) . Cols ( "topics" ) . Update ( repo ) ; err != nil {
return err
}
}
if err := sess . Commit ( ) ; err != nil {
return err
}
}
return nil
}