Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit595ad71

Browse files
committed
fix: various migration generator bug fixes
1 parent06c2753 commit595ad71

File tree

3 files changed

+136
-61
lines changed

3 files changed

+136
-61
lines changed

‎lib/migration_generator/migration_generator.ex‎

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,27 @@ defmodule AshPostgres.MigrationGenerator do
7272
|>sort_operations()
7373
|>streamline()
7474
|>group_into_phases()
75+
|>comment_out_phases()
7576
|>build_up_and_down()
7677
|>write_migration(snapshots,repo,opts,tenant?)
7778
end
7879
end)
7980
end
8081

82+
defpcomment_out_phases(phases)do
83+
Enum.map(phases,fn
84+
%{operations:operations}=phase->
85+
ifEnum.all?(operations,&match?(%{commented?:true},&1))do
86+
%{phase|commented?:true}
87+
else
88+
phase
89+
end
90+
91+
phase->
92+
phase
93+
end)
94+
end
95+
8196
defpdeduplicate_snapshots(snapshots,opts)do
8297
snapshots
8398
|>Enum.group_by(fnsnapshot->
@@ -416,19 +431,40 @@ defmodule AshPostgres.MigrationGenerator do
416431
defpbuild_up_and_down(phases)do
417432
up=
418433
Enum.map_join(phases,"\n",fnphase->
419-
phase.__struct__.up(phase)<>"\n"
434+
phase
435+
|>phase.__struct__.up()
436+
|>Kernel.<>("\n")
437+
|>maybe_comment(phase)
420438
end)
421439

422440
down=
423441
phases
424442
|>Enum.reverse()
425443
|>Enum.map_join("\n",fnphase->
426-
phase.__struct__.down(phase)<>"\n"
444+
phase
445+
|>phase.__struct__.down()
446+
|>Kernel.<>("\n")
447+
|>maybe_comment(phase)
427448
end)
428449

429450
{up,down}
430451
end
431452

453+
defpmaybe_comment(text,%{commented?:true})do
454+
text
455+
|>String.split("\n")
456+
|>Enum.map(fnline->
457+
ifString.starts_with?(line,"#")do
458+
line
459+
else
460+
"##{line}"
461+
end
462+
end)
463+
|>Enum.join("\n")
464+
end
465+
466+
defpmaybe_comment(text,_),do:text
467+
432468
defpformat(string,opts)do
433469
ifopts.formatdo
434470
Code.format_string!(string)
@@ -573,10 +609,14 @@ defmodule AshPostgres.MigrationGenerator do
573609
end
574610

575611
defpafter?(
576-
%Operation.AddUniqueIndex{identity:%{keys:keys},table:table},
612+
%Operation.AddUniqueIndex{
613+
identity:%{keys:keys},
614+
table:table,
615+
multitenancy:multitenancy
616+
},
577617
%Operation.AddAttribute{table:table,attribute:%{name:name}}
578618
)do
579-
nameinkeys
619+
nameinkeys||(multitenancy.attribute&&name==multitenancy.attribute)
580620
end
581621

582622
defpafter?(
@@ -735,26 +775,34 @@ defmodule AshPostgres.MigrationGenerator do
735775
defpdo_fetch_operations(snapshot,old_snapshot,opts,acc)do
736776
attribute_operations=attribute_operations(snapshot,old_snapshot,opts)
737777

778+
rewrite_all_identities?=changing_multitenancy_affects_identities?(snapshot,old_snapshot)
779+
738780
unique_indexes_to_remove=
739-
old_snapshot.identities
740-
|>Enum.reject(fnold_identity->
741-
Enum.find(snapshot.identities,fnidentity->
742-
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
743-
old_identity.base_filter==identity.base_filter
781+
ifrewrite_all_identities?do
782+
old_snapshot.identities
783+
else
784+
Enum.reject(old_snapshot.identities,fnold_identity->
785+
Enum.find(snapshot.identities,fnidentity->
786+
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
787+
old_identity.base_filter==identity.base_filter
788+
end)
744789
end)
745-
end)
790+
end
746791
|>Enum.map(fnidentity->
747792
%Operation.RemoveUniqueIndex{identity:identity,table:snapshot.table}
748793
end)
749794

750795
unique_indexes_to_add=
751-
snapshot.identities
752-
|>Enum.reject(fnidentity->
753-
Enum.find(old_snapshot.identities,fnold_identity->
754-
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
755-
old_identity.base_filter==identity.base_filter
796+
ifrewrite_all_identities?do
797+
snapshot.identities
798+
else
799+
Enum.reject(snapshot.identities,fnidentity->
800+
Enum.find(old_snapshot.identities,fnold_identity->
801+
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
802+
old_identity.base_filter==identity.base_filter
803+
end)
756804
end)
757-
end)
805+
end
758806
|>Enum.map(fnidentity->
759807
%Operation.AddUniqueIndex{
760808
identity:identity,
@@ -866,6 +914,10 @@ defmodule AshPostgres.MigrationGenerator do
866914
alter_attribute_events++remove_attribute_events++rename_attribute_events
867915
end
868916

917+
defchanging_multitenancy_affects_identities?(snapshot,old_snapshot)do
918+
snapshot.multitenancy!=old_snapshot.multitenancy
919+
end
920+
869921
defhas_reference?(multitenancy,attribute)do
870922
notis_nil(Map.get(attribute,:references))and
871923
!(attribute.references.multitenancy&&

‎lib/migration_generator/operation.ex‎

Lines changed: 66 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -298,21 +298,19 @@ defmodule AshPostgres.MigrationGenerator.Operation do
298298
table:table,
299299
multitenancy:multitenancy
300300
})do
301-
name_prefix=
302-
ifmultitenancy.strategy==:contextdo
303-
"\#\{prefix\}_"
304-
else
305-
""
301+
{name_prefix,keys}=
302+
casemultitenancy.strategydo
303+
:context->
304+
{"\#\{prefix\}_",keys}
305+
306+
:attribute->
307+
{"",[multitenancy.attribute|keys]}
308+
309+
_->
310+
{"",keys}
306311
end
307312

308313
ifbase_filterdo
309-
keys=
310-
ifmultitenancy.strategy==:attributedo
311-
keys++[multitenancy.attribute]
312-
else
313-
keys
314-
end
315-
316314
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
317315
name_prefix
318316
}#{table}_#{name}_unique_index\", where:\"#{base_filter}\")"
@@ -323,16 +321,26 @@ defmodule AshPostgres.MigrationGenerator.Operation do
323321
end
324322
end
325323

326-
defdown(%{identity:%{name:name,keys:keys},table:table,old_multitenancy:multitenancy})do
327-
ifmultitenancy.strategy==:contextdo
328-
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"\#\{prefix\}_#{
329-
table
330-
}_#{name}_unique_index\")"
331-
else
332-
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
333-
table
334-
}_#{name}_unique_index\")"
335-
end
324+
defdown(%{
325+
identity:%{name:name,keys:keys},
326+
table:table,
327+
multitenancy:multitenancy
328+
})do
329+
{name_prefix,keys}=
330+
casemultitenancy.strategydo
331+
:context->
332+
{"\#\{prefix\}_",keys}
333+
334+
:attribute->
335+
{"",[multitenancy.attribute|keys]}
336+
337+
_->
338+
{"",keys}
339+
end
340+
341+
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
342+
name_prefix
343+
}#{table}_#{name}_unique_index\")"
336344
end
337345
end
338346

@@ -341,33 +349,48 @@ defmodule AshPostgres.MigrationGenerator.Operation do
341349
defstruct[:identity,:table,:multitenancy,:old_multitenancy,no_phase:true]
342350

343351
defup(%{identity:%{name:name,keys:keys},table:table,old_multitenancy:multitenancy})do
344-
ifmultitenancy.strategy==:contextdo
345-
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"\#\{prefix\}_#{
346-
table
347-
}_#{name}_unique_index\")"
348-
else
349-
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
350-
table
351-
}_#{name}_unique_index\")"
352-
end
352+
{name_prefix,keys}=
353+
casemultitenancy.strategydo
354+
:context->
355+
{"\#\{prefix\}_",keys}
356+
357+
:attribute->
358+
{"",[multitenancy.attribute|keys]}
359+
360+
_->
361+
{"",keys}
362+
end
363+
364+
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
365+
name_prefix
366+
}#{table}_#{name}_unique_index\")"
353367
end
354368

