DocumentSearchResult.go 7.0 KB

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