diff --git a/contrib/dres_rails/spec/features/expose_spec.rb b/contrib/dres_rails/spec/features/expose_spec.rb index e45cd596b9..2c2589aa91 100644 --- a/contrib/dres_rails/spec/features/expose_spec.rb +++ b/contrib/dres_rails/spec/features/expose_spec.rb @@ -15,8 +15,8 @@ end before(:each) do - ::ActiveRecord::Base.connection.execute("TRUNCATE event_store_events") ::ActiveRecord::Base.connection.execute("TRUNCATE event_store_events_in_streams") + ::ActiveRecord::Base.connection.execute("DELETE FROM event_store_events") end let(:repository) { RubyEventStore::ActiveRecord::PgLinearizedEventRepository.new(serializer: YAML) } diff --git a/rails_event_store/spec/rails_foreign_key_on_event_id_migration_generator_spec.rb b/rails_event_store/spec/rails_foreign_key_on_event_id_migration_generator_spec.rb new file mode 100644 index 0000000000..558bbdc4eb --- /dev/null +++ b/rails_event_store/spec/rails_foreign_key_on_event_id_migration_generator_spec.rb @@ -0,0 +1,72 @@ +require "spec_helper" +require "pp" +require_relative "../../support/helpers/silence_stdout" + +module RailsEventStore + ::RSpec.describe RubyEventStore::ActiveRecord::RailsForeignKeyOnEventIdMigrationGenerator do + around { |example| SilenceStdout.silence_stdout { example.run } } + + around do |example| + begin + @dir = Dir.mktmpdir(nil, "./") + example.call + ensure + FileUtils.rm_r(@dir) + end + end + + before { allow(Time).to receive(:now).and_return(Time.new(2016, 8, 9, 22, 22, 22)) } + + subject do + generate_migration + File.read("#{@dir}/db/migrate/20160809222222_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb") + end + + it "uses particular migration version" do + expect(subject).to include("ActiveRecord::Migration[#{::ActiveRecord::Migration.current_version}]") + end + + it "uses particular migration version for rails 6.0" do + skip unless ENV["BUNDLE_GEMFILE"].include?("rails_6_0") + expect(subject).to include("ActiveRecord::Migration[6.0]") + end + + it "uses particular migration version for rails 6.1" do + skip unless ENV["BUNDLE_GEMFILE"].include?("rails_6_1") + expect(subject).to include("ActiveRecord::Migration[6.1]") + end + + context "when postgresql adapter is used" do + before { allow(::ActiveRecord::Base).to receive(:connection).and_return(double(adapter_name: 'postgresql')) } + + specify "should do migration in two steps" do + generate_migration + expect(second_step_migration_exists?(@dir)).to be_truthy + expect(generated_files_count(@dir)).to eq(2) + end + end + + %w[mysql2 sqlite].each do |adapter| + context "when #{adapter} adapter is used" do + before { allow(::ActiveRecord::Base).to receive(:connection).and_return(double(adapter_name: adapter)) } + specify "should do migration in single step" do + generate_migration + expect(second_step_migration_exists?(@dir)).to be_falsey + expect(generated_files_count(@dir)).to eq(1) + end + end + end + + def generate_migration + RubyEventStore::ActiveRecord::RailsForeignKeyOnEventIdMigrationGenerator.start([], destination_root: @dir) + end + + def second_step_migration_exists?(dir) + File.exist?("#{dir}/db/migrate/20160809222222_validate_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb") + end + + def generated_files_count(dir) + Dir[File.join(dir, 'db/migrate', '*')].length + end + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record.rb b/ruby_event_store-active_record/lib/ruby_event_store/active_record.rb index 5338814954..504a085b3c 100644 --- a/ruby_event_store-active_record/lib/ruby_event_store/active_record.rb +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record.rb @@ -3,9 +3,12 @@ require_relative "active_record/generators/migration_generator" require_relative "active_record/generators/rails_migration_generator" require_relative "active_record/generators/templates/template_directory" +require_relative "active_record/generators/verify_adapter" require_relative "active_record/generators/verify_data_type_for_adapter" require_relative "active_record/generators/event_id_index_migration_generator" require_relative "active_record/generators/rails_event_id_index_migration_generator" +require_relative "active_record/generators/foreign_key_on_event_id_migration_generator" +require_relative "active_record/generators/rails_foreign_key_on_event_id_migration_generator" require_relative "active_record/event" require_relative "active_record/with_default_models" require_relative "active_record/with_abstract_base_class" diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/foreign_key_on_event_id_migration_generator.rb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/foreign_key_on_event_id_migration_generator.rb new file mode 100644 index 0000000000..4d5044d9c9 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/foreign_key_on_event_id_migration_generator.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module RubyEventStore + module ActiveRecord + class ForeignKeyOnEventIdMigrationGenerator + def call(database_adapter, migration_path) + each_migration(database_adapter) do |migration_name| + path = build_path(migration_path, migration_name) + write_to_file(path, migration_code(database_adapter, migration_name)) + end + end + + private + + def each_migration(database_adapter, &block) + case database_adapter + when 'postgresql' + [ + 'add_foreign_key_on_event_id_to_event_store_events_in_streams', + 'validate_add_foreign_key_on_event_id_to_event_store_events_in_streams' + ] + else + ['add_foreign_key_on_event_id_to_event_store_events_in_streams'] + end.each(&block) + end + + def absolute_path(path) + File.expand_path(path, __dir__) + end + + def migration_code(database_adapter, migration_name) + migration_template(template_root(database_adapter), migration_name).result_with_hash(migration_version: migration_version) + end + + def migration_template(template_root, name) + ERB.new(File.read(File.join(template_root, "#{name}_template.erb"))) + end + + def template_root(database_adapter) + absolute_path("./templates/#{template_directory(database_adapter)}") + end + + def template_directory(database_adapter) + TemplateDirectory.for_adapter(database_adapter) + end + + def migration_version + ::ActiveRecord::Migration.current_version + end + + def timestamp + Time.now.strftime("%Y%m%d%H%M%S") + end + + def write_to_file(path, migration_code) + File.write(path, migration_code) + end + + def build_path(migration_path, migration_name) + File.join("#{migration_path}", "#{timestamp}_#{migration_name}.rb") + end + end + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/rails_foreign_key_on_event_id_migration_generator.rb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/rails_foreign_key_on_event_id_migration_generator.rb new file mode 100644 index 0000000000..4e6537f345 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/rails_foreign_key_on_event_id_migration_generator.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +begin + require "rails/generators" +rescue LoadError +end + +if defined?(Rails::Generators::Base) + module RubyEventStore + module ActiveRecord + class RailsForeignKeyOnEventIdMigrationGenerator < Rails::Generators::Base + class Error < Thor::Error + end + + namespace "rails_event_store_active_record:migration_for_foreign_key_on_event_id" + + source_root File.expand_path(File.join(File.dirname(__FILE__), "../generators/templates")) + + def initialize(*args) + super + + VerifyAdapter.new.call(adapter) + rescue UnsupportedAdapter => e + raise Error, e.message + end + + def create_migration + case adapter + when 'postgresql' + template "#{template_directory}add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb", + "db/migrate/#{timestamp}_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb" + template "#{template_directory}validate_add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb", + "db/migrate/#{timestamp}_validate_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb" + else + template "#{template_directory}add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb", + "db/migrate/#{timestamp}_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb" + end + end + + private + + def adapter + ::ActiveRecord::Base.connection.adapter_name.downcase + end + + def migration_version + ::ActiveRecord::Migration.current_version + end + + def timestamp + Time.now.strftime("%Y%m%d%H%M%S") + end + + def template_directory + TemplateDirectory.for_adapter(adapter) + end + end + end + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb new file mode 100644 index 0000000000..d1e8571b93 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddForeginKeyOnEventIdToEventStoreEventsInStreams < ActiveRecord::Migration[<%= migration_version %>] + def change + add_foreign_key :event_store_events_in_streams, :event_store_events, column: :event_id, primary_key: :event_id, if_not_exists: true + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/create_event_store_events_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/create_event_store_events_template.erb index edf742c9b0..5bcb07068e 100644 --- a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/create_event_store_events_template.erb +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/create_event_store_events_template.erb @@ -20,5 +20,7 @@ class CreateEventStoreEvents < ActiveRecord::Migration[<%= migration_version %>] t.datetime :created_at, null: false, precision: 6, index: true t.datetime :valid_at, null: true, precision: 6, index: true end + + add_foreign_key "event_store_events_in_streams", "event_store_events", column: "event_id", primary_key: "event_id" end end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb new file mode 100644 index 0000000000..d1e8571b93 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddForeginKeyOnEventIdToEventStoreEventsInStreams < ActiveRecord::Migration[<%= migration_version %>] + def change + add_foreign_key :event_store_events_in_streams, :event_store_events, column: :event_id, primary_key: :event_id, if_not_exists: true + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/create_event_store_events_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/create_event_store_events_template.erb index 91677ce0fb..5bd303c070 100644 --- a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/create_event_store_events_template.erb +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/mysql/create_event_store_events_template.erb @@ -20,5 +20,7 @@ class CreateEventStoreEvents < ActiveRecord::Migration[<%= migration_version %>] t.datetime :created_at, null: false, precision: 6, index: true t.datetime :valid_at, null: true, precision: 6, index: true end + + add_foreign_key "event_store_events_in_streams", "event_store_events", column: "event_id", primary_key: "event_id" end end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb new file mode 100644 index 0000000000..9905ac65b7 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddForeginKeyOnEventIdToEventStoreEventsInStreams < ActiveRecord::Migration[<%= migration_version %>] + def change + add_foreign_key :event_store_events_in_streams, :event_store_events, column: :event_id, primary_key: :event_id, if_not_exists: true, validate: false + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/create_event_store_events_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/create_event_store_events_template.erb index 8cff41a9df..e51686b7d4 100644 --- a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/create_event_store_events_template.erb +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/create_event_store_events_template.erb @@ -20,5 +20,7 @@ class CreateEventStoreEvents < ActiveRecord::Migration[<%= migration_version %>] t.datetime :created_at, null: false, type: :timestamp, precision: 6, index: true t.datetime :valid_at, null: true, type: :timestamp, precision: 6, index: true end + + add_foreign_key "event_store_events_in_streams", "event_store_events", column: "event_id", primary_key: "event_id" end end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/validate_add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/validate_add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb new file mode 100644 index 0000000000..e190c75412 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/templates/postgres/validate_add_foreign_key_on_event_id_to_event_store_events_in_streams_template.erb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class ValidateAddForeginKeyOnEventIdToEventStoreEventsInStreams < ActiveRecord::Migration[<%= migration_version %>] + def change + validate_foreign_key :event_store_events_in_streams, :event_store_events, column: :event_id, primary_key: :event_id + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_adapter.rb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_adapter.rb new file mode 100644 index 0000000000..52fd4024b9 --- /dev/null +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_adapter.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module RubyEventStore + module ActiveRecord + UnsupportedAdapter = Class.new(StandardError) + + class VerifyAdapter + SUPPORTED_ADAPTERS = %w[mysql2 postgresql sqlite].freeze + + def call(adapter) + raise UnsupportedAdapter, "Unsupported adapter" unless supported?(adapter) + end + + private + + private_constant :SUPPORTED_ADAPTERS + + def supported?(adapter) + SUPPORTED_ADAPTERS.include?(adapter.downcase) + end + end + end +end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_data_type_for_adapter.rb b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_data_type_for_adapter.rb index ea19053ac7..e2ecb40c7a 100644 --- a/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_data_type_for_adapter.rb +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/generators/verify_data_type_for_adapter.rb @@ -3,7 +3,6 @@ module RubyEventStore module ActiveRecord InvalidDataTypeForAdapter = Class.new(StandardError) - UnsupportedAdapter = Class.new(StandardError) class VerifyDataTypeForAdapter SUPPORTED_POSTGRES_DATA_TYPES = %w[binary json jsonb].freeze @@ -11,7 +10,7 @@ class VerifyDataTypeForAdapter SUPPORTED_SQLITE_DATA_TYPES = %w[binary].freeze def call(adapter, data_type) - raise UnsupportedAdapter, "Unsupported adapter" unless supported?(adapter) + VerifyAdapter.new.call(adapter) raise InvalidDataTypeForAdapter, "MySQL2 doesn't support #{data_type}" if is_mysql2?(adapter) && !SUPPORTED_MYSQL_DATA_TYPES.include?(data_type) raise InvalidDataTypeForAdapter, "sqlite doesn't support #{data_type}" if is_sqlite?(adapter) && supported_by_sqlite?(data_type) raise InvalidDataTypeForAdapter, "PostgreSQL doesn't support #{data_type}" unless supported_by_postgres?(data_type) @@ -21,10 +20,6 @@ def call(adapter, data_type) private_constant :SUPPORTED_POSTGRES_DATA_TYPES, :SUPPORTED_MYSQL_DATA_TYPES, :SUPPORTED_SQLITE_DATA_TYPES - def supported?(adapter) - %w[mysql2 postgresql sqlite].include?(adapter.downcase) - end - def is_sqlite?(adapter) adapter.downcase.eql?("sqlite") end diff --git a/ruby_event_store-active_record/lib/ruby_event_store/active_record/tasks/migration_tasks.rake b/ruby_event_store-active_record/lib/ruby_event_store/active_record/tasks/migration_tasks.rake index a7bb984f04..2bf471b23f 100644 --- a/ruby_event_store-active_record/lib/ruby_event_store/active_record/tasks/migration_tasks.rake +++ b/ruby_event_store-active_record/lib/ruby_event_store/active_record/tasks/migration_tasks.rake @@ -25,3 +25,12 @@ task "db:migrations:fix_missing_event_id_index" do puts "Migration file created #{path}" end + +desc "Generate migration for adding foreign key on event_store_events_in_streams.event_id" +task "db:migrations:add_foreign_key_on_event_id" do + ::ActiveRecord::Base.establish_connection(ENV["DATABASE_URL"]) + + path = RubyEventStore::ActiveRecord::ForeignKeyOnEventIdMigrationGenerator.new.call(ENV["MIGRATION_PATH"] || "db/migrate") + + puts "Migration file created #{path}" +end diff --git a/ruby_event_store-active_record/spec/foreign_key_on_event_id_migration_generator_spec.rb b/ruby_event_store-active_record/spec/foreign_key_on_event_id_migration_generator_spec.rb new file mode 100644 index 0000000000..82777aa86b --- /dev/null +++ b/ruby_event_store-active_record/spec/foreign_key_on_event_id_migration_generator_spec.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +require "spec_helper" +require_relative "../../support/helpers/silence_stdout" + +module RubyEventStore + module ActiveRecord + ::RSpec.describe ForeignKeyOnEventIdMigrationGenerator do + around { |example| SilenceStdout.silence_stdout { example.run } } + around do |example| + begin + @dir = Dir.mktmpdir(nil, "./") + example.call + ensure + FileUtils.rm_r(@dir) + FileUtils.rm_f(["./20221130213700_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb"]) + end + end + + before { allow(Time).to receive(:now).and_return(Time.new(2022, 11, 30, 21, 37, 00)) } + + %w[mysql2 postgresql sqlite].each do |adapter| + specify "it is created within specified directory" do + migration_generator(adapter, @dir) + + expect(migration_exists?(@dir)).to be_truthy + end + + specify "uses particular migration version" do + migration_generator(adapter, @dir) + + expect(read_migration(@dir)).to include("ActiveRecord::Migration[#{::ActiveRecord::Migration.current_version}]") + end + + specify "uses particular migration version for rails 6.0" do + skip unless ENV["BUNDLE_GEMFILE"]&.include?("rails_6_0") + + migration_generator(adapter, @dir) + + expect(read_migration(@dir)).to include("ActiveRecord::Migration[6.0]") + end + + specify "uses particular migration version for rails 6.1" do + skip unless ENV["BUNDLE_GEMFILE"]&.include?("rails_6_1") + + migration_generator(adapter, @dir) + + expect(read_migration(@dir)).to include("ActiveRecord::Migration[6.1]") + end + end + + context "when postgresql adapter is used" do + specify "should do migration in two steps" do + migration_generator('postgresql', @dir) + expect(second_step_migration_exists?(@dir)).to be_truthy + expect(generated_files_count(@dir)).to eq(2) + end + end + + %w[mysql2 sqlite].each do |adapter| + context "when #{adapter} adapter is used" do + specify "should do migration in single step" do + migration_generator(adapter, @dir) + expect(generated_files_count(@dir)).to eq(1) + end + end + end + + private + + def migration_generator(adapter, dir) + ForeignKeyOnEventIdMigrationGenerator.new.call(adapter, dir) + end + + def migration_exists?(dir) + File.exist?("#{dir}/20221130213700_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb") + end + + def read_migration(dir) + File.read("#{dir}/20221130213700_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb") + end + + def second_step_migration_exists?(dir) + File.exist?("#{dir}/20221130213700_validate_add_foreign_key_on_event_id_to_event_store_events_in_streams.rb") + end + + def generated_files_count(dir) + Dir[File.join(dir, '**', '*')].length + end + end + end +end diff --git a/ruby_event_store-active_record/spec/migration_test_spec.rb b/ruby_event_store-active_record/spec/migration_test_spec.rb index 6d40f52534..864a8c075f 100644 --- a/ruby_event_store-active_record/spec/migration_test_spec.rb +++ b/ruby_event_store-active_record/spec/migration_test_spec.rb @@ -46,6 +46,8 @@ module ActiveRecord "index_event_store_events_on_event_id" UNIQUE, btree (event_id) "index_event_store_events_on_event_type" btree (event_type) "index_event_store_events_on_valid_at" btree (valid_at) + Referenced by: + TABLE "event_store_events_in_streams" CONSTRAINT "fk_rails_c8d52b5857" FOREIGN KEY (event_id) REFERENCES event_store_events(event_id) Table "public.event_store_events_in_streams" Column | Type | Collation | Nullable | Default ------------+--------------------------------+-----------+----------+----------------------------------------------------------- @@ -60,6 +62,8 @@ module ActiveRecord "index_event_store_events_in_streams_on_event_id" btree (event_id) "index_event_store_events_in_streams_on_stream_and_event_id" UNIQUE, btree (stream, event_id) "index_event_store_events_in_streams_on_stream_and_position" UNIQUE, btree (stream, "position") + Foreign-key constraints: + "fk_rails_c8d52b5857" FOREIGN KEY (event_id) REFERENCES event_store_events(event_id) SCHEMA end @@ -102,7 +106,8 @@ module ActiveRecord UNIQUE KEY `index_event_store_events_in_streams_on_stream_and_event_id` (`stream`,`event_id`), UNIQUE KEY `index_event_store_events_in_streams_on_stream_and_position` (`stream`,`position`), KEY `index_event_store_events_in_streams_on_created_at` (`created_at`), - KEY `index_event_store_events_in_streams_on_event_id` (`event_id`) + KEY `index_event_store_events_in_streams_on_event_id` (`event_id`), + CONSTRAINT `fk_rails_c8d52b5857` FOREIGN KEY (`event_id`) REFERENCES `event_store_events` (`event_id`) ) ENGINE=InnoDB DEFAULT CHARSET=#{charset}#{collation} SCHEMA end @@ -115,16 +120,19 @@ module ActiveRecord FROM sqlite_schema WHERE NAME LIKE '%event_store_events%' SQL - CREATE TABLE "event_store_events_in_streams" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "stream" varchar NOT NULL, "position" integer, "event_id" varchar(36) NOT NULL, "created_at" datetime(6) NOT NULL) - CREATE INDEX "index_event_store_events_in_streams_on_created_at" ON "event_store_events_in_streams" ("created_at") - CREATE UNIQUE INDEX "index_event_store_events_in_streams_on_stream_and_position" ON "event_store_events_in_streams" ("stream", "position") - CREATE UNIQUE INDEX "index_event_store_events_in_streams_on_stream_and_event_id" ON "event_store_events_in_streams" ("stream", "event_id") - CREATE INDEX "index_event_store_events_in_streams_on_event_id" ON "event_store_events_in_streams" ("event_id") CREATE TABLE "event_store_events" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "event_id" varchar(36) NOT NULL, "event_type" varchar NOT NULL, "metadata" blob, "data" blob NOT NULL, "created_at" datetime(6) NOT NULL, "valid_at" datetime(6)) CREATE UNIQUE INDEX "index_event_store_events_on_event_id" ON "event_store_events" ("event_id") CREATE INDEX "index_event_store_events_on_event_type" ON "event_store_events" ("event_type") CREATE INDEX "index_event_store_events_on_created_at" ON "event_store_events" ("created_at") CREATE INDEX "index_event_store_events_on_valid_at" ON "event_store_events" ("valid_at") + CREATE TABLE "event_store_events_in_streams" ("id" integer NOT NULL PRIMARY KEY, "stream" varchar NOT NULL, "position" integer DEFAULT NULL, "event_id" varchar(36) NOT NULL, "created_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_c8d52b5857" + FOREIGN KEY ("event_id") + REFERENCES "event_store_events" ("event_id") + ) + CREATE INDEX "index_event_store_events_in_streams_on_created_at" ON "event_store_events_in_streams" ("created_at") + CREATE UNIQUE INDEX "index_event_store_events_in_streams_on_stream_and_position" ON "event_store_events_in_streams" ("stream", "position") + CREATE UNIQUE INDEX "index_event_store_events_in_streams_on_stream_and_event_id" ON "event_store_events_in_streams" ("stream", "event_id") + CREATE INDEX "index_event_store_events_in_streams_on_event_id" ON "event_store_events_in_streams" ("event_id") SCHEMA end diff --git a/support/helpers/schema_helper.rb b/support/helpers/schema_helper.rb index 794a2f8306..bcd6fa5e58 100644 --- a/support/helpers/schema_helper.rb +++ b/support/helpers/schema_helper.rb @@ -22,8 +22,8 @@ def load_database_schema end def drop_database - ActiveRecord::Migration.drop_table("event_store_events") ActiveRecord::Migration.drop_table("event_store_events_in_streams") + ActiveRecord::Migration.drop_table("event_store_events") rescue ::ActiveRecord::StatementInvalid end