@@ -1105,18 +1105,7 @@ defmodule AshPostgres.DataLayer do
1105
1105
1106
1106
source_pkey = Ash.Resource.Info . primary_key ( source_query . resource )
1107
1107
1108
- source_query . resource
1109
- |> Ash.Query . set_context ( % { :data_layer => source_query . context [ :data_layer ] } )
1110
- |> Ash.Query . set_tenant ( source_query . tenant )
1111
- |> set_lateral_join_prefix ( query )
1112
- |> case do
1113
- % { valid?: true } = query ->
1114
- Ash.Query . data_layer_query ( query )
1115
-
1116
- query ->
1117
- { :error , query }
1118
- end
1119
- |> case do
1108
+ case lateral_join_source_query ( query , source_query ) do
1120
1109
{ :ok , data_layer_query } ->
1121
1110
source_values = Enum . map ( root_data , & Map . get ( & 1 , source_attribute ) )
1122
1111
@@ -1164,44 +1153,27 @@ defmodule AshPostgres.DataLayer do
1164
1153
source_values = Enum . map ( root_data , & Map . get ( & 1 , source_attribute ) )
1165
1154
source_pkey = Ash.Resource.Info . primary_key ( source_query . resource )
1166
1155
1167
- through_resource
1168
- |> Ash.Query . new ( )
1169
- |> Ash.Query . set_context ( through_relationship . context )
1170
- |> Ash.Query . do_filter ( through_relationship . filter )
1171
- |> Ash.Query . set_tenant ( source_query . tenant )
1172
- |> Ash.Query . put_context ( :data_layer , % {
1173
- start_bindings_at: query . __ash_bindings__ . current
1174
- } )
1175
- |> set_lateral_join_prefix ( query )
1176
- |> case do
1177
- % { valid?: true } = through_query ->
1178
- through_query
1179
- |> Ash.Query . data_layer_query ( )
1180
-
1181
- query ->
1182
- { :error , query }
1183
- end
1184
- |> case do
1185
- { :ok , through_query } ->
1186
- source_query . resource
1156
+ case lateral_join_source_query ( query , source_query ) do
1157
+ { :ok , data_layer_query } ->
1158
+ through_resource
1187
1159
|> Ash.Query . new ( )
1188
- |> Ash.Query . set_context ( relationship . context )
1189
- |> Ash.Query . set_context ( % { :data_layer => source_query . context [ :data_layer ] } )
1190
1160
|> Ash.Query . put_context ( :data_layer , % {
1191
- start_bindings_at: through_query . __ash_bindings__ . current
1161
+ start_bindings_at: data_layer_query . __ash_bindings__ . current
1192
1162
} )
1163
+ |> Ash.Query . set_context ( through_relationship . context )
1164
+ |> Ash.Query . do_filter ( through_relationship . filter )
1165
+ |> Ash.Query . set_tenant ( source_query . tenant )
1193
1166
|> set_lateral_join_prefix ( query )
1194
- |> Ash.Query . do_filter ( relationship . filter )
1195
1167
|> case do
1196
- % { valid?: true } = query ->
1197
- query
1168
+ % { valid?: true } = through_query ->
1169
+ through_query
1198
1170
|> Ash.Query . data_layer_query ( )
1199
1171
1200
1172
query ->
1201
1173
{ :error , query }
1202
1174
end
1203
1175
|> case do
1204
- { :ok , data_layer_query } ->
1176
+ { :ok , through_query } ->
1205
1177
if query . __ash_bindings__ [ :__order__? ] do
1206
1178
subquery =
1207
1179
subquery (
@@ -1214,14 +1186,14 @@ defmodule AshPostgres.DataLayer do
1214
1186
source_query ,
1215
1187
relationship . through
1216
1188
) ,
1217
- as: ^ query . __ash_bindings__ . current ,
1189
+ as: ^ data_layer_query . __ash_bindings__ . current ,
1218
1190
on:
1219
1191
field ( through , ^ destination_attribute_on_join_resource ) ==
1220
1192
field ( destination , ^ destination_attribute ) ,
1221
1193
where:
1222
1194
field ( through , ^ source_attribute_on_join_resource ) ==
1223
1195
field (
1224
- parent_as ( ^ through_query . __ash_bindings__ . current ) ,
1196
+ parent_as ( ^ 0 ) ,
1225
1197
^ source_attribute
1226
1198
)
1227
1199
)
@@ -1252,14 +1224,14 @@ defmodule AshPostgres.DataLayer do
1252
1224
source_query ,
1253
1225
relationship . through
1254
1226
) ,
1255
- as: ^ query . __ash_bindings__ . current ,
1227
+ as: ^ data_layer_query . __ash_bindings__ . current ,
1256
1228
on:
1257
1229
field ( through , ^ destination_attribute_on_join_resource ) ==
1258
1230
field ( destination , ^ destination_attribute ) ,
1259
1231
where:
1260
1232
field ( through , ^ source_attribute_on_join_resource ) ==
1261
1233
field (
1262
- parent_as ( ^ through_query . __ash_bindings__ . current ) ,
1234
+ parent_as ( ^ 0 ) ,
1263
1235
^ source_attribute
1264
1236
)
1265
1237
)
@@ -1289,6 +1261,28 @@ defmodule AshPostgres.DataLayer do
1289
1261
end
1290
1262
end
1291
1263
1264
+ defp lateral_join_source_query (
1265
+ % { __ash_bindings__: % { lateral_join_source_query: lateral_join_source_query } } ,
1266
+ _
1267
+ )
1268
+ when not is_nil ( lateral_join_source_query ) do
1269
+ { :ok , lateral_join_source_query }
1270
+ end
1271
+
1272
+ defp lateral_join_source_query ( query , source_query ) do
1273
+ source_query . resource
1274
+ |> Ash.Query . set_context ( % { :data_layer => source_query . context [ :data_layer ] } )
1275
+ |> Ash.Query . set_tenant ( source_query . tenant )
1276
+ |> set_lateral_join_prefix ( query )
1277
+ |> case do
1278
+ % { valid?: true } = query ->
1279
+ Ash.Query . data_layer_query ( query )
1280
+
1281
+ query ->
1282
+ { :error , query }
1283
+ end
1284
+ end
1285
+
1292
1286
@ doc false
1293
1287
def set_subquery_prefix ( data_layer_query , source_query , resource ) do
1294
1288
repo = AshPostgres.DataLayer.Info . repo ( resource , :mutate )
0 commit comments