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

Commitb7efe6e

Browse files
committed
improvement: custom index names
fix: simpler index names
1 parent41e95af commitb7efe6e

File tree

8 files changed

+241
-40
lines changed

8 files changed

+241
-40
lines changed

‎.formatter.exs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ locals_without_parens = [
77
check_constraint:3,
88
create?:1,
99
foreign_key_names:1,
10+
identity_index_names:1,
1011
message:1,
1112
migrate?:1,
1213
name:1,

‎lib/ash_postgres.ex‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ defmodule AshPostgres do
5454
Extension.get_opt(resource,[:postgres],:unique_index_names,[],true)
5555
end
5656

57+
@doc"The configured identity_index_names"
58+
defidentity_index_names(resource)do
59+
Extension.get_opt(resource,[:postgres],:identity_index_names,[],true)
60+
end
61+
5762
@doc"The configured foreign_key_names"
5863
defforeign_key_names(resource)do
5964
Extension.get_opt(resource,[:postgres],:foreign_key_names,[],true)

‎lib/data_layer.ex‎

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,18 @@ defmodule AshPostgres.DataLayer do
219219
doc:"""
220220
A list of unique index names that could raise errors, or an mfa to a function that takes a changeset
221221
and returns the list. Must be in the format `{[:affected, :keys], "name_of_constraint"}` or `{[:affected, :keys], "name_of_constraint", "custom error message"}`
222+
223+
Note that this is *not* used to rename the unique indexes created from `identities`.
224+
Use `identity_index_names` for that. This is used to tell ash_postgres about unique indexes that
225+
exist in the database that it didn't create.
226+
"""
227+
],
228+
identity_index_names:[
229+
type::any,
230+
default:[],
231+
doc:"""
232+
A keyword list of identity names to the unique index name that they should use when being managed by the migration
233+
generator.
222234
"""
223235
],
224236
foreign_key_names:[
@@ -623,7 +635,7 @@ defmodule AshPostgres.DataLayer do
623635
|>set_table(changeset,type)
624636
|>Ecto.Changeset.change(changeset.attributes)
625637
|>add_configured_foreign_key_constraints(record.__struct__)
626-
|>add_unique_indexes(record.__struct__,changeset.tenant,changeset)
638+
|>add_unique_indexes(record.__struct__,changeset)
627639
|>add_check_constraints(record.__struct__)
628640

629641
casetypedo
@@ -720,17 +732,14 @@ defmodule AshPostgres.DataLayer do
720732
end)
721733
end
722734

