diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2019-02-21 13:01:28 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-21 13:01:28 +0800 |
commit | 477ef462510d69a8a31e008fb6e64059dc6cc148 (patch) | |
tree | 2c7884ad454e6301d71e6f5ed3fc2247a190dedc /models | |
parent | 0751153613bfd2e39cf28e83bbe04b76641d222f (diff) | |
download | gitea-477ef462510d69a8a31e008fb6e64059dc6cc148.tar.gz gitea-477ef462510d69a8a31e008fb6e64059dc6cc148.zip |
Add more tests and docs for issue indexer, add db indexer type for searching from database (#6144)
* add more tests and docs for issue indexer, add db indexer type for searching from database
* fix typo
* fix typo
* fix lint
* improve docs
Diffstat (limited to 'models')
-rw-r--r-- | models/issue.go | 34 | ||||
-rw-r--r-- | models/issue_test.go | 25 |
2 files changed, 59 insertions, 0 deletions
diff --git a/models/issue.go b/models/issue.go index 8de26c2b15..503ff32b8e 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1684,6 +1684,40 @@ func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen return openResult, closedResult } +// SearchIssueIDsByKeyword search issues on database +func SearchIssueIDsByKeyword(kw string, repoID int64, limit, start int) (int64, []int64, error) { + var repoCond = builder.Eq{"repo_id": repoID} + var subQuery = builder.Select("id").From("issue").Where(repoCond) + var cond = builder.And( + repoCond, + builder.Or( + builder.Like{"name", kw}, + builder.Like{"content", kw}, + builder.In("id", builder.Select("issue_id"). + From("comment"). + Where(builder.And( + builder.Eq{"type": CommentTypeComment}, + builder.In("issue_id", subQuery), + builder.Like{"content", kw}, + )), + ), + ), + ) + + var ids = make([]int64, 0, limit) + err := x.Distinct("id").Table("issue").Where(cond).Limit(limit, start).Find(&ids) + if err != nil { + return 0, nil, err + } + + total, err := x.Distinct("id").Table("issue").Where(cond).Count() + if err != nil { + return 0, nil, err + } + + return total, ids, nil +} + func updateIssue(e Engine, issue *Issue) error { _, err := e.ID(issue.ID).AllCols().Update(issue) if err != nil { diff --git a/models/issue_test.go b/models/issue_test.go index cec7e8b478..1a7e45ae02 100644 --- a/models/issue_test.go +++ b/models/issue_test.go @@ -295,3 +295,28 @@ func TestIssue_loadTotalTimes(t *testing.T) { assert.NoError(t, ms.loadTotalTimes(x)) assert.Equal(t, int64(3662), ms.TotalTrackedTime) } + +func TestIssue_SearchIssueIDsByKeyword(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + total, ids, err := SearchIssueIDsByKeyword("issue2", 1, 10, 0) + assert.NoError(t, err) + assert.EqualValues(t, 1, total) + assert.EqualValues(t, []int64{2}, ids) + + total, ids, err = SearchIssueIDsByKeyword("first", 1, 10, 0) + assert.NoError(t, err) + assert.EqualValues(t, 1, total) + assert.EqualValues(t, []int64{1}, ids) + + total, ids, err = SearchIssueIDsByKeyword("for", 1, 10, 0) + assert.NoError(t, err) + assert.EqualValues(t, 4, total) + assert.EqualValues(t, []int64{1, 2, 3, 5}, ids) + + // issue1's comment id 2 + total, ids, err = SearchIssueIDsByKeyword("good", 1, 10, 0) + assert.NoError(t, err) + assert.EqualValues(t, 1, total) + assert.EqualValues(t, []int64{1}, ids) +} |