|
|
|
@ -15,6 +15,7 @@ import (
|
|
|
|
|
"code.gitea.io/gitea/modules/util"
|
|
|
|
|
|
|
|
|
|
"xorm.io/builder"
|
|
|
|
|
"xorm.io/xorm"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// TrackedTime represents a time that was spent for a specific issue.
|
|
|
|
@ -325,3 +326,46 @@ func GetTrackedTimeByID(ctx context.Context, id int64) (*TrackedTime, error) {
|
|
|
|
|
}
|
|
|
|
|
return time, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetIssueTotalTrackedTime returns the total tracked time for issues by given conditions.
|
|
|
|
|
func GetIssueTotalTrackedTime(ctx context.Context, opts *IssuesOptions, isClosed bool) (int64, error) {
|
|
|
|
|
if len(opts.IssueIDs) <= MaxQueryParameters {
|
|
|
|
|
return getIssueTotalTrackedTimeChunk(ctx, opts, isClosed, opts.IssueIDs)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If too long a list of IDs is provided,
|
|
|
|
|
// we get the statistics in smaller chunks and get accumulates
|
|
|
|
|
var accum int64
|
|
|
|
|
for i := 0; i < len(opts.IssueIDs); {
|
|
|
|
|
chunk := i + MaxQueryParameters
|
|
|
|
|
if chunk > len(opts.IssueIDs) {
|
|
|
|
|
chunk = len(opts.IssueIDs)
|
|
|
|
|
}
|
|
|
|
|
time, err := getIssueTotalTrackedTimeChunk(ctx, opts, isClosed, opts.IssueIDs[i:chunk])
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
accum += time
|
|
|
|
|
i = chunk
|
|
|
|
|
}
|
|
|
|
|
return accum, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func getIssueTotalTrackedTimeChunk(ctx context.Context, opts *IssuesOptions, isClosed bool, issueIDs []int64) (int64, error) {
|
|
|
|
|
sumSession := func(opts *IssuesOptions, issueIDs []int64) *xorm.Session {
|
|
|
|
|
sess := db.GetEngine(ctx).
|
|
|
|
|
Table("tracked_time").
|
|
|
|
|
Where("tracked_time.deleted = ?", false).
|
|
|
|
|
Join("INNER", "issue", "tracked_time.issue_id = issue.id")
|
|
|
|
|
|
|
|
|
|
return applyIssuesOptions(sess, opts, issueIDs)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type trackedTime struct {
|
|
|
|
|
Time int64
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sumSession(opts, issueIDs).
|
|
|
|
|
And("issue.is_closed = ?", isClosed).
|
|
|
|
|
SumInt(new(trackedTime), "tracked_time.time")
|
|
|
|
|
}
|
|
|
|
|