723-
defpadd_unique_indexes(changeset,resource,tenant,ash_changeset)do
735+
defpadd_unique_indexes(changeset,resource,ash_changeset)do
724736
changeset=
725737
resource
726738
|>Ash.Resource.Info.identities()
727739
|>Enum.reduce(changeset,fnidentity,changeset->
728740
name=
729-
iftenantdo
730-
"#{tenant}_#{table(resource,ash_changeset)}_#{identity.name}_unique_index"
731-
else
732-
"#{table(resource,ash_changeset)}_#{identity.name}_unique_index"
733-
end
741+
AshPostgres.identity_index_names(resource)[identity.name]||
742+
"#{table(resource,ash_changeset)}_#{identity.name}_index"
734743

735744
opts=
736745
ifMap.get(identity,:message)do

‎lib/migration_generator/migration_generator.ex‎

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,15 @@ defmodule AshPostgres.MigrationGenerator do
834834
sort_operations(rest,new_acc)
835835
end
836836

837+
defpafter?(
838+
%Operation.RenameUniqueIndex{
839+
table:table
840+
},
841+
%{table:table}
842+
)do
843+
true
844+
end
845+
837846
defpafter?(
838847
%Operation.AddUniqueIndex{
839848
table:table
@@ -1049,7 +1058,8 @@ defmodule AshPostgres.MigrationGenerator do
10491058
else
10501059
Enum.reject(old_snapshot.identities,fnold_identity->
10511060
Enum.find(snapshot.identities,fnidentity->
1052-
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
1061+
identity.name==old_identity.name&&
1062+
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
10531063
old_identity.base_filter==identity.base_filter
10541064
end)
10551065
end)
@@ -1058,13 +1068,37 @@ defmodule AshPostgres.MigrationGenerator do
10581068
%Operation.RemoveUniqueIndex{identity:identity,table:snapshot.table}
10591069
end)
10601070

1071+
unique_indexes_to_rename=
1072+
ifrewrite_all_identities?do
1073+
[]
1074+
else
1075+
snapshot.identities
1076+
|>Enum.map(fnidentity->
1077+
Enum.find_value(old_snapshot.identities,fnold_identity->
1078+
ifold_identity.name==identity.name&&
1079+
old_identity.index_name!=identity.index_namedo
1080+
{old_identity,identity}
1081+
end
1082+
end)
1083+
end)
1084+
|>Enum.filter(&&1)
1085+
end
1086+
|>Enum.map(fn{old_identity,new_identity}->
1087+
%Operation.RenameUniqueIndex{
1088+
old_identity:old_identity,
1089+
new_identity:new_identity,
1090+
table:snapshot.table
1091+
}
1092+
end)
1093+
10611094
unique_indexes_to_add=
10621095
ifrewrite_all_identities?do
10631096
snapshot.identities
10641097
else
10651098
Enum.reject(snapshot.identities,fnidentity->
10661099
Enum.find(old_snapshot.identities,fnold_identity->
1067-
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
1100+
old_identity.name==identity.name&&
1101+
Enum.sort(old_identity.keys)==Enum.sort(identity.keys)&&
10681102
old_identity.base_filter==identity.base_filter
10691103
end)
10701104
end)
@@ -1108,6 +1142,7 @@ defmodule AshPostgres.MigrationGenerator do
11081142
unique_indexes_to_remove,
11091143
attribute_operations,
11101144
unique_indexes_to_add,
1145+
unique_indexes_to_rename,
11111146
constraints_to_add,
11121147
constraints_to_remove,
11131148
acc
@@ -1551,6 +1586,8 @@ defmodule AshPostgres.MigrationGenerator do
15511586
end
15521587

15531588
defpidentities(resource)do
1589+
identity_index_names=AshPostgres.identity_index_names(resource)
1590+
15541591
resource
15551592
|>Ash.Resource.Info.identities()
15561593
|>casedo
@@ -1583,6 +1620,14 @@ defmodule AshPostgres.MigrationGenerator do
15831620
end)
15841621
|>Enum.sort_by(&&1.name)
15851622
|>Enum.map(&Map.take(&1,[:name,:keys]))
1623+
|>Enum.map(fnidentity->
1624+
Map.put(
1625+
identity,
1626+
:index_name,
1627+
identity_index_names[identity.name]||
1628+
"#{AshPostgres.table(resource)}_#{identity.name}_index"
1629+
)
1630+
end)
15861631
|>Enum.map(&Map.put(&1,:base_filter,AshPostgres.base_filter_sql(resource)))
15871632
end
15881633

@@ -1649,7 +1694,7 @@ defmodule AshPostgres.MigrationGenerator do
16491694
snapshot
16501695
|>Map.put_new(:has_create_action,true)
16511696
|>Map.update!(:identities,fnidentities->
1652-
Enum.map(identities,&load_identity/1)
1697+
Enum.map(identities,&load_identity(&1,snapshot.table))
16531698
end)
16541699
|>Map.update!(:attributes,fnattributes->
16551700
Enum.map(attributes,&load_attribute(&1,snapshot.table))
@@ -1718,14 +1763,19 @@ defmodule AshPostgres.MigrationGenerator do
17181763
String.to_atom(type)
17191764
end
17201765

1721-
defpload_identity(identity)do
1766+
defpload_identity(identity,table)do
17221767
identity
17231768
|>Map.update!(:name,&String.to_atom/1)
17241769
|>Map.update!(:keys,fnkeys->
17251770
keys
17261771
|>Enum.map(&String.to_atom/1)
17271772
|>Enum.sort()
17281773
end)
1774+
|>add_index_name(table)
17291775
|>Map.put_new(:base_filter,nil)
17301776
end
1777+
1778+
defpadd_index_name(%{name:name}=index,table)do
1779+
Map.put_new(index,:index_name,"#{table}_#{name}_unique_index")
1780+
end
17311781
end

‎lib/migration_generator/operation.ex‎

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ defmodule AshPostgres.MigrationGenerator.Operation do
471471
defstruct[:identity,:table,:multitenancy,:old_multitenancy,no_phase:true]
472472

473473
defup(%{
474-
identity:%{name:name,keys:keys,base_filter:base_filter},
474+
identity:%{name:name,keys:keys,base_filter:base_filter,index_name:index_name},
475475
table:table,
476476
multitenancy:multitenancy
477477
})do
@@ -484,19 +484,21 @@ defmodule AshPostgres.MigrationGenerator.Operation do
484484
keys
485485
end
486486

487+
index_name=index_name||"#{table}_#{name}_index"
488+
487489
ifbase_filterdo
488490
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
489-
table
490-
}_#{name}_unique_index\", where:\"#{base_filter}\")"
491+
index_name
492+
}\", where:\"#{base_filter}\")"
491493
else
492494
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
493-
table
494-
}_#{name}_unique_index\")"
495+
index_name
496+
}\")"
495497
end
496498
end
497499

