You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

issue_indexer.go 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "fmt"
  7. "code.gitea.io/gitea/modules/indexer/issues"
  8. "code.gitea.io/gitea/modules/log"
  9. "code.gitea.io/gitea/modules/setting"
  10. "code.gitea.io/gitea/modules/util"
  11. )
  12. var (
  13. // issueIndexerUpdateQueue queue of issue ids to be updated
  14. issueIndexerUpdateQueue issues.Queue
  15. issueIndexer issues.Indexer
  16. )
  17. // InitIssueIndexer initialize issue indexer
  18. func InitIssueIndexer() error {
  19. var populate bool
  20. switch setting.Indexer.IssueType {
  21. case "bleve":
  22. issueIndexer = issues.NewBleveIndexer(setting.Indexer.IssuePath)
  23. exist, err := issueIndexer.Init()
  24. if err != nil {
  25. return err
  26. }
  27. populate = !exist
  28. default:
  29. return fmt.Errorf("unknow issue indexer type: %s", setting.Indexer.IssueType)
  30. }
  31. var err error
  32. switch setting.Indexer.IssueIndexerQueueType {
  33. case setting.LevelQueueType:
  34. issueIndexerUpdateQueue, err = issues.NewLevelQueue(
  35. issueIndexer,
  36. setting.Indexer.IssueIndexerQueueDir,
  37. setting.Indexer.IssueIndexerQueueBatchNumber)
  38. if err != nil {
  39. return err
  40. }
  41. case setting.ChannelQueueType:
  42. issueIndexerUpdateQueue = issues.NewChannelQueue(issueIndexer, setting.Indexer.IssueIndexerQueueBatchNumber)
  43. default:
  44. return fmt.Errorf("Unsupported indexer queue type: %v", setting.Indexer.IssueIndexerQueueType)
  45. }
  46. go issueIndexerUpdateQueue.Run()
  47. if populate {
  48. go populateIssueIndexer()
  49. }
  50. return nil
  51. }
  52. // populateIssueIndexer populate the issue indexer with issue data
  53. func populateIssueIndexer() {
  54. for page := 1; ; page++ {
  55. repos, _, err := SearchRepositoryByName(&SearchRepoOptions{
  56. Page: page,
  57. PageSize: RepositoryListDefaultPageSize,
  58. OrderBy: SearchOrderByID,
  59. Private: true,
  60. Collaborate: util.OptionalBoolFalse,
  61. })
  62. if err != nil {
  63. log.Error(4, "SearchRepositoryByName: %v", err)
  64. continue
  65. }
  66. if len(repos) == 0 {
  67. return
  68. }
  69. for _, repo := range repos {
  70. is, err := Issues(&IssuesOptions{
  71. RepoIDs: []int64{repo.ID},
  72. IsClosed: util.OptionalBoolNone,
  73. IsPull: util.OptionalBoolNone,
  74. })
  75. if err != nil {
  76. log.Error(4, "Issues: %v", err)
  77. continue
  78. }
  79. if err = IssueList(is).LoadDiscussComments(); err != nil {
  80. log.Error(4, "LoadComments: %v", err)
  81. continue
  82. }
  83. for _, issue := range is {
  84. UpdateIssueIndexer(issue)
  85. }
  86. }
  87. }
  88. }
  89. // UpdateIssueIndexer add/update an issue to the issue indexer
  90. func UpdateIssueIndexer(issue *Issue) {
  91. var comments []string
  92. for _, comment := range issue.Comments {
  93. if comment.Type == CommentTypeComment {
  94. comments = append(comments, comment.Content)
  95. }
  96. }
  97. issueIndexerUpdateQueue.Push(&issues.IndexerData{
  98. ID: issue.ID,
  99. RepoID: issue.RepoID,
  100. Title: issue.Title,
  101. Content: issue.Content,
  102. Comments: comments,
  103. })
  104. }
  105. // DeleteRepoIssueIndexer deletes repo's all issues indexes
  106. func DeleteRepoIssueIndexer(repo *Repository) {
  107. var ids []int64
  108. ids, err := getIssueIDsByRepoID(x, repo.ID)
  109. if err != nil {
  110. log.Error(4, "getIssueIDsByRepoID failed: %v", err)
  111. return
  112. }
  113. if len(ids) <= 0 {
  114. return
  115. }
  116. issueIndexerUpdateQueue.Push(&issues.IndexerData{
  117. IDs: ids,
  118. IsDelete: true,
  119. })
  120. }
  121. // SearchIssuesByKeyword search issue ids by keywords and repo id
  122. func SearchIssuesByKeyword(repoID int64, keyword string) ([]int64, error) {
  123. var issueIDs []int64
  124. res, err := issueIndexer.Search(keyword, repoID, 1000, 0)
  125. if err != nil {
  126. return nil, err
  127. }
  128. for _, r := range res.Hits {
  129. issueIDs = append(issueIDs, r.ID)
  130. }
  131. return issueIDs, nil
  132. }