Skip to content

Commit ab3a283

Browse files
committed
Add the ability to insert deferrable constraints after the table body
1 parent e763d10 commit ab3a283

File tree

9 files changed

+49
-5
lines changed

9 files changed

+49
-5
lines changed

lib/activerecord-clean-db-structure/clean_dump.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,29 @@ def clean_options
128128
dump.gsub!(/^(INSERT INTO schema_migrations .*)\n\n/, "\\1\n")
129129
end
130130

131-
if options[:indexes_after_tables] == true
132-
# Extract indexes, remove comments and place them just after the respective tables
131+
if options[:meta_tables_after_main] == true
132+
# Extract indexes
133133
indexes =
134134
dump
135135
.scan(/^CREATE.+INDEX.+ON.+\n/)
136136
.group_by { |line| line.scan(/\b\w+\.\w+\b/).first }
137137
.transform_values(&:join)
138138

139+
# Extract deferrable constraints
140+
deferrable_constraints =
141+
dump
142+
.scan(/^ALTER.+TABLE.+ONLY.+\n.+DEFERRABLE.+\n/)
143+
.group_by { |line| line.scan(/\b\w+\.\w+\b/).first }
144+
.transform_values(&:join)
145+
146+
# Remove indexes and deferrable constraints from the dump
139147
dump.gsub!(/^CREATE( UNIQUE)? INDEX \w+ ON .+\n+/, '')
140148
dump.gsub!(/^-- Name: \w+; Type: INDEX; Schema: \w+\n+/, '')
141-
indexes.each do |table, indexes_for_table|
149+
150+
dump.gsub!(/^-- Name.+\n\nALTER.+TABLE.+ONLY.+\n.+DEFERRABLE.+\n+/, '')
151+
152+
indexes_and_constraints = indexes.merge(deferrable_constraints) { |_, v1, v2| v1 + v2 }
153+
indexes_and_constraints.each do |table, indexes_for_table|
142154
dump.gsub!(/^(CREATE TABLE #{table}\b(:?[^;\n]*\n)+\);*\n(?:.*);*)/) { $1 + "\n\n" + indexes_for_table }
143155
end
144156
end

test/clean_dump_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ def test_order_schema_migrations_values
1717
assert_cleans_dump "data/input.sql", "expectations/order_schema_migrations_values.sql", order_schema_migrations_values: true
1818
end
1919

20-
def test_indexes_after_tables
21-
assert_cleans_dump "data/input.sql", "expectations/indexes_after_tables.sql", indexes_after_tables: true
20+
def test_meta_tables_after_main
21+
assert_cleans_dump "data/input.sql", "expectations/meta_tables_after_main.sql", meta_tables_after_main: true
2222
end
2323

2424
def test_keep_extensions_all

test/data/input.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ ALTER TABLE ONLY public.ar_internal_metadata
113113
ALTER TABLE ONLY public.delayed_jobs
114114
ADD CONSTRAINT delayed_jobs_pkey PRIMARY KEY (id);
115115

116+
--
117+
-- Name: unique_locked_by_locked_at; Type: CONSTRAINT
118+
--
119+
ALTER TABLE ONLY public.delayed_jobs
120+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
116121

117122
--
118123
-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: -

test/expectations/default_props.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ CREATE TABLE public.schema_migrations (
4646
ALTER TABLE ONLY public.ar_internal_metadata
4747
ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
4848

49+
-- Name: unique_locked_by_locked_at; Type: CONSTRAINT
50+
51+
ALTER TABLE ONLY public.delayed_jobs
52+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
53+
4954
ALTER TABLE ONLY public.schema_migrations
5055
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
5156

test/expectations/ignore_ids.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ ALTER TABLE ONLY public.ar_internal_metadata
7070
ALTER TABLE ONLY public.delayed_jobs
7171
ADD CONSTRAINT delayed_jobs_pkey PRIMARY KEY (id);
7272

73+
-- Name: unique_locked_by_locked_at; Type: CONSTRAINT
74+
75+
ALTER TABLE ONLY public.delayed_jobs
76+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
77+
7378
-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT
7479

7580
ALTER TABLE ONLY public.schema_migrations

test/expectations/keep_extensions_all.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ CREATE TABLE public.schema_migrations (
5252
ALTER TABLE ONLY public.ar_internal_metadata
5353
ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
5454

55+
-- Name: unique_locked_by_locked_at; Type: CONSTRAINT
56+
57+
ALTER TABLE ONLY public.delayed_jobs
58+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
59+
5560
ALTER TABLE ONLY public.schema_migrations
5661
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
5762

test/expectations/indexes_after_tables.sql renamed to test/expectations/meta_tables_after_main.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ WITH (fillfactor='85');
4040
CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree (locked_by);
4141
CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue);
4242
CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL);
43+
ALTER TABLE ONLY public.delayed_jobs
44+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
4345

4446
-- Name: schema_migrations; Type: TABLE
4547

test/expectations/order_column_definitions.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ CREATE TABLE public.schema_migrations (
4646
ALTER TABLE ONLY public.ar_internal_metadata
4747
ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
4848

49+
-- Name: unique_locked_by_locked_at; Type: CONSTRAINT
50+
51+
ALTER TABLE ONLY public.delayed_jobs
52+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
53+
4954
ALTER TABLE ONLY public.schema_migrations
5055
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
5156

test/expectations/order_schema_migrations_values.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ CREATE TABLE public.schema_migrations (
4646
ALTER TABLE ONLY public.ar_internal_metadata
4747
ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
4848

49+
-- Name: unique_locked_by_locked_at; Type: CONSTRAINT
50+
51+
ALTER TABLE ONLY public.delayed_jobs
52+
ADD CONSTRAINT unique_locked_by_locked_at UNIQUE (locked_by, locked_at) DEFERRABLE INITIALLY DEFERRED;
53+
4954
ALTER TABLE ONLY public.schema_migrations
5055
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
5156

0 commit comments

Comments
 (0)