Skip to content

Commit 484fe07

Browse files
DuckDuckWhalelafrikswxiaoguang
authored
Fix: unstable sort skips/duplicates issues across pages (#18095)
When viewing issues in sorted order, some issues are duplicated across pages and some are missing. This is caused by the lack of tie-breakers in database queries, making pagination inconsistent. Co-authored-by: Lauris BH <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
1 parent de3216e commit 484fe07

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

models/issue.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,35 +1145,43 @@ type IssuesOptions struct {
11451145
func sortIssuesSession(sess *xorm.Session, sortType string, priorityRepoID int64) {
11461146
switch sortType {
11471147
case "oldest":
1148-
sess.Asc("issue.created_unix")
1148+
sess.Asc("issue.created_unix").Asc("issue.id")
11491149
case "recentupdate":
1150-
sess.Desc("issue.updated_unix")
1150+
sess.Desc("issue.updated_unix").Desc("issue.created_unix").Desc("issue.id")
11511151
case "leastupdate":
1152-
sess.Asc("issue.updated_unix")
1152+
sess.Asc("issue.updated_unix").Asc("issue.created_unix").Asc("issue.id")
11531153
case "mostcomment":
1154-
sess.Desc("issue.num_comments")
1154+
sess.Desc("issue.num_comments").Desc("issue.created_unix").Desc("issue.id")
11551155
case "leastcomment":
1156-
sess.Asc("issue.num_comments")
1156+
sess.Asc("issue.num_comments").Desc("issue.created_unix").Desc("issue.id")
11571157
case "priority":
1158-
sess.Desc("issue.priority")
1158+
sess.Desc("issue.priority").Desc("issue.created_unix").Desc("issue.id")
11591159
case "nearduedate":
11601160
// 253370764800 is 01/01/9999 @ 12:00am (UTC)
11611161
sess.Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
11621162
OrderBy("CASE " +
11631163
"WHEN issue.deadline_unix = 0 AND (milestone.deadline_unix = 0 OR milestone.deadline_unix IS NULL) THEN 253370764800 " +
11641164
"WHEN milestone.deadline_unix = 0 OR milestone.deadline_unix IS NULL THEN issue.deadline_unix " +
11651165
"WHEN milestone.deadline_unix < issue.deadline_unix OR issue.deadline_unix = 0 THEN milestone.deadline_unix " +
1166-
"ELSE issue.deadline_unix END ASC")
1166+
"ELSE issue.deadline_unix END ASC").
1167+
Desc("issue.created_unix").
1168+
Desc("issue.id")
11671169
case "farduedate":
11681170
sess.Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
11691171
OrderBy("CASE " +
11701172
"WHEN milestone.deadline_unix IS NULL THEN issue.deadline_unix " +
11711173
"WHEN milestone.deadline_unix < issue.deadline_unix OR issue.deadline_unix = 0 THEN milestone.deadline_unix " +
1172-
"ELSE issue.deadline_unix END DESC")
1174+
"ELSE issue.deadline_unix END DESC").
1175+
Desc("issue.created_unix").
1176+
Desc("issue.id")
11731177
case "priorityrepo":
1174-
sess.OrderBy("CASE WHEN issue.repo_id = " + strconv.FormatInt(priorityRepoID, 10) + " THEN 1 ELSE 2 END, issue.created_unix DESC")
1178+
sess.OrderBy("CASE " +
1179+
"WHEN issue.repo_id = " + strconv.FormatInt(priorityRepoID, 10) + " THEN 1 " +
1180+
"ELSE 2 END ASC").
1181+
Desc("issue.created_unix").
1182+
Desc("issue.id")
11751183
default:
1176-
sess.Desc("issue.created_unix")
1184+
sess.Desc("issue.created_unix").Desc("issue.id")
11771185
}
11781186
}
11791187

0 commit comments

Comments
 (0)