diff --git a/modules/indexer/issues/db/db.go b/modules/indexer/issues/db/db.go index 7d3ad075b725..52a231c562e4 100644 --- a/modules/indexer/issues/db/db.go +++ b/modules/indexer/issues/db/db.go @@ -49,7 +49,6 @@ func (i *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( // But the two functions are used in modules/notification/indexer, that means we will import services/indexer in modules/notification/indexer. // So that's the root problem: // The notification is defined in modules, but it's using lots of things should be in services. - cond := builder.NewCond() if options.Keyword != "" { repoCond := builder.In("repo_id", options.RepoIDs) @@ -57,24 +56,22 @@ func (i *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( repoCond = builder.Eq{"repo_id": options.RepoIDs[0]} } - if options.Index.Has() { - cond = builder.And( + subQuery := builder.Select("id").From("issue").Where(repoCond) + cond = builder.Or( + db.BuildCaseInsensitiveLike("issue.name", options.Keyword), + db.BuildCaseInsensitiveLike("issue.content", options.Keyword), + builder.In("issue.id", builder.Select("issue_id"). + From("comment"). + Where(builder.And( + builder.Eq{"type": issue_model.CommentTypeComment}, + builder.In("issue_id", subQuery), + db.BuildCaseInsensitiveLike("content", options.Keyword), + )), + ), + ) + if options.IsKeywordNumeric() { + cond = cond.Or( builder.Eq{"`index`": options.Keyword}, - repoCond, - ) - } else { - subQuery := builder.Select("id").From("issue").Where(repoCond) - cond = builder.Or( - db.BuildCaseInsensitiveLike("issue.name", options.Keyword), - db.BuildCaseInsensitiveLike("issue.content", options.Keyword), - builder.In("issue.id", builder.Select("issue_id"). - From("comment"). - Where(builder.And( - builder.Eq{"type": issue_model.CommentTypeComment}, - builder.In("issue_id", subQuery), - db.BuildCaseInsensitiveLike("content", options.Keyword), - )), - ), ) } } diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go index 9f2e04bddc19..c82dc0867ea4 100644 --- a/modules/indexer/issues/indexer.go +++ b/modules/indexer/issues/indexer.go @@ -8,7 +8,6 @@ import ( "fmt" "os" "runtime/pprof" - "strconv" "sync/atomic" "time" @@ -284,11 +283,7 @@ const ( func SearchIssues(ctx context.Context, opts *SearchOptions) ([]int64, int64, error) { indexer := *globalIndexer.Load() - issueIndex, err := strconv.Atoi(opts.Keyword) - if err == nil { - opts.Index = optional.Option[int64]{int64(issueIndex)} - } - if opts.Keyword == "" || opts.Index.Has() { + if opts.Keyword == "" || opts.IsKeywordNumeric() { // This is a conservative shortcut. // If the keyword is empty or an integer, db has better (at least not worse) performance to filter issues. // When the keyword is empty, it tends to listing rather than searching issues. diff --git a/modules/indexer/issues/internal/model.go b/modules/indexer/issues/internal/model.go index cdf5d1bc29c4..a43c6be00597 100644 --- a/modules/indexer/issues/internal/model.go +++ b/modules/indexer/issues/internal/model.go @@ -4,6 +4,8 @@ package internal import ( + "strconv" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/timeutil" @@ -89,8 +91,6 @@ type SearchOptions struct { MilestoneIDs []int64 // milestones the issues have - Index optional.Option[int64] // keyword as potential issue index - ProjectID optional.Option[int64] // project the issues belong to ProjectColumnID optional.Option[int64] // project column the issues belong to @@ -126,6 +126,12 @@ func (o *SearchOptions) Copy(edit ...func(options *SearchOptions)) *SearchOption return &v } +// used for optimized issue index based search +func (o *SearchOptions) IsKeywordNumeric() bool { + _, err := strconv.Atoi(o.Keyword) + return err == nil +} + type SortBy string const (