Skip to content

Commit e0d7f0d

Browse files
committed
improvement: use uuid_generate_v4() to eliminate need for uuid-ossp just for uuid defaults
Thanks to @sevenseacat for pointing this out!
1 parent 9b97556 commit e0d7f0d

File tree

3 files changed

+61
-14
lines changed

3 files changed

+61
-14
lines changed

lib/migration_generator/migration_generator.ex

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,7 +1626,47 @@ defmodule AshPostgres.MigrationGenerator do
16261626

16271627
right = add_source_and_name_and_schema_and_ignore(right, repo)
16281628

1629-
left != right
1629+
{left, right} =
1630+
case {left.default, right.default} do
1631+
{"fragment(\"uuid_generate_v4()\")", "fragment(\"gen_random_uuid()\")"} ->
1632+
{Map.put(left, :default, "fragment(\"gen_random_uuid()\")"), right}
1633+
1634+
{"fragment(\"gen_random_uuid()\")", "fragment(\"uuid_generate_v4()\")"} ->
1635+
{Map.put(left, :default, "fragment(\"uuid_generate_v4()\")"), right}
1636+
1637+
_ ->
1638+
{left, right}
1639+
end
1640+
1641+
{left, right} =
1642+
case {left[:references][:destination_attribute_default],
1643+
right[:references][:destination_attribute_default]} do
1644+
{"fragment(\"uuid_generate_v4()\")", "fragment(\"gen_random_uuid()\")"} ->
1645+
{put_in(
1646+
left,
1647+
[:references, :destination_attribute_default],
1648+
"fragment(\"gen_random_uuid()\")"
1649+
), right}
1650+
1651+
{"fragment(\"gen_random_uuid()\")", "fragment(\"uuid_generate_v4()\")"} ->
1652+
{left,
1653+
put_in(
1654+
right,
1655+
[:references, :destination_attribute_default],
1656+
"fragment(\"gen_random_uuid()\")"
1657+
)}
1658+
1659+
_ ->
1660+
{left, right}
1661+
end
1662+
1663+
if left != right do
1664+
IO.inspect(left)
1665+
IO.inspect(right)
1666+
true
1667+
else
1668+
false
1669+
end
16301670
end
16311671

16321672
defp add_source_and_name_and_schema_and_ignore(attribute, repo) do
@@ -2170,14 +2210,11 @@ defmodule AshPostgres.MigrationGenerator do
21702210

21712211
@uuid_functions [&Ash.UUID.generate/0, &Ecto.UUID.generate/0]
21722212

2173-
defp default(%{default: default}, repo) when is_function(default) do
2213+
defp default(%{default: default}, _repo) when is_function(default) do
21742214
cond do
2175-
default in @uuid_functions && pg_version_at_least?(repo, 13) ->
2215+
default in @uuid_functions ->
21762216
~S[fragment("gen_random_uuid()")]
21772217

2178-
default in @uuid_functions && "uuid-ossp" in (repo.config()[:installed_extensions] || []) ->
2179-
~S[fragment("uuid_generate_v4()")]
2180-
21812218
default == (&DateTime.utc_now/0) ->
21822219
~S[fragment("now()")]
21832220

@@ -2190,12 +2227,6 @@ defmodule AshPostgres.MigrationGenerator do
21902227
defp default(%{default: nil}, _), do: "nil"
21912228
defp default(%{default: value}, _), do: EctoMigrationDefault.to_default(value)
21922229

2193-
defp pg_version_at_least?(repo, requirement) do
2194-
pg_version = repo.min_pg_version()
2195-
if pg_version < 13, do: raise("Minimum acceptable pg version is 13")
2196-
pg_version >= requirement
2197-
end
2198-
21992230
defp snapshot_to_binary(snapshot) do
22002231
snapshot
22012232
|> Map.update!(:attributes, fn attributes ->

lib/migration_generator/operation.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,22 @@ defmodule AshPostgres.MigrationGenerator.Operation do
370370
", primary_key: true"
371371
end
372372

373+
defaults_different? =
374+
cond do
375+
attribute.default == "fragment(\"uuid_generate_v4()\")" &&
376+
old_attribute.default == "fragment(\"gen_random_uuid()\")" ->
377+
false
378+
379+
old_attribute.default == "fragment(\"uuid_generate_v4()\")" &&
380+
attribute.default == "fragment(\"gen_random_uuid()\")" ->
381+
false
382+
383+
true ->
384+
attribute.default != old_attribute.default
385+
end
386+
373387
default =
374-
if attribute.default != old_attribute.default do
388+
if defaults_different? do
375389
if is_nil(attribute.default) do
376390
", default: nil"
377391
else

lib/repo.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ defmodule AshPostgres.Repo do
1212
1313
To configure your list of installed extensions, define `installed_extensions/0`
1414
15+
All extensions present will be automatically added by the migration generator. Some extensions
16+
being present in the list can change how AshPostgres behaves.
17+
1518
Extensions that are relevant to ash_postgres:
1619
1720
* "ash-functions" - This isn't really an extension, but it expresses that certain functions
1821
should be added when generating migrations, to support the `||` and `&&` operators in expressions.
19-
* `"uuid-ossp"` - Sets UUID primary keys defaults in the migration generator
2022
* `"pg_trgm"` - Makes the `AshPostgres.Predicates.Trigram` custom predicate available
2123
* "citext" - Allows case insensitive fields to be used
2224

0 commit comments

Comments
 (0)