498500
defdown(%{
499-
identity:%{name:name,keys:keys},
501+
identity:%{name:name,keys:keys,index_name:index_name},
500502
table:table,
501503
multitenancy:multitenancy
502504
})do
@@ -509,17 +511,57 @@ defmodule AshPostgres.MigrationGenerator.Operation do
509511
keys
510512
end
511513

514+
index_name=index_name||"#{table}_#{name}_index"
515+
512516
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
513-
table
514-
}_#{name}_unique_index\")"
517+
index_name
518+
}\")"
519+
end
520+
end
521+
522+
defmoduleRenameUniqueIndexdo
523+
@moduledocfalse
524+
defstruct[
525+
:new_identity,
526+
:old_identity,
527+
:table,
528+
:multitenancy,
529+
:old_multitenancy,
530+
no_phase:true
531+
]
532+
533+
defup(%{
534+
old_identity:%{index_name:old_index_name,name:old_name},
535+
new_identity:%{index_name:new_index_name},
536+
table:table
537+
})do
538+
old_index_name=old_index_name||"#{table}_#{old_name}_index"
539+
540+
"execute(\"ALTER INDEX#{old_index_name} "<>
541+
"RENAME TO#{new_index_name}\")\n"
542+
end
543+
544+
defdown(%{
545+
old_identity:%{index_name:old_index_name,name:old_name},
546+
new_identity:%{index_name:new_index_name},
547+
table:table
548+
})do
549+
old_index_name=old_index_name||"#{table}_#{old_name}_index"
550+
551+
"execute(\"ALTER INDEX#{new_index_name} "<>
552+
"RENAME TO#{old_index_name}\")\n"
515553
end
516554
end
517555

518556
defmoduleRemoveUniqueIndexdo
519557
@moduledocfalse
520558
defstruct[:identity,:table,:multitenancy,:old_multitenancy,no_phase:true]
521559

522-
defup(%{identity:%{name:name,keys:keys},table:table,old_multitenancy:multitenancy})do
560+
defup(%{
561+
identity:%{name:name,keys:keys,index_name:index_name},
562+
table:table,
563+
old_multitenancy:multitenancy
564+
})do
523565
keys=
524566
casemultitenancy.strategydo
525567
:attribute->
@@ -529,13 +571,15 @@ defmodule AshPostgres.MigrationGenerator.Operation do
529571
keys
530572
end
531573

574+
index_name=index_name||"#{table}_#{name}_index"
575+
532576
"drop_if_exists unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
533-
table
534-
}_#{name}_unique_index\")"
577+
index_name
578+
}\")"
535579
end
536580

537581
defdown(%{
538-
identity:%{name:name,keys:keys,base_filter:base_filter},
582+
identity:%{name:name,keys:keys,base_filter:base_filter,index_name:index_name},
539583
table:table,
540584
multitenancy:multitenancy
541585
})do
@@ -548,14 +592,16 @@ defmodule AshPostgres.MigrationGenerator.Operation do
548592
keys
549593
end
550594

595+
index_name=index_name||"#{table}_#{name}_index"
596+
551597
ifbase_filterdo
552598
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
553-
table
554-
}_#{name}_unique_index\", where:\"#{base_filter}\")"
599+
index_name
600+
}\", where:\"#{base_filter}\")"
555601
else
556602
"create unique_index(:#{table}, [#{Enum.map_join(keys,",",&inspect/1)}], name:\"#{
557-
table
558-
}_#{name}_unique_index\")"
603+
index_name
604+
}\")"
559605
end
560606
end
561607
end
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"attributes": [
3+
{
4+
"allow_nil?":false,
5+
"default":"fragment(\"uuid_generate_v4()\")",
6+
"generated?":false,
7+
"name":"id",
8+
"primary_key?":true,
9+
"references":null,
10+
"type":"uuid"
11+
},
12+
{
13+
"allow_nil?":true,
14+
"default":"nil",
15+
"generated?":false,
16+
"name":"name",
17+
"primary_key?":false,
18+
"references":null,
19+
"type":"text"
20+
}
21+
],
22+
"base_filter":null,
23+
"check_constraints": [],
24+
"has_create_action":true,
25+
"hash":"82D2325856ABAC1BFF6083E8BC1C40FA96A29005CA5F4BF6EA1C5A4DA52951C6",
26+
"identities": [
27+
{
28+
"base_filter":null,
29+
"index_name":"multitenant_orgs_unique_by_name_index",
30+
"keys": [
31+
"name"
32+
],
33+
"name":"unique_by_name"
34+
}
35+
],
36+
"multitenancy": {
37+
"attribute":"id",
38+
"global":true,
39+
"strategy":"attribute"
40+
},
41+
"repo":"Elixir.AshPostgres.TestRepo",
42+
"table":"multitenant_orgs"
43+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp