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.

search.rb 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. require 'sequel'
  2. def search(params)
  3. query = params[:q].strip
  4. offset = (params[:page] - 1) * 10
  5. username = params[:username].strip
  6. from_date = params[:from_date].strip
  7. to_date = params[:to_date].strip
  8. errors = Array.new
  9. if from_date.empty?
  10. from_date = nil
  11. else
  12. if from_date.match(/\d{4}-\d{2}-\d{2}/)
  13. from_date = Date.parse(params[:from_date]) rescue errors << 'Invalid From Date'
  14. else
  15. errors << 'From Date must be in the format YYYY-MM-DD'
  16. end
  17. end
  18. if to_date.empty?
  19. to_date = nil
  20. else
  21. if to_date.match(/\d{4}-\d{2}-\d{2}/)
  22. to_date = Date.parse(params[:to_date]).next rescue errors << 'Invalid To Date'
  23. else
  24. errors << 'To Date must be in the format YYYY-MM-DD'
  25. end
  26. end
  27. if errors.empty? && !to_date.nil? && !from_date.nil? && to_date < from_date
  28. errors << 'To Date must be after From Date'
  29. end
  30. return {results: Array.new, errors: errors} unless errors.empty?
  31. results = case params[:type]
  32. when 'threads'
  33. sort =
  34. case params[:sort]
  35. when 'thread'
  36. 'created_at DESC'
  37. when 'post'
  38. 'last_post_created_at DESC'
  39. else
  40. 'created_at DESC'
  41. end
  42. search_threads(query, username, from_date, to_date, sort, offset)
  43. when 'posts'
  44. search_posts(query, username, from_date, to_date, offset)
  45. else
  46. Array.new
  47. end
  48. {results: results, errors: errors}
  49. end
  50. def search_threads(query, username, from_date, to_date, sort, offset)
  51. DB[<<-SQL, query, username, username, from_date, from_date, to_date, to_date, offset]
  52. SELECT
  53. threads.*,
  54. count(*) OVER() AS full_count
  55. FROM threads
  56. WHERE
  57. to_tsvector(title) @@ plainto_tsquery(?)
  58. AND (LOWER(threads.creator) = LOWER(?) OR ? = '')
  59. AND (created_at >= ? OR ? IS NULL)
  60. AND (created_at <= ? OR ? IS NULL)
  61. ORDER BY #{sort}
  62. LIMIT 50
  63. OFFSET ?;
  64. SQL
  65. end
  66. def search_posts(query, username, from_date, to_date, offset)
  67. DB[<<-SQL, query, username, username, from_date, from_date, to_date, to_date, offset]
  68. SELECT
  69. posts.*,
  70. threads.title as thread_title,
  71. threads.remote_id as remote_thread_id,
  72. count(*) OVER() AS full_count
  73. FROM posts
  74. INNER JOIN threads on posts.thread_id = threads.id
  75. WHERE
  76. tsv @@ plainto_tsquery(?)
  77. AND ((LOWER(posts.creator) = LOWER(?)) OR (? = ''))
  78. AND (posts.created_at >= ? OR ? IS NULL)
  79. AND (posts.created_at <= ? OR ? IS NULL)
  80. ORDER BY created_at DESC
  81. LIMIT 50
  82. OFFSET ?;
  83. SQL
  84. end