diff options
author | David Svantesson <davidsvantesson@gmail.com> | 2019-08-25 19:06:36 +0200 |
---|---|---|
committer | Lauris BH <lauris@nix.lv> | 2019-08-25 20:06:36 +0300 |
commit | c9546d4cdd5f7de8f56b7d4a9806d1aca784cf3f (patch) | |
tree | eebd4affa86ae9d75b41590453a07af42db31fb0 /models | |
parent | 8c24bb9e4344791ca2e8c66efcf3d45881365a5d (diff) | |
download | gitea-c9546d4cdd5f7de8f56b7d4a9806d1aca784cf3f.tar.gz gitea-c9546d4cdd5f7de8f56b7d4a9806d1aca784cf3f.zip |
Include description in repository search. (#7942)
* Add description in repository search.
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Refactor SearchRepositoryByName with a general function SearchRepository
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Allow to specify if description shall be included in API repo search.
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Add new app.ini setting for whether to search within repo description.
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Search keyword in description (if setting enabled) on:
- Explore page
- Organization profile page
- User profile page
- Admin repo page
Do not search keyword in description on:
- Any non-keyword search (not relevant)
- Incremental search (uses API)
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Put parameters related to keyword directly after it
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Add test cases for including (and not including) repository description in search.
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Rename test function from TestSearchRepositoryByName to TestSearchRepository.
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
* Make setting SEARCH_REPO_DESCRIPTION default to true
Signed-off-by: David Svantesson <davidsvantesson@gmail.com>
Diffstat (limited to 'models')
-rw-r--r-- | models/fixtures/repository.yml | 1 | ||||
-rw-r--r-- | models/repo_list.go | 16 | ||||
-rw-r--r-- | models/repo_list_test.go | 30 |
3 files changed, 44 insertions, 3 deletions
diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index f43fae3d67..16b0045b21 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -165,6 +165,7 @@ owner_id: 14 lower_name: test_repo_14 name: test_repo_14 + description: test_description_14 is_private: false num_issues: 0 num_closed_issues: 0 diff --git a/models/repo_list.go b/models/repo_list.go index ee4266d4e6..692d4d002f 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -136,6 +136,8 @@ type SearchRepoOptions struct { Mirror util.OptionalBool // only search topic name TopicOnly bool + // include description in keyword search + IncludeDescription bool } //SearchOrderBy is used to sort the result @@ -163,9 +165,9 @@ const ( SearchOrderByForksReverse SearchOrderBy = "num_forks DESC" ) -// SearchRepositoryByName takes keyword and part of repository name to search, +// SearchRepository returns repositories based on search options, // it returns results in given range and number of total results. -func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, error) { +func SearchRepository(opts *SearchRepoOptions) (RepositoryList, int64, error) { if opts.Page <= 0 { opts.Page = 1 } @@ -264,6 +266,9 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err var likes = builder.NewCond() for _, v := range strings.Split(opts.Keyword, ",") { likes = likes.Or(builder.Like{"lower_name", strings.ToLower(v)}) + if opts.IncludeDescription { + likes = likes.Or(builder.Like{"LOWER(description)", strings.ToLower(v)}) + } } keywordCond = keywordCond.Or(likes) } @@ -311,6 +316,13 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err return repos, count, nil } +// SearchRepositoryByName takes keyword and part of repository name to search, +// it returns results in given range and number of total results. +func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, error) { + opts.IncludeDescription = false + return SearchRepository(opts) +} + // FindUserAccessibleRepoIDs find all accessible repositories' ID by user's id func FindUserAccessibleRepoIDs(userID int64) ([]int64, error) { var accessCond builder.Cond = builder.Eq{"is_private": false} diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 645de2a59a..76ae9ab3d7 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestSearchRepositoryByName(t *testing.T) { +func TestSearchRepository(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) // test search public repository on explore page @@ -74,6 +74,34 @@ func TestSearchRepositoryByName(t *testing.T) { assert.Empty(t, repos) assert.Equal(t, int64(0), count) + // Test search within description + repos, count, err = SearchRepository(&SearchRepoOptions{ + Keyword: "description_14", + Page: 1, + PageSize: 10, + Collaborate: util.OptionalBoolFalse, + IncludeDescription: true, + }) + + assert.NoError(t, err) + if assert.Len(t, repos, 1) { + assert.Equal(t, "test_repo_14", repos[0].Name) + } + assert.Equal(t, int64(1), count) + + // Test NOT search within description + repos, count, err = SearchRepository(&SearchRepoOptions{ + Keyword: "description_14", + Page: 1, + PageSize: 10, + Collaborate: util.OptionalBoolFalse, + IncludeDescription: false, + }) + + assert.NoError(t, err) + assert.Empty(t, repos) + assert.Equal(t, int64(0), count) + testCases := []struct { name string opts *SearchRepoOptions |