RailsEventStore/cqrs-es-sample-with-res

View on GitHub
rails_application/db/migrate/20210103114314_no_global_stream_entries.rb

Summary

Maintainability
A
2 hrs
Test Coverage
class NoGlobalStreamEntries < ActiveRecord::Migration[4.2]
  def change
    case ActiveRecord::Base.connection.adapter_name
    when "SQLite"
      rename_table :event_store_events, :old_event_store_events
      create_table(:event_store_events, force: false) do |t|
        t.references  :event,       null: false, type: :string, limit: 36
        t.string      :event_type,  null: false
        t.binary      :metadata
        t.binary      :data,        null: false
        t.datetime    :created_at,  precision: 6, null: false
        t.datetime    :valid_at,    precision: 6, null: true
      end
      add_index :event_store_events, :event_id, unique: true
      add_index :event_store_events, :created_at
      add_index :event_store_events, :valid_at
      add_index :event_store_events, :event_type

      execute <<-SQL
        INSERT INTO event_store_events(event_id, event_type, metadata, data, created_at)
        SELECT id, event_type, metadata, data, created_at FROM old_event_store_events;
      SQL
      drop_table :old_event_store_events
    when "PostgreSQL"
      rename_column :event_store_events, :id, :event_id
      change_column_default :event_store_events, :event_id, nil
      add_column :event_store_events, :id, :serial

      execute <<~SQL
        UPDATE event_store_events
          SET id = event_store_events_in_streams.id
          FROM event_store_events_in_streams
          WHERE event_store_events.event_id = event_store_events_in_streams.event_id AND event_store_events_in_streams.stream = 'all';
        UPDATE event_store_events
          SET id = ese.new_id
          FROM (SELECT id, row_number() OVER (ORDER BY id) AS new_id FROM event_store_events) ese
          WHERE event_store_events.id = ese.id;
        SELECT setval(pg_get_serial_sequence('event_store_events', 'id'), max(id)) FROM event_store_events;
        ALTER TABLE event_store_events DROP CONSTRAINT event_store_events_pkey;
        ALTER TABLE event_store_events ADD PRIMARY KEY (id);
      SQL
      add_index :event_store_events, :event_id, unique: true
    else
      rename_column :event_store_events, :id, :event_id
      add_column :event_store_events, :id, :integer

      execute <<-SQL
        UPDATE event_store_events
          INNER JOIN event_store_events_in_streams ON (event_store_events.event_id = event_store_events_in_streams.event_id)
          SET event_store_events.id = event_store_events_in_streams.id
          WHERE event_store_events_in_streams.stream = 'all';
      SQL
      execute "SET @row_number = 0"
      execute "UPDATE event_store_events SET event_store_events.id = (@row_number:=@row_number + 1) ORDER BY id"
      execute "ALTER TABLE event_store_events DROP PRIMARY KEY, ADD PRIMARY KEY (id), MODIFY id INT AUTO_INCREMENT"
      add_index :event_store_events, :event_id, unique: true
    end
  end
end