DocumentSearchResult.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. package models
  2. import (
  3. "time"
  4. "strings"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/beego/beego/v2/core/logs"
  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. mdmb.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 mdmb ON rel.member_id = mdmb.member_id
  52. WHERE book.privately_owned = 0 AND (doc.document_name LIKE ? OR doc.release LIKE ?)
  53. UNION ALL
  54. SELECT
  55. book.book_id AS document_id,
  56. book.modify_time,
  57. book.create_time,
  58. book.book_name AS document_name,
  59. book.identify,
  60. book.description,
  61. book.identify AS book_identify,
  62. book.book_name,
  63. rel.member_id,
  64. mdmb.account AS author,
  65. 'book' AS search_type
  66. FROM md_books AS book
  67. LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
  68. LEFT JOIN md_members AS mdmb ON rel.member_id = mdmb.member_id
  69. WHERE book.privately_owned = 0 AND (book.book_name LIKE ? OR book.description LIKE ?)
  70. UNION ALL
  71. SELECT
  72. blog.blog_id AS document_id,
  73. blog.modify_time,
  74. blog.create_time,
  75. blog.blog_title as document_name,
  76. blog.blog_identify,
  77. blog.blog_release,
  78. blog.blog_identify,
  79. blog.blog_title as book_name,
  80. blog.member_id,
  81. mdmb.account,
  82. 'blog' AS search_type
  83. FROM md_blogs AS blog
  84. LEFT JOIN md_members AS mdmb ON blog.member_id = mdmb.member_id
  85. WHERE blog.blog_status = 'public' AND (blog.blog_release LIKE ? OR blog.blog_title LIKE ?)
  86. ) AS union_table
  87. ORDER BY create_time DESC
  88. LIMIT ? OFFSET ?;`
  89. err = o.Raw(sql1, keyword, keyword).QueryRow(&totalCount)
  90. if err != nil {
  91. logs.Error("查询搜索结果失败 -> ", err)
  92. return
  93. }
  94. sql3 := ` SELECT
  95. count(*)
  96. FROM md_blogs AS blog
  97. WHERE blog.blog_status = 'public' AND (blog.blog_release LIKE ? OR blog.blog_title LIKE ?);`
  98. c := 0
  99. err = o.Raw(sql3, keyword, keyword).QueryRow(&c)
  100. if err != nil {
  101. logs.Error("查询搜索结果失败 -> ", err)
  102. return
  103. }
  104. totalCount += c
  105. //查询项目的数量
  106. sql4 := `SELECT count(*) as total_count FROM md_books as book
  107. WHERE book.privately_owned = 0 AND (book.book_name LIKE ? OR book.description LIKE ?);`
  108. err = o.Raw(sql4, keyword, keyword).QueryRow(&c)
  109. if err != nil {
  110. logs.Error("查询搜索结果失败 -> ", err)
  111. return
  112. }
  113. totalCount += c
  114. _, err = o.Raw(sql2, keyword, keyword, keyword, keyword, keyword, keyword, pageSize, offset).QueryRows(&searchResult)
  115. if err != nil {
  116. logs.Error("查询搜索结果失败 -> ", err)
  117. return
  118. }
  119. } else {
  120. sql1 := `SELECT count(doc.document_id) as total_count FROM md_documents AS doc
  121. LEFT JOIN md_books as book ON doc.book_id = book.book_id
  122. LEFT JOIN md_relationship AS rel ON doc.book_id = rel.book_id AND rel.role_id = 0
  123. LEFT JOIN md_relationship AS rel1 ON doc.book_id = rel1.book_id AND rel1.member_id = ?
  124. left join (select * from (select book_id,team_member_id,role_id
  125. from md_team_relationship as mtr
  126. 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
  127. on team.book_id = book.book_id
  128. 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 ?);`
  129. sql2 := `SELECT *
  130. FROM (
  131. SELECT
  132. doc.document_id,
  133. doc.modify_time,
  134. doc.create_time,
  135. doc.document_name,
  136. doc.identify,
  137. doc.release AS description,
  138. book.identify AS book_identify,
  139. book.book_name,
  140. rel.member_id,
  141. mdmb.account AS author,
  142. 'document' AS search_type
  143. FROM md_documents AS doc
  144. LEFT JOIN md_books AS book ON doc.book_id = book.book_id
  145. LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
  146. LEFT JOIN md_members AS mdmb ON rel.member_id = mdmb.member_id
  147. LEFT JOIN md_relationship AS rel1 ON doc.book_id = rel1.book_id AND rel1.member_id = ?
  148. LEFT JOIN (SELECT *
  149. FROM (SELECT
  150. book_id,
  151. team_member_id,
  152. role_id
  153. FROM md_team_relationship AS mtr
  154. LEFT JOIN md_team_member AS mtm ON mtm.team_id = mtr.team_id AND mtm.member_id = ?
  155. ORDER BY role_id DESC) AS t
  156. GROUP BY t.role_id, t.team_member_id, t.book_id) AS team
  157. ON team.book_id = book.book_id
  158. WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 OR team.team_member_id > 0) AND
  159. (doc.document_name LIKE ? OR doc.release LIKE ?)
  160. UNION ALL
  161. SELECT
  162. book.book_id AS document_id,
  163. book.modify_time,
  164. book.create_time,
  165. book.book_name AS document_name,
  166. book.identify,
  167. book.description AS description,
  168. book.identify AS book_identify,
  169. book.book_name,
  170. rel.member_id,
  171. mdmb.account AS author,
  172. 'book' AS search_type
  173. FROM md_books AS book
  174. LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
  175. LEFT JOIN md_members AS mdmb ON rel.member_id = mdmb.member_id
  176. LEFT JOIN md_relationship AS rel1 ON book.book_id = rel1.book_id AND rel1.member_id = ?
  177. LEFT JOIN (SELECT *
  178. FROM (SELECT
  179. book_id,
  180. team_member_id,
  181. role_id
  182. FROM md_team_relationship AS mtr
  183. LEFT JOIN md_team_member AS mtm ON mtm.team_id = mtr.team_id AND mtm.member_id = ?
  184. ORDER BY role_id DESC) AS t
  185. GROUP BY t.role_id, t.team_member_id, t.book_id) AS team
  186. ON team.book_id = book.book_id
  187. WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 OR team.team_member_id > 0) AND
  188. (book.book_name LIKE ? OR book.description LIKE ?)
  189. UNION ALL
  190. SELECT
  191. blog.blog_id AS document_id,
  192. blog.modify_time,
  193. blog.create_time,
  194. blog.blog_title as document_name,
  195. blog.blog_identify as identify,
  196. blog.blog_release as description,
  197. blog.blog_identify AS book_identify,
  198. blog.blog_title as book_name,
  199. blog.member_id,
  200. mdmb.account,
  201. 'blog' AS search_type
  202. FROM md_blogs AS blog
  203. LEFT JOIN md_members AS mdmb ON blog.member_id = mdmb.member_id
  204. WHERE (blog.blog_status = 'public' OR blog.member_id = ?) AND blog.blog_type = 0 AND
  205. (blog.blog_release LIKE ? OR blog.blog_title LIKE ?)
  206. ) AS union_table
  207. ORDER BY create_time DESC
  208. LIMIT ? OFFSET ?;`
  209. err = o.Raw(sql1, memberId, memberId, keyword, keyword).QueryRow(&totalCount)
  210. if err != nil {
  211. return
  212. }
  213. sql3 := ` SELECT
  214. count(*)
  215. FROM md_blogs AS blog
  216. WHERE (blog.blog_status = 'public' OR blog.member_id = ?) AND blog.blog_type = 0 AND
  217. (blog.blog_release LIKE ? OR blog.blog_title LIKE ?);`
  218. c := 0
  219. err = o.Raw(sql3, memberId, keyword, keyword).QueryRow(&c)
  220. if err != nil {
  221. logs.Error("查询搜索结果失败 -> ", err)
  222. return
  223. }
  224. totalCount += c
  225. sql4 := `SELECT count(*) as total_count FROM md_books as book
  226. LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
  227. LEFT JOIN md_relationship AS rel1 ON book.book_id = rel1.book_id AND rel1.member_id = ?
  228. left join (select * from (select book_id,team_member_id,role_id
  229. from md_team_relationship as mtr
  230. 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
  231. on team.book_id = book.book_id
  232. WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 or team.team_member_id > 0) AND (book.book_name LIKE ? OR book.description LIKE ?);`
  233. err = o.Raw(sql4, memberId, memberId, keyword, keyword).QueryRow(&c)
  234. if err != nil {
  235. logs.Error("查询搜索结果失败 -> ", err)
  236. return
  237. }
  238. totalCount += c
  239. _, err = o.Raw(sql2, memberId, memberId, keyword, keyword, memberId, memberId, keyword, keyword, memberId, keyword, keyword, pageSize, offset).QueryRows(&searchResult)
  240. if err != nil {
  241. return
  242. }
  243. }
  244. return
  245. }
  246. //项目内搜索.
  247. func (m *DocumentSearchResult) SearchDocument(keyword string, bookId int) (docs []*DocumentSearchResult, err error) {
  248. o := orm.NewOrm()
  249. sql := "SELECT * FROM md_documents WHERE book_id = ? AND (document_name LIKE ? OR `release` LIKE ?) "
  250. keyword = "%" + keyword + "%"
  251. _, err = o.Raw(sql, bookId, keyword, keyword).QueryRows(&docs)
  252. return
  253. }