Advertisement
Guest User

Untitled

a guest
May 19th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.85 KB | None | 0 0
  1. package db
  2.  
  3. import (
  4. "strconv"
  5.  
  6. "github.com/Rakhimgaliev/tech-db-forum/project/models"
  7. "github.com/jackc/pgx"
  8. )
  9.  
  10. func GetPosts(conn *pgx.ConnPool, slug_or_id string,
  11. limit int, desc bool, since int,
  12. sort string, posts *models.Posts) error {
  13.  
  14. thread := models.Thread{}
  15. id, err := strconv.Atoi(slug_or_id)
  16. if err == nil {
  17. thread.Id = int32(id)
  18. err = GetThreadById(conn, &thread)
  19. if err != nil {
  20. return ErrorThreadNotFound
  21. }
  22. } else {
  23. thread.Slug = slug_or_id
  24. err = GetThreadBySlug(conn, &thread)
  25. if err != nil {
  26. return ErrorThreadNotFound
  27. }
  28. }
  29.  
  30. rows, err := GenerateGetPostsQuery(conn, thread.Id, limit, desc, since, sort)
  31. if err != nil {
  32. return err
  33. }
  34.  
  35. defer rows.Close()
  36. for rows.Next() {
  37. post := &models.Post{}
  38. err := scanPostRows(rows, post)
  39.  
  40. if err != nil {
  41. return err
  42. }
  43. *posts = append(*posts, post)
  44. }
  45.  
  46. return nil
  47. }
  48.  
  49. const (
  50. getPostsFlatLimitById = `
  51. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  52. FROM post p
  53. WHERE p.thread = $1
  54. ORDER BY p.created, p.id
  55. LIMIT $2
  56. `
  57.  
  58. getPostsFlatLimitDescById = `
  59. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  60. FROM post p
  61. WHERE p.thread = $1
  62. ORDER BY p.created DESC, p.id DESC
  63. LIMIT $2
  64. `
  65.  
  66. getPostsFlatLimitSinceById = `
  67. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  68. FROM post p
  69. WHERE p.thread = $1 and p.id > $2
  70. ORDER BY p.created, p.id
  71. LIMIT $3
  72. `
  73.  
  74. getPostsFlatLimitSinceDescById = `
  75. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  76. FROM post p
  77. WHERE p.thread = $1 and p.id < $2
  78. ORDER BY p.created DESC, p.id DESC
  79. LIMIT $3
  80. `
  81.  
  82. getPostsTreeLimitById = `
  83. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  84. FROM post p
  85. WHERE p.thread = $1
  86. ORDER BY p.children
  87. LIMIT $2
  88. `
  89.  
  90. getPostsTreeLimitDescById = `
  91. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  92. FROM post p
  93. WHERE p.thread = $1
  94. ORDER BY children DESC
  95. LIMIT $2
  96. `
  97.  
  98. getPostsTreeLimitSinceById = `
  99. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  100. FROM post p
  101. WHERE p.thread = $1 and (p.children > (SELECT p2.children from post p2 where p2.id = $2))
  102. ORDER BY p.children
  103. LIMIT $3
  104. `
  105.  
  106. getPostsTreeLimitSinceDescById = `
  107. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  108. FROM post p
  109. WHERE p.thread = $1 and (p.children < (SELECT p2.children from post p2 where p2.id = $2))
  110. ORDER BY p.children DESC
  111. LIMIT $3
  112. `
  113.  
  114. getPostsParentTreeLimitById = `
  115. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  116. FROM post p
  117. WHERE p.thread = $1 and p.children[1] IN (
  118. SELECT p2.children[1]
  119. FROM post p2
  120. WHERE p2.thread = $2 AND p2.parent IS NULL
  121. ORDER BY p2.children
  122. LIMIT $3
  123. )
  124. ORDER BY children
  125. `
  126.  
  127. selectPostsParentTreeLimitDescByID = `
  128. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  129. FROM post p
  130. WHERE p.thread = $1 and p.children[1] IN (
  131. SELECT p2.children[1]
  132. FROM post p2
  133. WHERE p2.parent IS NULL and p2.thread = $2
  134. ORDER BY p2.children DESC
  135. LIMIT $3
  136. )
  137. ORDER BY p.children[1] DESC, p.children[2:]
  138. `
  139.  
  140. selectPostsParentTreeLimitSinceByID = `
  141. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  142. FROM post p
  143. WHERE p.thread = $1 and p.children[1] IN (
  144. SELECT p2.children[1]
  145. FROM post p2
  146. WHERE p2.thread = $2 AND p2.parent IS NULL and p2.children[1] > (SELECT p3.children[1] from post p3 where p3.id = $3)
  147. ORDER BY p2.children
  148. LIMIT $4
  149. )
  150. ORDER BY p.children
  151. `
  152.  
  153. selectPostsParentTreeLimitSinceDescByID = `
  154. SELECT p.id, p.userNickname, p.created, p.edited, p.message, p.parent, p.thread, p.forum
  155. FROM post p
  156. WHERE p.thread = $1 and p.children[1] IN (
  157. SELECT p2.children[1]
  158. FROM post p2
  159. WHERE p2.thread = $2 AND p2.parent IS NULL and p2.children[1] < (SELECT p3.children[1] from post p3 where p3.id = $3)
  160. ORDER BY p2.children DESC
  161. LIMIT $4
  162. )
  163. ORDER BY p.children[1] DESC, p.children[2:]
  164. `
  165. )
  166.  
  167. func GenerateGetPostsQuery(conn *pgx.ConnPool,
  168. id int32, limit int, desc bool,
  169. since int, sort string) (*pgx.Rows, error) {
  170.  
  171. var rows *pgx.Rows
  172. var err error
  173.  
  174. switch sort {
  175. case "":
  176. fallthrough
  177. case "flat":
  178. if since == 0 {
  179. if !desc {
  180. rows, err = conn.Query(getPostsFlatLimitById, id, limit)
  181. } else {
  182. rows, err = conn.Query(getPostsFlatLimitDescById, id, limit)
  183. }
  184. } else {
  185. if !desc {
  186. rows, err = conn.Query(getPostsFlatLimitSinceById, id, since, limit)
  187. } else {
  188. rows, err = conn.Query(getPostsFlatLimitSinceDescById, id, since, limit)
  189. }
  190. }
  191. case "tree":
  192. if since == 0 {
  193. if !desc {
  194. rows, err = conn.Query(getPostsTreeLimitById, id, limit)
  195. } else {
  196. rows, err = conn.Query(getPostsTreeLimitDescById, id, limit)
  197. }
  198. } else {
  199. if !desc {
  200. rows, err = conn.Query(getPostsTreeLimitSinceById, id, since, limit)
  201. } else {
  202. rows, err = conn.Query(getPostsTreeLimitSinceDescById, id, since, limit)
  203. }
  204. }
  205. case "parent_tree":
  206. if since == 0 {
  207. if !desc {
  208. rows, err = conn.Query(getPostsParentTreeLimitById, id, id,
  209. limit)
  210. } else {
  211. rows, err = conn.Query(selectPostsParentTreeLimitDescByID, id, id,
  212. limit)
  213. }
  214. } else {
  215. if !desc {
  216. rows, err = conn.Query(selectPostsParentTreeLimitSinceByID, id, id,
  217. since, limit)
  218. } else {
  219. rows, err = conn.Query(selectPostsParentTreeLimitSinceDescByID, id, id,
  220. since, limit)
  221. }
  222. }
  223. }
  224. return rows, err
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement