@@ -1375,6 +1375,8 @@ defmodule AshPostgres.DataLayer do
1375
1375
1376
1376
@ impl true
1377
1377
def update_query ( query , changeset , resource , options ) do
1378
+ repo = AshSql . dynamic_repo ( resource , AshPostgres.SqlImplementation , changeset )
1379
+
1378
1380
ecto_changeset =
1379
1381
case changeset . data do
1380
1382
% Ash.Changeset.OriginalDataNotAvailable { } ->
@@ -1384,7 +1386,7 @@ defmodule AshPostgres.DataLayer do
1384
1386
data
1385
1387
end
1386
1388
|> Map . update! ( :__meta__ , & Map . put ( & 1 , :source , table ( resource , changeset ) ) )
1387
- |> ecto_changeset ( changeset , :update , true )
1389
+ |> ecto_changeset ( changeset , :update , repo , true )
1388
1390
1389
1391
case bulk_updatable_query (
1390
1392
query ,
@@ -1398,8 +1400,6 @@ defmodule AshPostgres.DataLayer do
1398
1400
1399
1401
{ :ok , query } ->
1400
1402
try do
1401
- repo = AshSql . dynamic_repo ( resource , AshPostgres.SqlImplementation , changeset )
1402
-
1403
1403
repo_opts =
1404
1404
AshSql . repo_opts (
1405
1405
repo ,
@@ -1673,6 +1673,8 @@ defmodule AshPostgres.DataLayer do
1673
1673
1674
1674
@ impl true
1675
1675
def destroy_query ( query , changeset , resource , options ) do
1676
+ repo = AshSql . dynamic_repo ( resource , AshPostgres.SqlImplementation , changeset )
1677
+
1676
1678
ecto_changeset =
1677
1679
case changeset . data do
1678
1680
% Ash.Changeset.OriginalDataNotAvailable { } ->
@@ -1682,7 +1684,7 @@ defmodule AshPostgres.DataLayer do
1682
1684
data
1683
1685
end
1684
1686
|> Map . update! ( :__meta__ , & Map . put ( & 1 , :source , table ( resource , changeset ) ) )
1685
- |> ecto_changeset ( changeset , :delete , true )
1687
+ |> ecto_changeset ( changeset , :delete , repo , true )
1686
1688
1687
1689
case bulk_updatable_query (
1688
1690
query ,
@@ -1697,8 +1699,6 @@ defmodule AshPostgres.DataLayer do
1697
1699
1698
1700
{ :ok , query } ->
1699
1701
try do
1700
- repo = AshSql . dynamic_repo ( resource , AshPostgres.SqlImplementation , changeset )
1701
-
1702
1702
repo_opts =
1703
1703
AshSql . repo_opts (
1704
1704
repo ,
@@ -1926,7 +1926,7 @@ defmodule AshPostgres.DataLayer do
1926
1926
handle_raised_error (
1927
1927
e ,
1928
1928
__STACKTRACE__ ,
1929
- { :bulk_create , ecto_changeset ( changeset . data , changeset , :create , false ) } ,
1929
+ { :bulk_create , ecto_changeset ( changeset . data , changeset , :create , repo , false ) } ,
1930
1930
resource
1931
1931
)
1932
1932
end
@@ -2142,7 +2142,7 @@ defmodule AshPostgres.DataLayer do
2142
2142
)
2143
2143
end
2144
2144
2145
- defp ecto_changeset ( record , changeset , type , table_error? ) do
2145
+ defp ecto_changeset ( record , changeset , type , repo , table_error? ) do
2146
2146
attributes =
2147
2147
changeset . resource
2148
2148
|> Ash.Resource.Info . attributes ( )
@@ -2159,24 +2159,24 @@ defmodule AshPostgres.DataLayer do
2159
2159
|> set_table ( changeset , type , table_error? )
2160
2160
|> Ecto.Changeset . cast ( % { } , [ ] )
2161
2161
|> force_changes ( Map . take ( changeset . attributes , attributes_to_change ) )
2162
- |> add_configured_foreign_key_constraints ( record . __struct__ )
2163
- |> add_unique_indexes ( record . __struct__ , changeset )
2164
- |> add_check_constraints ( record . __struct__ )
2165
- |> add_exclusion_constraints ( record . __struct__ )
2162
+ |> add_configured_foreign_key_constraints ( record . __struct__ , repo )
2163
+ |> add_unique_indexes ( record . __struct__ , changeset , repo )
2164
+ |> add_check_constraints ( record . __struct__ , repo )
2165
+ |> add_exclusion_constraints ( record . __struct__ , repo )
2166
2166
2167
2167
case type do
2168
2168
:create ->
2169
2169
ecto_changeset
2170
- |> add_my_foreign_key_constraints ( record . __struct__ )
2170
+ |> add_my_foreign_key_constraints ( record . __struct__ , repo )
2171
2171
2172
2172
type when type in [ :upsert , :update ] ->
2173
2173
ecto_changeset
2174
- |> add_my_foreign_key_constraints ( record . __struct__ )
2175
- |> add_related_foreign_key_constraints ( record . __struct__ )
2174
+ |> add_my_foreign_key_constraints ( record . __struct__ , repo )
2175
+ |> add_related_foreign_key_constraints ( record . __struct__ , repo )
2176
2176
2177
2177
:delete ->
2178
2178
ecto_changeset
2179
- |> add_related_foreign_key_constraints ( record . __struct__ )
2179
+ |> add_related_foreign_key_constraints ( record . __struct__ , repo )
2180
2180
end
2181
2181
end
2182
2182
@@ -2461,7 +2461,7 @@ defmodule AshPostgres.DataLayer do
2461
2461
2462
2462
def to_ecto ( other ) , do: other
2463
2463
2464
- defp add_check_constraints ( changeset , resource ) do
2464
+ defp add_check_constraints ( changeset , resource , repo ) do
2465
2465
resource
2466
2466
|> AshPostgres.DataLayer.Info . check_constraints ( )
2467
2467
|> Enum . reduce ( changeset , fn constraint , changeset ->
@@ -2470,27 +2470,35 @@ defmodule AshPostgres.DataLayer do
2470
2470
|> Enum . reduce ( changeset , fn attribute , changeset ->
2471
2471
Ecto.Changeset . check_constraint ( changeset , attribute ,
2472
2472
name: constraint . name ,
2473
- message: constraint . message || "is invalid"
2473
+ message: constraint . message || "is invalid" ,
2474
+ match: repo . default_constraint_match_type ( :check , constraint . name )
2474
2475
)
2475
2476
end )
2476
2477
end )
2477
2478
end
2478
2479
2479
- defp add_exclusion_constraints ( changeset , resource ) do
2480
+ defp add_exclusion_constraints ( changeset , resource , repo ) do
2480
2481
resource
2481
2482
|> AshPostgres.DataLayer.Info . exclusion_constraint_names ( )
2482
2483
|> Enum . reduce ( changeset , fn constraint , changeset ->
2483
2484
case constraint do
2484
2485
{ key , name } ->
2485
- Ecto.Changeset . exclusion_constraint ( changeset , key , name: name )
2486
+ Ecto.Changeset . exclusion_constraint ( changeset , key ,
2487
+ name: name ,
2488
+ match: repo . default_constraint_match_type ( :exclusion , constraint . name )
2489
+ )
2486
2490
2487
2491
{ key , name , message } ->
2488
- Ecto.Changeset . exclusion_constraint ( changeset , key , name: name , message: message )
2492
+ Ecto.Changeset . exclusion_constraint ( changeset , key ,
2493
+ name: name ,
2494
+ message: message ,
2495
+ match: repo . default_constraint_match_type ( :exclusion , constraint . name )
2496
+ )
2489
2497
end
2490
2498
end )
2491
2499
end
2492
2500
2493
- defp add_related_foreign_key_constraints ( changeset , resource ) do
2501
+ defp add_related_foreign_key_constraints ( changeset , resource , repo ) do
2494
2502
# TODO: this doesn't guarantee us to get all of them, because if something is related to this
2495
2503
# schema and there is no back-relation, then this won't catch it's foreign key constraints
2496
2504
resource
@@ -2514,25 +2522,37 @@ defmodule AshPostgres.DataLayer do
2514
2522
% { name: name } when not is_nil ( name ) ->
2515
2523
Ecto.Changeset . foreign_key_constraint ( changeset , destination_attribute ,
2516
2524
name: name ,
2525
+ match: repo . default_constraint_match_type ( :foreign , name ) ,
2517
2526
message: "would leave records behind"
2518
2527
)
2519
2528
2520
2529
_ ->
2530
+ name = "#{ AshPostgres.DataLayer.Info . table ( source ) } _#{ source_attribute } _fkey"
2531
+
2521
2532
Ecto.Changeset . foreign_key_constraint ( changeset , destination_attribute ,
2522
- name: "#{ AshPostgres.DataLayer.Info . table ( source ) } _#{ source_attribute } _fkey" ,
2533
+ name: name ,
2534
+ match: repo . default_constraint_match_type ( :foreign , name ) ,
2523
2535
message: "would leave records behind"
2524
2536
)
2525
2537
end
2526
2538
end )
2527
2539
end
2528
2540
2529
- defp add_my_foreign_key_constraints ( changeset , resource ) do
2541
+ defp add_my_foreign_key_constraints ( changeset , resource , repo ) do
2530
2542
resource
2531
2543
|> Ash.Resource.Info . relationships ( )
2532
- |> Enum . reduce ( changeset , & Ecto.Changeset . foreign_key_constraint ( & 2 , & 1 . source_attribute ) )
2544
+ |> Enum . reduce ( changeset , fn relationship , changeset ->
2545
+ name =
2546
+ "#{ AshPostgres.DataLayer.Info . table ( resource ) } _#{ relationship . source_attribute } _fkey"
2547
+
2548
+ Ecto.Changeset . foreign_key_constraint ( changeset , relationship . source_attribute ,
2549
+ name: name ,
2550
+ match: repo . default_constraint_match_type ( :foreign , name )
2551
+ )
2552
+ end )
2533
2553
end
2534
2554
2535
- defp add_configured_foreign_key_constraints ( changeset , resource ) do
2555
+ defp add_configured_foreign_key_constraints ( changeset , resource , repo ) do
2536
2556
resource
2537
2557
|> AshPostgres.DataLayer.Info . foreign_key_names ( )
2538
2558
|> case do
@@ -2541,14 +2561,21 @@ defmodule AshPostgres.DataLayer do
2541
2561
end
2542
2562
|> Enum . reduce ( changeset , fn
2543
2563
{ key , name } , changeset ->
2544
- Ecto.Changeset . foreign_key_constraint ( changeset , key , name: name )
2564
+ Ecto.Changeset . foreign_key_constraint ( changeset , key ,
2565
+ name: name ,
2566
+ match: repo . default_constraint_match_type ( :foreign , name )
2567
+ )
2545
2568
2546
2569
{ key , name , message } , changeset ->
2547
- Ecto.Changeset . foreign_key_constraint ( changeset , key , name: name , message: message )
2570
+ Ecto.Changeset . foreign_key_constraint ( changeset , key ,
2571
+ name: name ,
2572
+ message: message ,
2573
+ match: repo . default_constraint_match_type ( :foreign , name )
2574
+ )
2548
2575
end )
2549
2576
end
2550
2577
2551
- defp add_unique_indexes ( changeset , resource , ash_changeset ) do
2578
+ defp add_unique_indexes ( changeset , resource , ash_changeset , repo ) do
2552
2579
table = table ( resource , ash_changeset )
2553
2580
pkey = Ash.Resource.Info . primary_key ( resource )
2554
2581
@@ -2560,11 +2587,13 @@ defmodule AshPostgres.DataLayer do
2560
2587
AshPostgres.DataLayer.Info . identity_index_names ( resource ) [ identity . name ] ||
2561
2588
"#{ table } _#{ identity . name } _index"
2562
2589
2590
+ index_match_type = repo . default_constraint_match_type ( :unique , name )
2591
+
2563
2592
opts =
2564
2593
if Map . get ( identity , :message ) do
2565
- [ name: name , message: identity . message ]
2594
+ [ name: name , message: identity . message , match: index_match_type ]
2566
2595
else
2567
- [ name: name ]
2596
+ [ name: name , match: index_match_type ]
2568
2597
end
2569
2598
2570
2599
fields =
@@ -2585,11 +2614,13 @@ defmodule AshPostgres.DataLayer do
2585
2614
|> Enum . reduce ( changeset , fn index , changeset ->
2586
2615
name = index . name || AshPostgres.CustomIndex . name ( table , index )
2587
2616
2617
+ index_match_type = repo . default_constraint_match_type ( :custom , name )
2618
+
2588
2619
opts =
2589
2620
if index . message do
2590
- [ name: name , message: index . message ]
2621
+ [ name: name , message: index . message , match: index_match_type ]
2591
2622
else
2592
- [ name: name ]
2623
+ [ name: name , match: index_match_type ]
2593
2624
end
2594
2625
2595
2626
fields =
@@ -2631,10 +2662,17 @@ defmodule AshPostgres.DataLayer do
2631
2662
2632
2663
Enum . reduce ( names , changeset , fn
2633
2664
{ keys , name } , changeset ->
2634
- Ecto.Changeset . unique_constraint ( changeset , List . wrap ( keys ) , name: name )
2665
+ Ecto.Changeset . unique_constraint ( changeset , List . wrap ( keys ) ,
2666
+ name: name ,
2667
+ match: repo . default_constraint_match_type ( :unique , name )
2668
+ )
2635
2669
2636
2670
{ keys , name , message } , changeset ->
2637
- Ecto.Changeset . unique_constraint ( changeset , List . wrap ( keys ) , name: name , message: message )
2671
+ Ecto.Changeset . unique_constraint ( changeset , List . wrap ( keys ) ,
2672
+ name: name ,
2673
+ message: message ,
2674
+ match: repo . default_constraint_match_type ( :unique , name )
2675
+ )
2638
2676
end )
2639
2677
end
2640
2678
@@ -2917,6 +2955,8 @@ defmodule AshPostgres.DataLayer do
2917
2955
)
2918
2956
|> pkey_filter ( record )
2919
2957
2958
+ repo = AshSql . dynamic_repo ( resource , AshPostgres.SqlImplementation , changeset )
2959
+
2920
2960
with { :ok , query } <- filter ( query , changeset . filter , resource ) do
2921
2961
ecto_changeset =
2922
2962
case changeset . data do
@@ -2927,7 +2967,7 @@ defmodule AshPostgres.DataLayer do
2927
2967
data
2928
2968
end
2929
2969
|> Map . update! ( :__meta__ , & Map . put ( & 1 , :source , table ( resource , changeset ) ) )
2930
- |> ecto_changeset ( changeset , :delete , true )
2970
+ |> ecto_changeset ( changeset , :delete , repo , true )
2931
2971
2932
2972
case bulk_updatable_query (
2933
2973
query ,
@@ -2942,8 +2982,6 @@ defmodule AshPostgres.DataLayer do
2942
2982
2943
2983
{ :ok , query } ->
2944
2984
try do
2945
- repo = AshSql . dynamic_repo ( resource , AshPostgres.SqlImplementation , changeset )
2946
-
2947
2985
repo_opts =
2948
2986
AshSql . repo_opts (
2949
2987
repo ,
0 commit comments