355-
defdown(%{identity:%{name:name,keys:keys},table:table,multitenancy:multitenancy})do
356-
keys=
357-
ifmultitenancy.strategy==:attributedo
358-
keys++[multitenancy.attribute]
359-
else
360-
keys
369+
defdown(%{
370+
identity:%{name:name,keys:keys,base_filter:base_filter},
371+
table:table,
372+
multitenancy:multitenancy
373+
})do
374+
{name_prefix,keys}=
375+
casemultitenancy.strategydo
376+
:context->
377+
{"\#\{prefix\}_",keys}
378+
379+
:attribute->
380+
{"",[multitenancy.attribute|keys]}
381+
382+
_->
383+
{"",keys}
361384
end
362385

363-
ifmultitenancy.strategy==:contextdo
364-
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"\#\{prefix\}_#{
365-
table
366-
}_#{name}_unique_index\")"
386+
ifbase_filterdo
387+
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
388+
name_prefix
389+
}#{table}_#{name}_unique_index\", where:\"#{base_filter}\")"
367390
else
368391
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
369-
table
370-
}_#{name}_unique_index\")"
392+
name_prefix
393+
}#{table}_#{name}_unique_index\")"
371394
end
372395
end
373396
end

‎lib/migration_generator/phase.ex‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule AshPostgres.MigrationGenerator.Phase do
33

44
defmoduleCreatedo
55
@moduledocfalse
6-
defstruct[:table,:multitenancy,operations:[]]
6+
defstruct[:table,:multitenancy,operations:[],commented?:false]
77

88
defup(%{table:table,operations:operations,multitenancy:multitenancy})do
99
ifmultitenancy.strategy==:contextdo
@@ -28,7 +28,7 @@ defmodule AshPostgres.MigrationGenerator.Phase do
2828

2929
defmoduleAlterdo
3030
@moduledocfalse
31-
defstruct[:table,:multitenancy,operations:[]]
31+
defstruct[:table,:multitenancy,operations:[],commented?:false]
3232

3333
defup(%{table:table,operations:operations,multitenancy:multitenancy})do
3434
body=

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp