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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. require 'pg'
  2. require 'sequel'
  3. require_relative 'connect'
  4. def migrate(db: DB)
  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 IF NOT EXISTS tsv_idx ON posts USING gin(tsv);')
  24. begin
  25. db.create_function(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
  26. BEGIN
  27. UPDATE threads
  28. SET
  29. last_post_created_at = NEW.created_at,
  30. last_post_creator = NEW.creator
  31. WHERE
  32. threads.id = NEW.thread_id;
  33. RETURN NEW;
  34. END
  35. SQL
  36. rescue Sequel::DatabaseError => e
  37. raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
  38. end
  39. begin
  40. db.create_function(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
  41. BEGIN
  42. NEW.tsv = to_tsvector(new.body);
  43. RETURN NEW;
  44. END
  45. SQL
  46. rescue Sequel::DatabaseError => e
  47. raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
  48. end
  49. begin
  50. db.run(<<-SQL)
  51. CREATE TRIGGER update_last_post
  52. AFTER INSERT ON posts
  53. FOR EACH ROW
  54. EXECUTE PROCEDURE update_last_post();
  55. SQL
  56. rescue Sequel::DatabaseError => e
  57. raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
  58. end
  59. begin
  60. db.run(<<-SQL)
  61. CREATE TRIGGER set_posts_tsv
  62. BEFORE INSERT OR UPDATE ON posts
  63. FOR EACH ROW
  64. EXECUTE PROCEDURE set_posts_tsv();
  65. SQL
  66. rescue Sequel::DatabaseError => e
  67. raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
  68. end
  69. end