Skip to content

Commit ce2287f

Browse files
committed
Make index matched issues in the front of other keyword matched issues
1 parent a52720b commit ce2287f

File tree

2 files changed

+94
-28
lines changed

2 files changed

+94
-28
lines changed

models/issues/issue.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,29 @@ func GetIssueByIndex(ctx context.Context, repoID, index int64) (*Issue, error) {
501501
return issue, nil
502502
}
503503

504+
func FindIssuesWithIndexPrefix(ctx context.Context, repoID, index int64, pageSize int) ([]*Issue, error) {
505+
issues := make([]*Issue, 0, pageSize)
506+
var cond string
507+
switch {
508+
case setting.Database.Type.IsSQLite3():
509+
cond = "CAST(`index` AS TEXT) LIKE ?"
510+
case setting.Database.Type.IsMySQL():
511+
cond = "CAST(`index` AS CHAR) LIKE ?"
512+
case setting.Database.Type.IsPostgreSQL():
513+
cond = "index::TEXT LIKE ?"
514+
case setting.Database.Type.IsMSSQL():
515+
cond = "CAST([index] AS VARCHAR) LIKE ?"
516+
}
517+
518+
err := db.GetEngine(ctx).Where("repo_id = ?", repoID).
519+
And("`index` <> ?", index).
520+
And(cond, fmt.Sprintf("%d%%", index)).
521+
OrderBy("`index` ASC").
522+
Limit(pageSize).
523+
Find(&issues)
524+
return issues, err
525+
}
526+
504527
// GetIssueWithAttrsByIndex returns issue by index in a repository.
505528
func GetIssueWithAttrsByIndex(ctx context.Context, repoID, index int64) (*Issue, error) {
506529
issue, err := GetIssueByIndex(ctx, repoID, index)

routers/web/repo/issue_suggestions.go

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ package repo
55

66
import (
77
"net/http"
8+
"sort"
9+
"strconv"
810

911
"code.gitea.io/gitea/models/db"
1012
issues_model "code.gitea.io/gitea/models/issues"
@@ -29,31 +31,78 @@ func IssueSuggestions(ctx *context.Context) {
2931
isPull = optional.Some(false)
3032
}
3133

32-
searchOpt := &issue_indexer.SearchOptions{
33-
Paginator: &db.ListOptions{
34-
Page: 0,
35-
PageSize: 5,
36-
},
37-
Keyword: keyword,
38-
RepoIDs: []int64{ctx.Repo.Repository.ID},
39-
IsPull: isPull,
40-
IsClosed: nil,
41-
SortBy: issue_indexer.SortByUpdatedDesc,
34+
indexKeyword, _ := strconv.ParseInt(keyword, 10, 64)
35+
pageSize := 5
36+
issues := make(issues_model.IssueList, 0, pageSize)
37+
if indexKeyword > 0 {
38+
issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, indexKeyword)
39+
if err != nil && !issues_model.IsErrIssueNotExist(err) {
40+
ctx.ServerError("GetIssueByIndex", err)
41+
return
42+
}
43+
if issue != nil {
44+
pageSize--
45+
}
46+
47+
issues, err = issues_model.FindIssuesWithIndexPrefix(ctx, ctx.Repo.Repository.ID, indexKeyword, pageSize)
48+
if err != nil {
49+
ctx.ServerError("FindIssuesWithIndexPrefix", err)
50+
return
51+
}
52+
pageSize -= len(issues)
53+
if issue != nil {
54+
issues = append([]*issues_model.Issue{issue}, issues...)
55+
}
4256
}
4357

44-
ids, _, err := issue_indexer.SearchIssues(ctx, searchOpt)
45-
if err != nil {
46-
ctx.ServerError("SearchIssues", err)
47-
return
58+
if pageSize > 0 {
59+
searchOpt := &issue_indexer.SearchOptions{
60+
Paginator: &db.ListOptions{
61+
Page: 0,
62+
PageSize: pageSize,
63+
},
64+
Keyword: keyword,
65+
RepoIDs: []int64{ctx.Repo.Repository.ID},
66+
IsPull: isPull,
67+
IsClosed: nil,
68+
SortBy: issue_indexer.SortByUpdatedDesc,
69+
}
70+
71+
ids, _, err := issue_indexer.SearchIssues(ctx, searchOpt)
72+
if err != nil {
73+
ctx.ServerError("SearchIssues", err)
74+
return
75+
}
76+
77+
for i := 0; i < len(ids); i++ {
78+
for _, issue := range issues {
79+
if ids[i] == issue.ID {
80+
ids = append(ids[:i], ids[i+1:]...)
81+
i--
82+
break
83+
}
84+
}
85+
}
86+
87+
if len(ids) > 0 {
88+
newIssues, err := issues_model.GetIssuesByIDs(ctx, ids, true)
89+
if err != nil {
90+
ctx.ServerError("FindIssuesByIDs", err)
91+
return
92+
}
93+
sort.Slice(newIssues, func(i, j int) bool {
94+
return newIssues[i].Index > newIssues[j].Index
95+
})
96+
issues = append(issues, newIssues...)
97+
}
4898
}
49-
issues, err := issues_model.GetIssuesByIDs(ctx, ids, true)
50-
if err != nil {
51-
ctx.ServerError("FindIssuesByIDs", err)
99+
100+
if err := issues.LoadPullRequests(ctx); err != nil {
101+
ctx.ServerError("LoadPullRequests", err)
52102
return
53103
}
54104

55105
suggestions := make([]*structs.Issue, 0, len(issues))
56-
57106
for _, issue := range issues {
58107
suggestion := &structs.Issue{
59108
ID: issue.ID,
@@ -62,16 +111,10 @@ func IssueSuggestions(ctx *context.Context) {
62111
State: issue.State(),
63112
}
64113

65-
if issue.IsPull {
66-
if err := issue.LoadPullRequest(ctx); err != nil {
67-
ctx.ServerError("LoadPullRequest", err)
68-
return
69-
}
70-
if issue.PullRequest != nil {
71-
suggestion.PullRequest = &structs.PullRequestMeta{
72-
HasMerged: issue.PullRequest.HasMerged,
73-
IsWorkInProgress: issue.PullRequest.IsWorkInProgress(ctx),
74-
}
114+
if issue.IsPull && issue.PullRequest != nil {
115+
suggestion.PullRequest = &structs.PullRequestMeta{
116+
HasMerged: issue.PullRequest.HasMerged,
117+
IsWorkInProgress: issue.PullRequest.IsWorkInProgress(ctx),
75118
}
76119
}
77120

0 commit comments

Comments
 (0)