code.gitea.io/gitea@v1.21.7/models/migrations/v1_13/v143.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package v1_13 //nolint
     5  
     6  import (
     7  	"code.gitea.io/gitea/modules/log"
     8  
     9  	"xorm.io/xorm"
    10  )
    11  
    12  func RecalculateStars(x *xorm.Engine) (err error) {
    13  	// because of issue https://github.com/go-gitea/gitea/issues/11949,
    14  	// recalculate Stars number for all users to fully fix it.
    15  
    16  	type User struct {
    17  		ID int64 `xorm:"pk autoincr"`
    18  	}
    19  
    20  	const batchSize = 100
    21  	sess := x.NewSession()
    22  	defer sess.Close()
    23  
    24  	for start := 0; ; start += batchSize {
    25  		users := make([]User, 0, batchSize)
    26  		if err := sess.Limit(batchSize, start).Where("type = ?", 0).Cols("id").Find(&users); err != nil {
    27  			return err
    28  		}
    29  		if len(users) == 0 {
    30  			break
    31  		}
    32  
    33  		if err := sess.Begin(); err != nil {
    34  			return err
    35  		}
    36  
    37  		for _, user := range users {
    38  			if _, err := sess.Exec("UPDATE `user` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE uid=?) WHERE id=?", user.ID, user.ID); err != nil {
    39  				return err
    40  			}
    41  		}
    42  
    43  		if err := sess.Commit(); err != nil {
    44  			return err
    45  		}
    46  	}
    47  
    48  	log.Debug("recalculate Stars number for all user finished")
    49  
    50  	return err
    51  }