Skip to content

Moved saved_replies to be under namespace

Phil Hughes requested to merge ph/changeUserIdToNamespaceIdSavedReply into master

What does this MR do and why?

Updates SavedReply to have namespace_id instead of user_id which will eventually allow for saved replies to be under groups, projects, as well as currently users.

#330098 (closed)

Migrations

Index migration

Up
main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 60946
main: == 20240201094204 RenameSavedRepliesUserIdIndex: migrating ====================
main: -- indexes(:saved_replies)
main:    -> 0.0225s
main: -- rename_index(:saved_replies, :index_saved_replies_on_name_text_pattern_ops, :i_saved_replies_user_id_name_pattern)
main:    -> 0.0007s
main: == 20240201094204 RenameSavedRepliesUserIdIndex: migrated (0.0282s) ===========

main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 60946

Down

Down
main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 61384
main: == 20240201094204 RenameSavedRepliesUserIdIndex: reverting ====================
main: -- indexes(:saved_replies)
main:    -> 0.0174s
main: -- rename_index(:saved_replies, :i_saved_replies_user_id_name_pattern, :index_saved_replies_on_name_text_pattern_ops)
main:    -> 0.0007s
main: == 20240201094204 RenameSavedRepliesUserIdIndex: reverted (0.0217s) ===========

main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 61384

Rename column migration

Up
main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 62723
main: == 20240201094316 RenameUserIdToNamespaceIdSavedReplies: migrating ============
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- columns(:saved_replies)
main:    -> 0.0168s
main: -- column_exists?(:saved_replies, :id)
main:    -> 0.0014s
main: -- column_exists?(:saved_replies, :namespace_id)
main:    -> 0.0011s
main: -- columns(:saved_replies)
main:    -> 0.0011s
main: -- add_column(:saved_replies, :namespace_id, :integer, {:limit=>8, :precision=>nil, :scale=>nil})
main:    -> 0.0016s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- exec_query("SELECT COUNT(*) AS count FROM \"saved_replies\"")
main:    -> 0.0005s
main: -- exec_query("SELECT \"saved_replies\".\"id\" FROM \"saved_replies\" ORDER BY \"saved_replies\".\"id\" ASC LIMIT 1")
main:    -> 0.0004s
main: -- exec_query("SELECT \"saved_replies\".\"id\" FROM \"saved_replies\" WHERE \"saved_replies\".\"id\" >= 261 ORDER BY \"saved_replies\".\"id\" ASC LIMIT 1 OFFSET 1")
main:    -> 0.0003s
main: -- transaction(nil)
main: -- execute("SELECT set_config('lock_writes.saved_replies', 'false', true)")
main:    -> 0.0005s
main: -- execute("UPDATE \"saved_replies\" SET \"namespace_id\" = \"saved_replies\".\"user_id\" WHERE \"saved_replies\".\"id\" >= 261 AND \"saved_replies\".\"id\" < 267")
main:    -> 0.0003s
main:    -> 0.0028s
main: -- exec_query("SELECT \"saved_replies\".\"id\" FROM \"saved_replies\" WHERE \"saved_replies\".\"id\" >= 267 ORDER BY \"saved_replies\".\"id\" ASC LIMIT 1 OFFSET 1")
main:    -> 0.0003s
main: -- transaction(nil)
main: -- execute("SELECT set_config('lock_writes.saved_replies', 'false', true)")
main:    -> 0.0004s
main: -- execute("UPDATE \"saved_replies\" SET \"namespace_id\" = \"saved_replies\".\"user_id\" WHERE \"saved_replies\".\"id\" >= 267 AND \"saved_replies\".\"id\" < 272")
main:    -> 0.0004s
main:    -> 0.0012s
main: -- exec_query("SELECT \"saved_replies\".\"id\" FROM \"saved_replies\" WHERE \"saved_replies\".\"id\" >= 272 ORDER BY \"saved_replies\".\"id\" ASC LIMIT 1 OFFSET 1")
main:    -> 0.0004s
main: -- transaction(nil)
main: -- execute("SELECT set_config('lock_writes.saved_replies', 'false', true)")
main:    -> 0.0004s
main: -- execute("UPDATE \"saved_replies\" SET \"namespace_id\" = \"saved_replies\".\"user_id\" WHERE \"saved_replies\".\"id\" >= 272 AND \"saved_replies\".\"id\" < 273")
main:    -> 0.0002s
main:    -> 0.0010s
main: -- exec_query("SELECT \"saved_replies\".\"id\" FROM \"saved_replies\" WHERE \"saved_replies\".\"id\" >= 273 ORDER BY \"saved_replies\".\"id\" ASC LIMIT 1 OFFSET 1")
main:    -> 0.0002s
main: -- transaction(nil)
main: -- execute("SELECT set_config('lock_writes.saved_replies', 'false', true)")
main:    -> 0.0003s
main: -- execute("UPDATE \"saved_replies\" SET \"namespace_id\" = \"saved_replies\".\"user_id\" WHERE \"saved_replies\".\"id\" >= 273")
main:    -> 0.0002s
main:    -> 0.0007s
main: -- current_schema(nil)
main:    -> 0.0002s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE saved_replies\nADD CONSTRAINT check_7fda141d1f\nCHECK ( namespace_id IS NOT NULL )\nNOT VALID;\n")
main:    -> 0.0024s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0004s
main: -- execute("ALTER TABLE saved_replies VALIDATE CONSTRAINT check_7fda141d1f;")
main:    -> 0.0004s
main: -- execute("RESET statement_timeout")
main:    -> 0.0002s
main: -- indexes(:saved_replies)
main:    -> 0.0020s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main:    -> 0.0005s
main: -- index_exists?(:saved_replies, ["namespace_id", "name"], {:unique=>true, :name=>"i_saved_replies_namespace_id_name_pattern", :length=>{}, :order=>{}, :using=>:btree, :opclass=>{"name"=>:text_pattern_ops}, :algorithm=>:concurrently})
main:    -> 0.0012s
main: -- add_index(:saved_replies, ["namespace_id", "name"], {:unique=>true, :name=>"i_saved_replies_namespace_id_name_pattern", :length=>{}, :order=>{}, :using=>:btree, :opclass=>{"name"=>:text_pattern_ops}, :algorithm=>:concurrently})
main:    -> 0.0024s
main: -- foreign_keys(:saved_replies)
main:    -> 0.0022s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE saved_replies ADD CONSTRAINT fk_a08a8bd207 FOREIGN KEY (namespace_id) REFERENCES users (id) ON DELETE CASCADE NOT VALID;")
main:    -> 0.0027s
main: -- execute("ALTER TABLE saved_replies VALIDATE CONSTRAINT fk_a08a8bd207;")
main:    -> 0.0023s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- column_exists?(:saved_replies, :user_id)
main:    -> 0.0012s
main: -- column_exists?(:saved_replies, :namespace_id)
main:    -> 0.0012s
main: -- current_schema(nil)
main:    -> 0.0002s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- quote_table_name(:saved_replies)
main:    -> 0.0000s
main: -- quote_column_name(:user_id)
main:    -> 0.0000s
main: -- quote_column_name(:namespace_id)
main:    -> 0.0000s
main: -- columns(:saved_replies)
main:    -> 0.0010s
main: -- execute("CREATE OR REPLACE FUNCTION function_for_trigger_6175d198e5ef()\nRETURNS trigger\nLANGUAGE plpgsql\nAS $$\nBEGIN\n  IF NEW.\"user_id\" IS NOT DISTINCT FROM NULL AND NEW.\"namespace_id\" IS DISTINCT FROM NULL THEN\n    NEW.\"user_id\" = NEW.\"namespace_id\";\n  END IF;\n\n  IF NEW.\"namespace_id\" IS NOT DISTINCT FROM NULL AND NEW.\"user_id\" IS DISTINCT FROM NULL THEN\n    NEW.\"namespace_id\" = NEW.\"user_id\";\n  END IF;\n\n  RETURN NEW;\nEND\n$$;\n\nDROP TRIGGER IF EXISTS trigger_6175d198e5ef\nON \"saved_replies\";\n\nCREATE TRIGGER trigger_6175d198e5ef\nBEFORE INSERT ON \"saved_replies\"\nFOR EACH ROW EXECUTE FUNCTION function_for_trigger_6175d198e5ef();\n")
main:    -> 0.0029s
main: -- execute("CREATE OR REPLACE FUNCTION function_for_trigger_fd94e4f340bd()\nRETURNS trigger\nLANGUAGE plpgsql\nAS $$\nBEGIN\n  NEW.\"user_id\" := NEW.\"namespace_id\";\n  RETURN NEW;\nEND\n$$;\n\nDROP TRIGGER IF EXISTS trigger_fd94e4f340bd\nON \"saved_replies\";\n\nCREATE TRIGGER trigger_fd94e4f340bd\nBEFORE UPDATE OF \"namespace_id\" ON \"saved_replies\"\nFOR EACH ROW EXECUTE FUNCTION function_for_trigger_fd94e4f340bd();\n")
main:    -> 0.0004s
main: -- execute("CREATE OR REPLACE FUNCTION function_for_trigger_cb44743d2902()\nRETURNS trigger\nLANGUAGE plpgsql\nAS $$\nBEGIN\n  NEW.\"namespace_id\" := NEW.\"user_id\";\n  RETURN NEW;\nEND\n$$;\n\nDROP TRIGGER IF EXISTS trigger_cb44743d2902\nON \"saved_replies\";\n\nCREATE TRIGGER trigger_cb44743d2902\nBEFORE UPDATE OF \"user_id\" ON \"saved_replies\"\nFOR EACH ROW EXECUTE FUNCTION function_for_trigger_cb44743d2902();\n")
main:    -> 0.0003s
main: == 20240201094316 RenameUserIdToNamespaceIdSavedReplies: migrated (0.1079s) ===

