Skip to content

Commit 9d47357

Browse files
committed
improvement: support nils_distinct? in identities
closes #84
1 parent 267cc40 commit 9d47357

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

lib/migration_generator/migration_generator.ex

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,7 +1633,8 @@ defmodule AshSqlite.MigrationGenerator do
16331633
Enum.find(snapshot.identities, fn identity ->
16341634
identity.name == old_identity.name &&
16351635
Enum.sort(old_identity.keys) == Enum.sort(identity.keys) &&
1636-
old_identity.base_filter == identity.base_filter
1636+
old_identity.base_filter == identity.base_filter &&
1637+
Map.get(old_identity, :nils_distinct?, true) == Map.get(identity, :nils_distinct?, true)
16371638
end)
16381639
end)
16391640
end
@@ -1675,7 +1676,8 @@ defmodule AshSqlite.MigrationGenerator do
16751676
Enum.find(old_snapshot.identities, fn old_identity ->
16761677
old_identity.name == identity.name &&
16771678
Enum.sort(old_identity.keys) == Enum.sort(identity.keys) &&
1678-
old_identity.base_filter == identity.base_filter
1679+
old_identity.base_filter == identity.base_filter &&
1680+
Map.get(old_identity, :nils_distinct?, true) == Map.get(identity, :nils_distinct?, true)
16791681
end)
16801682
end)
16811683
end
@@ -2454,7 +2456,7 @@ defmodule AshSqlite.MigrationGenerator do
24542456
end)
24552457
end)
24562458
|> Enum.sort_by(& &1.name)
2457-
|> Enum.map(&Map.take(&1, [:name, :keys]))
2459+
|> Enum.map(&Map.take(&1, [:name, :keys, :nils_distinct?]))
24582460
|> Enum.map(fn %{keys: keys} = identity ->
24592461
%{
24602462
identity
@@ -2473,6 +2475,7 @@ defmodule AshSqlite.MigrationGenerator do
24732475
"#{AshSqlite.DataLayer.Info.table(resource)}_#{identity.name}_index"
24742476
)
24752477
end)
2478+
|> Enum.map(&Map.put_new(&1, :nils_distinct?, true))
24762479
|> Enum.map(&Map.put(&1, :base_filter, AshSqlite.DataLayer.Info.base_filter_sql(resource)))
24772480
end
24782481

lib/migration_generator/operation.ex

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ defmodule AshSqlite.MigrationGenerator.Operation do
3131
# sobelow_skip ["DOS.StringToAtom"]
3232
def as_atom(value), do: Macro.inspect_atom(:remote_call, String.to_atom(value))
3333

34+
def option(key, value) when key in [:nulls_distinct, "nulls_distinct"] do
35+
if !value do
36+
"#{as_atom(key)}: #{inspect(value)}"
37+
end
38+
end
39+
3440
def option(key, value) do
3541
if value do
3642
"#{as_atom(key)}: #{inspect(value)}"
@@ -478,10 +484,12 @@ defmodule AshSqlite.MigrationGenerator.Operation do
478484
import Helper
479485

480486
def up(%{
481-
identity: %{name: name, keys: keys, base_filter: base_filter, index_name: index_name},
487+
identity: %{name: name, keys: keys, base_filter: base_filter, index_name: index_name} = identity,
482488
table: table,
483489
multitenancy: multitenancy
484490
}) do
491+
nils_distinct? = Map.get(identity, :nils_distinct?, true)
492+
485493
keys =
486494
case multitenancy.strategy do
487495
:attribute ->
@@ -494,9 +502,9 @@ defmodule AshSqlite.MigrationGenerator.Operation do
494502
index_name = index_name || "#{table}_#{name}_index"
495503

496504
if base_filter do
497-
"create unique_index(:#{as_atom(table)}, [#{Enum.map_join(keys, ", ", &inspect/1)}], where: \"#{base_filter}\", #{join(["name: \"#{index_name}\""])})"
505+
"create unique_index(:#{as_atom(table)}, [#{Enum.map_join(keys, ", ", &inspect/1)}], where: \"#{base_filter}\", #{join(["name: \"#{index_name}\"", option("nulls_distinct", nils_distinct?)])})"
498506
else
499-
"create unique_index(:#{as_atom(table)}, [#{Enum.map_join(keys, ", ", &inspect/1)}], #{join(["name: \"#{index_name}\""])})"
507+
"create unique_index(:#{as_atom(table)}, [#{Enum.map_join(keys, ", ", &inspect/1)}], #{join(["name: \"#{index_name}\"", option("nulls_distinct", nils_distinct?)])})"
500508
end
501509
end
502510

0 commit comments

Comments
 (0)