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.

migrate.rb 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. require 'sequel'
  2. require_relative 'connect'
  3. def migrate
  4. db = connect
  5. db.create_table? :threads do
  6. primary_key :id
  7. String :title
  8. String :creator, index: true
  9. Integer :remote_id, index: true, unique: true
  10. String :last_post_creator
  11. DateTime :last_post_created_at
  12. DateTime :created_at, index: true
  13. end
  14. db.create_table? :posts do
  15. primary_key :id
  16. String :body
  17. String :creator, index: true
  18. Integer :remote_id, index: true, unique: true
  19. foreign_key :thread_id, :threads
  20. DateTime :created_at, index: true
  21. column :tsv, 'tsvector'
  22. end
  23. db.run('CREATE INDEX tsv_idx ON posts USING gin(tsv);')
  24. db.create_function?(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
  25. BEGIN
  26. UPDATE threads
  27. SET
  28. last_post_created_at = NEW.created_at,
  29. last_post_creator = NEW.creator
  30. WHERE
  31. threads.id = NEW.thread_id;
  32. RETURN NEW;
  33. END
  34. SQL
  35. db.create_function?(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
  36. BEGIN
  37. NEW.tsv = to_tsvector(new.body);
  38. RETURN NEW;
  39. END
  40. SQL
  41. db.run(<<-SQL)
  42. CREATE TRIGGER update_last_post
  43. AFTER INSERT ON posts
  44. FOR EACH ROW
  45. EXECUTE PROCEDURE update_last_post();
  46. SQL
  47. db.run(<<-SQL)
  48. CREATE TRIGGER set_posts_tsv
  49. BEFORE INSERT OR UPDATE ON posts
  50. FOR EACH ROW
  51. EXECUTE PROCEDURE set_posts_tsv();
  52. SQL
  53. end