@@ -1352,6 +1352,36 @@ type IssueStatsOptions struct {
1352
1352
1353
1353
// GetIssueStats returns issue statistic information by given conditions.
1354
1354
func GetIssueStats (opts * IssueStatsOptions ) (* IssueStats , error ) {
1355
+ if len (opts .IssueIDs ) <= maxQueryParameters {
1356
+ return getIssueStatsChunk (opts , opts .IssueIDs )
1357
+ }
1358
+
1359
+ // If too long a list of IDs is provided, we get the statistics in
1360
+ // smaller chunks and get accumulates. Note: this could potentially
1361
+ // get us invalid results. The alternative is to insert the list of
1362
+ // ids in a temporary table and join from them.
1363
+ accum := & IssueStats {}
1364
+ for i := 0 ; i < len (opts .IssueIDs ); {
1365
+ chunk := i + maxQueryParameters
1366
+ if chunk > len (opts .IssueIDs ) {
1367
+ chunk = len (opts .IssueIDs )
1368
+ }
1369
+ stats , err := getIssueStatsChunk (opts , opts .IssueIDs [i :chunk ])
1370
+ if err != nil {
1371
+ return nil , err
1372
+ }
1373
+ accum .OpenCount += stats .OpenCount
1374
+ accum .ClosedCount += stats .ClosedCount
1375
+ accum .YourRepositoriesCount += stats .YourRepositoriesCount
1376
+ accum .AssignCount += stats .AssignCount
1377
+ accum .CreateCount += stats .CreateCount
1378
+ accum .OpenCount += stats .MentionCount
1379
+ i = chunk
1380
+ }
1381
+ return accum , nil
1382
+ }
1383
+
1384
+ func getIssueStatsChunk (opts * IssueStatsOptions , issueIDs []int64 ) (* IssueStats , error ) {
1355
1385
stats := & IssueStats {}
1356
1386
1357
1387
countSession := func (opts * IssueStatsOptions ) * xorm.Session {
0 commit comments