@@ -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