main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 62723
Down
main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 63179
main: == 20240201094316 RenameUserIdToNamespaceIdSavedReplies: reverting ============
main: -- column_exists?(:saved_replies, :namespace_id)
main:    -> 0.0161s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- quote_table_name(:saved_replies)
main:    -> 0.0000s
main: -- execute("DROP TRIGGER IF EXISTS trigger_6175d198e5ef\nON \"saved_replies\";\n\nDROP FUNCTION IF EXISTS function_for_trigger_6175d198e5ef;\n")
main:    -> 0.0005s
main: -- execute("DROP TRIGGER IF EXISTS trigger_fd94e4f340bd\nON \"saved_replies\";\n\nDROP FUNCTION IF EXISTS function_for_trigger_fd94e4f340bd;\n")
main:    -> 0.0003s
main: -- execute("DROP TRIGGER IF EXISTS trigger_cb44743d2902\nON \"saved_replies\";\n\nDROP FUNCTION IF EXISTS function_for_trigger_cb44743d2902;\n")
main:    -> 0.0003s
main: -- remove_column(:saved_replies, :namespace_id)
main:    -> 0.0011s
main: == 20240201094316 RenameUserIdToNamespaceIdSavedReplies: reverted (0.0325s) ===

main: == [advisory_lock_connection] object_id: 117420, pg_backend_pid: 63179

MR acceptance checklist

Screenshots or screen recordings

How to set up and validate locally

Merge request reports