Skip to content

Commit 28aacc2

Browse files
committed
fix sql
1 parent 92b7102 commit 28aacc2

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

models/organization/org_worktime.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package organization
55

66
import (
7+
"sort"
8+
79
"code.gitea.io/gitea/models/db"
810

911
"xorm.io/builder"
@@ -31,16 +33,17 @@ func GetWorktimeByRepos(org *Organization, unitFrom, unixTo int64) (results []Wo
3133
}
3234

3335
type WorktimeSumByMilestones struct {
34-
RepoName string
35-
MilestoneName string
36-
MilestoneID int64
37-
SumTime int64
38-
HideRepoName bool
36+
RepoName string
37+
MilestoneName string
38+
MilestoneID int64
39+
MilestoneDeadline int64
40+
SumTime int64
41+
HideRepoName bool
3942
}
4043

4144
func GetWorktimeByMilestones(org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByMilestones, err error) {
4245
err = db.GetEngine(db.DefaultContext).
43-
Select("repository.name AS repo_name, milestone.name AS milestone_name, milestone.id AS milestone_id, SUM(tracked_time.time) AS sum_time").
46+
Select("repository.name AS repo_name, milestone.name AS milestone_name, milestone.id AS milestone_id, milestone.deadline_unix as milestone_deadline, SUM(tracked_time.time) AS sum_time").
4447
Table("tracked_time").
4548
Join("INNER", "issue", "tracked_time.issue_id = issue.id").
4649
Join("INNER", "repository", "issue.repo_id = repository.id").
@@ -52,10 +55,23 @@ func GetWorktimeByMilestones(org *Organization, unitFrom, unixTo int64) (results
5255
GroupBy("repository.name, milestone.name, milestone.deadline_unix, milestone.id").
5356
OrderBy("repository.name, milestone.deadline_unix, milestone.id").
5457
Find(&results)
58+
59+
// TODO: pgsql: NULL values are sorted last in default ascending order, so we need to sort them manually again.
60+
sort.Slice(results, func(i, j int) bool {
61+
if results[i].RepoName != results[j].RepoName {
62+
return results[i].RepoName < results[j].RepoName
63+
}
64+
if results[i].MilestoneDeadline != results[j].MilestoneDeadline {
65+
return results[i].MilestoneDeadline < results[j].MilestoneDeadline
66+
}
67+
return results[i].MilestoneID < results[j].MilestoneID
68+
})
69+
5570
// Show only the first RepoName, for nicer output.
5671
prevRepoName := ""
5772
for i := 0; i < len(results); i++ {
5873
res := &results[i]
74+
res.MilestoneDeadline = 0 // clear the deadline because we do not really need it
5975
if prevRepoName == res.RepoName {
6076
res.HideRepoName = true
6177
}

0 commit comments

Comments
 (0)