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.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. FROM threads
  55. WHERE
  56. to_tsvector(title) @@ plainto_tsquery(?)
  57. AND (LOWER(threads.creator) = LOWER(?) OR ? = '')
  58. AND (created_at >= ? OR ? IS NULL)
  59. AND (created_at <= ? OR ? IS NULL)
  60. ORDER BY #{sort}
  61. LIMIT 50
  62. OFFSET ?;
  63. SQL
  64. end
  65. def search_posts(query, username, from_date, to_date, offset)
  66. DB[<<-SQL, query, username, username, from_date, from_date, to_date, to_date, offset]
  67. SELECT
  68. posts.*,
  69. threads.title as thread_title,
  70. threads.remote_id as remote_thread_id
  71. FROM posts
  72. INNER JOIN threads on posts.thread_id = threads.id
  73. WHERE
  74. tsv @@ plainto_tsquery(?)
  75. AND ((LOWER(posts.creator) = LOWER(?)) OR (? = ''))
  76. AND (posts.created_at >= ? OR ? IS NULL)
  77. AND (posts.created_at <= ? OR ? IS NULL)
  78. ORDER BY created_at DESC
  79. LIMIT 50
  80. OFFSET ?;
  81. SQL
  82. end