mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	* Divide GetIssueStats query in smaller chunks * Skip chunking if count is low enough * Fix lint * Define maxQueryParameters * Remove absMaxQueryParameters because of lint * Restart CI * Restart CI Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		@@ -1336,6 +1336,36 @@ type IssueStatsOptions struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// GetIssueStats returns issue statistic information by given conditions.
 | 
					// GetIssueStats returns issue statistic information by given conditions.
 | 
				
			||||||
func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
 | 
					func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
 | 
				
			||||||
 | 
						if len(opts.IssueIDs) <= maxQueryParameters {
 | 
				
			||||||
 | 
							return getIssueStatsChunk(opts, opts.IssueIDs)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If too long a list of IDs is provided, we get the statistics in
 | 
				
			||||||
 | 
						// smaller chunks and get accumulates. Note: this could potentially
 | 
				
			||||||
 | 
						// get us invalid results. The alternative is to insert the list of
 | 
				
			||||||
 | 
						// ids in a temporary table and join from them.
 | 
				
			||||||
 | 
						accum := &IssueStats{}
 | 
				
			||||||
 | 
						for i := 0; i < len(opts.IssueIDs); {
 | 
				
			||||||
 | 
							chunk := i + maxQueryParameters
 | 
				
			||||||
 | 
							if chunk > len(opts.IssueIDs) {
 | 
				
			||||||
 | 
								chunk = len(opts.IssueIDs)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							stats, err := getIssueStatsChunk(opts, opts.IssueIDs[i:chunk])
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							accum.OpenCount += stats.OpenCount
 | 
				
			||||||
 | 
							accum.ClosedCount += stats.ClosedCount
 | 
				
			||||||
 | 
							accum.YourRepositoriesCount += stats.YourRepositoriesCount
 | 
				
			||||||
 | 
							accum.AssignCount += stats.AssignCount
 | 
				
			||||||
 | 
							accum.CreateCount += stats.CreateCount
 | 
				
			||||||
 | 
							accum.OpenCount += stats.MentionCount
 | 
				
			||||||
 | 
							i = chunk
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return accum, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats, error) {
 | 
				
			||||||
	stats := &IssueStats{}
 | 
						stats := &IssueStats{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	countSession := func(opts *IssueStatsOptions) *xorm.Session {
 | 
						countSession := func(opts *IssueStatsOptions) *xorm.Session {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,6 +46,12 @@ type Engine interface {
 | 
				
			|||||||
	Asc(colNames ...string) *xorm.Session
 | 
						Asc(colNames ...string) *xorm.Session
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// When queries are broken down in parts because of the number
 | 
				
			||||||
 | 
						// of parameters, attempt to break by this amount
 | 
				
			||||||
 | 
						maxQueryParameters = 300
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	x      *xorm.Engine
 | 
						x      *xorm.Engine
 | 
				
			||||||
	tables []interface{}
 | 
						tables []interface{}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user