From 479f7b6c6c6419cd1ba026afea838eebdc62a125 Mon Sep 17 00:00:00 2001 From: Ben Halpern Date: Mon, 26 Jun 2023 09:06:18 -0400 Subject: [PATCH] Add unique index constraint to segmented users (#19627) * Add unique index constraint to segmented users * Run migration * Add de-duping query --- ...2151208_remove_existing_segmented_users.rb | 18 +++++++++++++ ...dd_unique_constraint_to_segmented_users.rb | 26 +++++++++++++++++++ db/schema.rb | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20230622151208_remove_existing_segmented_users.rb create mode 100644 db/migrate/20230622151553_add_unique_constraint_to_segmented_users.rb diff --git a/db/migrate/20230622151208_remove_existing_segmented_users.rb b/db/migrate/20230622151208_remove_existing_segmented_users.rb new file mode 100644 index 000000000..1c27433e1 --- /dev/null +++ b/db/migrate/20230622151208_remove_existing_segmented_users.rb @@ -0,0 +1,18 @@ +class RemoveExistingSegmentedUsers < ActiveRecord::Migration[7.0] + def up + sql = <<-SQL + DELETE FROM segmented_users deduped_seg_users + USING segmented_users current_seg_users + WHERE + deduped_seg_users.id < current_seg_users.id AND + deduped_seg_users.user_id = current_seg_users.user_id AND + deduped_seg_users.audience_segment_id = current_seg_users.audience_segment_id; + SQL + + ActiveRecord::Base.connection.execute(sql) + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20230622151553_add_unique_constraint_to_segmented_users.rb b/db/migrate/20230622151553_add_unique_constraint_to_segmented_users.rb new file mode 100644 index 000000000..8a3c78928 --- /dev/null +++ b/db/migrate/20230622151553_add_unique_constraint_to_segmented_users.rb @@ -0,0 +1,26 @@ +class AddUniqueConstraintToSegmentedUsers < ActiveRecord::Migration[7.0] + disable_ddl_transaction! + + def up + # remove the old index first + remove_index :segmented_users, name: "index_segmented_users_on_audience_segment_and_user", algorithm: :concurrently + + # add a new index with uniqueness constraint + add_index :segmented_users, + %i[audience_segment_id user_id], + unique: true, + name: "index_segmented_users_on_audience_segment_and_user", + algorithm: :concurrently + end + + def down + # to reverse the migration, remove the unique index + remove_index :segmented_users, name: "index_segmented_users_on_audience_segment_and_user", algorithm: :concurrently + + # and add back the old index + add_index :segmented_users, + %i[audience_segment_id user_id], + name: "index_segmented_users_on_audience_segment_and_user", + algorithm: :concurrently + end +end \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index fc4a25c12..edb984971 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_06_08_154310) do +ActiveRecord::Schema[7.0].define(version: 2023_06_22_151553) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_trgm"