]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #4279 from tomhughes/changeset-tags-primary-key
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 18 Oct 2023 14:41:01 +0000 (15:41 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Oct 2023 14:41:01 +0000 (15:41 +0100)
Add a primary key to the changeset_tags table

config/initializers/migrate.rb
db/migrate/20231007141103_add_primary_key_to_changeset_tags.rb [new file with mode: 0644]
db/structure.sql

index add6aaea9cc76b3feed4c285fbbfc62f09985c3a..0667e3346b01d03a5b15d3af5c5bce09722125b7 100644 (file)
@@ -1,31 +1,46 @@
 if defined?(ActiveRecord::ConnectionAdapters::AbstractAdapter)
   module OpenStreetMap
-    module ActiveRecord
-      module PostgreSQLAdapter
+    module PostgreSQL
+      module Quoting
         def quote_column_name(name)
           Array(name).map { |n| super(n) }.join(", ")
         end
+      end
 
-        def add_primary_key(table_name, column_name, _options = {})
-          table_name = quote_table_name(table_name)
-          column_name = quote_column_name(column_name)
+      module SchemaStatements
+        def add_primary_key(table_name, column_name, options = {})
+          constraint_name = "#{table_name}_pkey"
+
+          options = options.merge(:name => constraint_name, :unique => true)
 
-          execute "ALTER TABLE #{table_name} ADD PRIMARY KEY (#{column_name})"
+          add_index(table_name, column_name, **options)
+          set_primary_key table_name, constraint_name
         end
 
         def remove_primary_key(table_name)
+          constraint_name = quote_table_name("#{table_name}_pkey")
           table_name = quote_table_name(table_name)
 
-          execute "ALTER TABLE #{table_name} DROP PRIMARY KEY"
+          execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint_name}"
         end
 
-        def alter_primary_key(table_name, new_columns)
-          constraint_name = quote_table_name("#{table_name}_pkey")
+        def alter_primary_key(table_name, column_name, options = {})
+          constraint_name = "#{table_name}_pkey"
+          tmp_constraint_name = "#{table_name}_pkey_tmp"
+
+          options = options.merge(:name => tmp_constraint_name, :unique => true)
+
+          add_index(table_name, column_name, **options)
+          remove_primary_key table_name
+          set_primary_key table_name, tmp_constraint_name
+          rename_index table_name, tmp_constraint_name, constraint_name
+        end
+
+        def set_primary_key(table_name, constraint_name)
+          constraint_name = quote_table_name(constraint_name)
           table_name = quote_table_name(table_name)
-          new_columns = quote_column_name(new_columns)
 
-          execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint_name}"
-          execute "ALTER TABLE #{table_name} ADD PRIMARY KEY (#{new_columns})"
+          execute "ALTER TABLE #{table_name} ADD PRIMARY KEY USING INDEX #{constraint_name}"
         end
 
         def create_enumeration(enumeration_name, values)
@@ -46,5 +61,6 @@ if defined?(ActiveRecord::ConnectionAdapters::AbstractAdapter)
     end
   end
 
-  ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(OpenStreetMap::ActiveRecord::PostgreSQLAdapter)
+  ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting.prepend(OpenStreetMap::PostgreSQL::Quoting)
+  ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements.prepend(OpenStreetMap::PostgreSQL::SchemaStatements)
 end
diff --git a/db/migrate/20231007141103_add_primary_key_to_changeset_tags.rb b/db/migrate/20231007141103_add_primary_key_to_changeset_tags.rb
new file mode 100644 (file)
index 0000000..6f01865
--- /dev/null
@@ -0,0 +1,13 @@
+class AddPrimaryKeyToChangesetTags < ActiveRecord::Migration[7.0]
+  disable_ddl_transaction!
+
+  def up
+    add_primary_key :changeset_tags, [:changeset_id, :k], :algorithm => :concurrently
+    remove_index :changeset_tags, [:changeset_id]
+  end
+
+  def down
+    add_index :changeset_tags, [:changeset_id], :algorithm => :concurrently
+    remove_primary_key :changeset_tags
+  end
+end
index bd65755f2bbbe40209908b4114bd730b91c82d46..939799c0a3509701f45d0b9d4d7bbb5b82d81eb6 100644 (file)
@@ -1838,6 +1838,14 @@ ALTER TABLE ONLY public.changeset_comments
     ADD CONSTRAINT changeset_comments_pkey PRIMARY KEY (id);
 
 
+--
+-- Name: changeset_tags changeset_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.changeset_tags
+    ADD CONSTRAINT changeset_tags_pkey PRIMARY KEY (changeset_id, k);
+
+
 --
 -- Name: changesets changesets_pkey; Type: CONSTRAINT; Schema: public; Owner: -
 --
@@ -2205,13 +2213,6 @@ ALTER TABLE ONLY public.ways
 CREATE INDEX acls_k_idx ON public.acls USING btree (k);
 
 
---
--- Name: changeset_tags_id_idx; Type: INDEX; Schema: public; Owner: -
---
-
-CREATE INDEX changeset_tags_id_idx ON public.changeset_tags USING btree (changeset_id);
-
-
 --
 -- Name: changesets_bbox_idx; Type: INDEX; Schema: public; Owner: -
 --
@@ -3466,6 +3467,7 @@ INSERT INTO "schema_migrations" (version) VALUES
 ('20230825162137'),
 ('20230830115219'),
 ('20230830115220'),
+('20231007141103'),
 ('21'),
 ('22'),
 ('23'),