DocumentSearchResult.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package models
  2. import (
  3. "time"
  4. "github.com/astaxie/beego/orm"
  5. "github.com/astaxie/beego"
  6. )
  7. type DocumentSearchResult struct {
  8. DocumentId int `json:"doc_id"`
  9. DocumentName string `json:"doc_name"`
  10. // Identify 文档唯一标识
  11. Identify string `json:"identify"`
  12. Description string `json:"description"`
  13. Author string `json:"author"`
  14. ModifyTime time.Time `json:"modify_time"`
  15. CreateTime time.Time `json:"create_time"`
  16. BookId int `json:"book_id"`
  17. BookName string `json:"book_name"`
  18. BookIdentify string `json:"book_identify"`
  19. SearchType string `json:"search_type"`
  20. }
  21. func NewDocumentSearchResult() *DocumentSearchResult {
  22. return &DocumentSearchResult{}
  23. }
  24. //分页全局搜索.
  25. func (m *DocumentSearchResult) FindToPager(keyword string, pageIndex, pageSize, memberId int) (searchResult []*DocumentSearchResult, totalCount int, err error) {
  26. o := orm.NewOrm()
  27. offset := (pageIndex - 1) * pageSize
  28. keyword = "%" + keyword + "%"
  29. if memberId <= 0 {
  30. sql1 := `SELECT count(doc.document_id) as total_count FROM md_documents AS doc
  31. LEFT JOIN md_books as book ON doc.book_id = book.book_id
  32. WHERE book.privately_owned = 0 AND (doc.document_name LIKE ? OR doc.release LIKE ?) `
  33. sql2 := `SELECT *
  34. FROM (
  35. SELECT
  36. doc.document_id,
  37. doc.modify_time,
  38. doc.create_time,
  39. doc.document_name,
  40. doc.identify,
  41. doc.release AS description,
  42. book.identify AS book_identify,
  43. book.book_name,
  44. rel.member_id,
  45. member.account AS author,
  46. 'document' AS search_type
  47. FROM md_documents AS doc
  48. LEFT JOIN md_books AS book ON doc.book_id = book.book_id
  49. LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
  50. LEFT JOIN md_members AS member ON rel.member_id = member.member_id
  51. WHERE book.privately_owned = 0 AND (doc.document_name LIKE ? OR doc.release LIKE ?)
  52. UNION ALL
  53. SELECT
  54. blog.blog_id,
  55. blog.modify_time,
  56. blog.create_time,
  57. blog.blog_title,
  58. blog.blog_identify,
  59. blog.blog_release,
  60. blog.blog_identify,
  61. blog.blog_title,
  62. blog.member_id,
  63. member.account,
  64. 'blog' AS search_type
  65. FROM md_blogs AS blog
  66. LEFT JOIN md_members AS member ON blog.member_id = member.member_id
  67. WHERE blog.blog_status = 'public' AND (blog.blog_release LIKE ? OR blog.blog_title LIKE ?)
  68. ) AS union_table
  69. ORDER BY create_time DESC
  70. LIMIT ?, ?;`
  71. err = o.Raw(sql1, keyword, keyword).QueryRow(&totalCount)
  72. if err != nil {
  73. beego.Error("查询搜索结果失败 -> ",err)
  74. return
  75. }
  76. sql3 := ` SELECT
  77. count(*)
  78. FROM md_blogs AS blog
  79. WHERE blog.blog_status = 'public' AND (blog.blog_release LIKE ? OR blog.blog_title LIKE ?);`
  80. c := 0
  81. err = o.Raw(sql3, keyword, keyword).QueryRow(&c)
  82. if err != nil {
  83. beego.Error("查询搜索结果失败 -> ",err)
  84. return
  85. }
  86. totalCount += c
  87. _, err = o.Raw(sql2, keyword, keyword,keyword,keyword, offset, pageSize).QueryRows(&searchResult)
  88. if err != nil {
  89. beego.Error("查询搜索结果失败 -> ",err)
  90. return
  91. }
  92. } else {
  93. sql1 := `SELECT count(doc.document_id) as total_count FROM md_documents AS doc
  94. LEFT JOIN md_books as book ON doc.book_id = book.book_id
  95. LEFT JOIN md_relationship AS rel ON doc.book_id = rel.book_id AND rel.role_id = 0
  96. LEFT JOIN md_relationship AS rel1 ON doc.book_id = rel1.book_id AND rel1.member_id = ?
  97. left join (select * from (select book_id,team_member_id,role_id
  98. from md_team_relationship as mtr
  99. left join md_team_member as mtm on mtm.team_id=mtr.team_id and mtm.member_id=? order by role_id desc )as t group by t.role_id,t.team_member_id,t.book_id) as team
  100. on team.book_id = book.book_id
  101. WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 or team.team_member_id > 0) AND (doc.document_name LIKE ? OR doc.release LIKE ?) `
  102. sql2 := `SELECT *
  103. FROM (
  104. SELECT
  105. doc.document_id,
  106. doc.modify_time,
  107. doc.create_time,
  108. doc.document_name,
  109. doc.identify,
  110. doc.release AS description,
  111. book.identify AS book_identify,
  112. book.book_name,
  113. rel.member_id,
  114. member.account AS author,
  115. 'document' AS search_type
  116. FROM md_documents AS doc
  117. LEFT JOIN md_books AS book ON doc.book_id = book.book_id
  118. LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
  119. LEFT JOIN md_members AS member ON rel.member_id = member.member_id
  120. LEFT JOIN md_relationship AS rel1 ON doc.book_id = rel1.book_id AND rel1.member_id = ?
  121. LEFT JOIN (SELECT *
  122. FROM (SELECT
  123. book_id,
  124. team_member_id,
  125. role_id
  126. FROM md_team_relationship AS mtr
  127. LEFT JOIN md_team_member AS mtm ON mtm.team_id = mtr.team_id AND mtm.member_id = ?
  128. ORDER BY role_id DESC) AS t
  129. GROUP BY t.role_id, t.team_member_id, t.book_id) AS team
  130. ON team.book_id = book.book_id
  131. WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 OR team.team_member_id > 0) AND
  132. (doc.document_name LIKE ? OR doc.release LIKE ?)
  133. UNION ALL
  134. SELECT
  135. blog.blog_id,
  136. blog.modify_time,
  137. blog.create_time,
  138. blog.blog_title,
  139. blog.blog_identify,
  140. blog.blog_release,
  141. blog.blog_identify,
  142. blog.blog_title,
  143. blog.member_id,
  144. member.account,
  145. 'blog' AS search_type
  146. FROM md_blogs AS blog
  147. LEFT JOIN md_members AS member ON blog.member_id = member.member_id
  148. WHERE (blog.blog_status = 'public' OR blog.member_id = ?) AND blog.blog_type = 0 AND
  149. (blog.blog_release LIKE ? OR blog.blog_title LIKE ?)
  150. ) AS union_table
  151. ORDER BY create_time DESC
  152. LIMIT ?, ?;`
  153. err = o.Raw(sql1, memberId, memberId, keyword, keyword).QueryRow(&totalCount)
  154. if err != nil {
  155. return
  156. }
  157. sql3 := ` SELECT
  158. count(*)
  159. FROM md_blogs AS blog
  160. WHERE (blog.blog_status = 'public' OR blog.member_id = ?) AND blog.blog_type = 0 AND
  161. (blog.blog_release LIKE ? OR blog.blog_title LIKE ?);`
  162. c := 0
  163. err = o.Raw(sql3,memberId, keyword, keyword).QueryRow(&c)
  164. if err != nil {
  165. beego.Error("查询搜索结果失败 -> ",err)
  166. return
  167. }
  168. totalCount += c
  169. _, err = o.Raw(sql2, memberId, memberId, keyword, keyword,memberId,keyword, keyword, offset, pageSize).QueryRows(&searchResult)
  170. if err != nil {
  171. return
  172. }
  173. }
  174. return
  175. }
  176. //项目内搜索.
  177. func (m *DocumentSearchResult) SearchDocument(keyword string, book_id int) (docs []*DocumentSearchResult, err error) {
  178. o := orm.NewOrm()
  179. sql := "SELECT * FROM md_documents WHERE book_id = ? AND (document_name LIKE ? OR `release` LIKE ?) "
  180. keyword = "%" + keyword + "%"
  181. _, err = o.Raw(sql, book_id, keyword, keyword).QueryRows(&docs)
  182. return
  183. }