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

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