Skip to content

Commit ae0e811

Browse files
committed
fix logic error
1 parent 9899040 commit ae0e811

File tree

1 file changed

+62
-55
lines changed

1 file changed

+62
-55
lines changed

lib/data_layer.ex

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,69 +2033,70 @@ defmodule AshPostgres.DataLayer do
20332033
identity = options[:identity]
20342034
keys = Map.get(identity || %{}, :keys) || Ash.Resource.Info.primary_key(resource)
20352035

2036-
results_by_identity =
2037-
result
2038-
|> elem(1)
2039-
|> List.wrap()
2040-
|> Enum.reduce(%{}, fn r, acc ->
2041-
Map.put(acc, Map.take(r, keys), r)
2042-
end)
2043-
20442036
# if it's single the return_skipped_upsert? is handled at the
20452037
# call site https://github.com/ash-project/ash_postgres/blob/0b21d4a99cc3f6d8676947e291ac9b9d57ad6e2e/lib/data_layer.ex#L3046-L3046
2046-
if options[:return_skipped_upsert?] && !opts[:single?] do
2047-
[changeset | _] = changesets
2038+
result =
2039+
if options[:return_skipped_upsert?] && !opts[:single?] do
2040+
[changeset | _] = changesets
2041+
2042+
results_by_identity =
2043+
result
2044+
|> elem(1)
2045+
|> List.wrap()
2046+
|> Enum.into(%{}, fn r ->
2047+
{Map.take(r, keys), r}
2048+
end)
20482049

2049-
ash_query =
2050-
resource
2051-
|> Ash.Query.do_filter(
2052-
or:
2053-
changesets
2054-
|> Enum.filter(fn changeset ->
2055-
not Map.has_key?(
2056-
results_by_identity,
2057-
Map.take(changeset.attributes, keys)
2058-
)
2050+
ash_query =
2051+
resource
2052+
|> Ash.Query.do_filter(
2053+
or:
2054+
changesets
2055+
|> Enum.filter(fn changeset ->
2056+
not Map.has_key?(
2057+
results_by_identity,
2058+
Map.take(changeset.attributes, keys)
2059+
)
2060+
end)
2061+
|> Enum.map(fn changeset ->
2062+
changeset.attributes
2063+
|> Map.take(keys)
2064+
|> Keyword.new()
2065+
end)
2066+
)
2067+
|> then(fn
2068+
query when is_nil(identity) or is_nil(identity.where) -> query
2069+
query -> Ash.Query.do_filter(query, identity.where)
2070+
end)
2071+
|> Ash.Query.set_tenant(changeset.tenant)
2072+
2073+
skipped_upserts =
2074+
with {:ok, ecto_query} <- Ash.Query.data_layer_query(ash_query),
2075+
{:ok, results} <- run_query(ecto_query, resource) do
2076+
results
2077+
|> Enum.map(fn result ->
2078+
Ash.Resource.put_metadata(result, :upsert_skipped, true)
20592079
end)
2060-
|> Enum.map(fn changeset ->
2061-
changeset.attributes
2062-
|> Map.take(identity.keys)
2063-
|> Keyword.new()
2080+
|> Enum.reduce(%{}, fn r, acc ->
2081+
Map.put(acc, Map.take(r, keys), r)
20642082
end)
2065-
)
2066-
|> then(fn
2067-
query when is_nil(identity) or is_nil(identity.where) -> query
2068-
query -> Ash.Query.do_filter(query, identity.where)
2069-
end)
2070-
|> Ash.Query.set_tenant(changeset.tenant)
2071-
2072-
skipped_upserts =
2073-
with {:ok, ecto_query} <- Ash.Query.data_layer_query(ash_query),
2074-
{:ok, results} <- run_query(ecto_query, resource) do
2075-
results
2076-
|> Enum.map(fn result ->
2077-
Ash.Resource.put_metadata(result, :upsert_skipped, true)
2078-
end)
2079-
|> Enum.reduce(%{}, fn r, acc ->
2080-
Map.put(acc, Map.take(r, keys), r)
2081-
end)
2082-
end
2083+
end
20832084

2084-
results =
2085-
changesets
2086-
|> Enum.map(fn changeset ->
2087-
identity =
2088-
changeset.attributes
2089-
|> Map.take(keys)
2085+
results =
2086+
changesets
2087+
|> Enum.map(fn changeset ->
2088+
identity =
2089+
changeset.attributes
2090+
|> Map.take(keys)
20902091

2091-
Map.get(results_by_identity, identity, Map.get(skipped_upserts, identity))
2092-
end)
2093-
|> Enum.filter(& &1)
2092+
Map.get(results_by_identity, identity, Map.get(skipped_upserts, identity))
2093+
end)
2094+
|> Enum.filter(& &1)
20942095

2095-
{length(results), results}
2096-
else
2097-
result
2098-
end
2096+
{length(results), results}
2097+
else
2098+
result
2099+
end
20992100

21002101
case result do
21012102
{_, nil} ->
@@ -2107,6 +2108,12 @@ defmodule AshPostgres.DataLayer do
21072108

21082109
{:ok, results}
21092110
else
2111+
results_by_identity =
2112+
results
2113+
|> Enum.into(%{}, fn r ->
2114+
{Map.take(r, keys), r}
2115+
end)
2116+
21102117
results =
21112118
changesets
21122119
|> Enum.map(fn changeset ->

0 commit comments

Comments
 (0)