mirror of
https://github.com/ash-project/ash_postgres.git
synced 2024-09-20 05:23:18 +12:00
fix: copy the correct data for lateral join queries
This commit is contained in:
parent
f82e2d44c8
commit
ea26d3f432
1 changed files with 16 additions and 12 deletions
|
@ -488,6 +488,7 @@ defmodule AshPostgres.DataLayer do
|
||||||
path
|
path
|
||||||
|> Enum.at(0)
|
|> Enum.at(0)
|
||||||
|> elem(0)
|
|> elem(0)
|
||||||
|
|> Map.get(:resource)
|
||||||
|
|
||||||
subquery = from(row in subquery(lateral_join_query), select: %{})
|
subquery = from(row in subquery(lateral_join_query), select: %{})
|
||||||
|
|
||||||
|
@ -522,6 +523,7 @@ defmodule AshPostgres.DataLayer do
|
||||||
path
|
path
|
||||||
|> Enum.at(0)
|
|> Enum.at(0)
|
||||||
|> elem(0)
|
|> elem(0)
|
||||||
|
|> Map.get(:resource)
|
||||||
|
|
||||||
{:ok, repo(source_resource).all(query, repo_opts(query))}
|
{:ok, repo(source_resource).all(query, repo_opts(query))}
|
||||||
|
|
||||||
|
@ -533,9 +535,10 @@ defmodule AshPostgres.DataLayer do
|
||||||
defp lateral_join_query(
|
defp lateral_join_query(
|
||||||
query,
|
query,
|
||||||
root_data,
|
root_data,
|
||||||
[{source_resource, source_field, destination_field, relationship}]
|
[{source_query, source_field, destination_field, relationship}]
|
||||||
) do
|
) do
|
||||||
source_values = Enum.map(root_data, &Map.get(&1, source_field))
|
source_values = Enum.map(root_data, &Map.get(&1, source_field))
|
||||||
|
source_query = Ash.Query.new(source_query)
|
||||||
|
|
||||||
subquery =
|
subquery =
|
||||||
subquery(
|
subquery(
|
||||||
|
@ -546,12 +549,10 @@ defmodule AshPostgres.DataLayer do
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
source_resource
|
source_query.resource
|
||||||
|> Ash.Query.new()
|
|> Ash.Query.set_context(%{:data_layer => source_query.context[:data_layer]})
|
||||||
|> Ash.Query.set_context(relationship.context)
|
|> Ash.Query.set_tenant(source_query.tenant)
|
||||||
|> set_lateral_join_prefix(query)
|
|> set_lateral_join_prefix(query)
|
||||||
|> Ash.Query.do_filter(relationship.filter)
|
|
||||||
|> Ash.Query.sort(Map.get(relationship, :sort))
|
|
||||||
|> case do
|
|> case do
|
||||||
%{valid?: true} = query ->
|
%{valid?: true} = query ->
|
||||||
Ash.Query.data_layer_query(query)
|
Ash.Query.data_layer_query(query)
|
||||||
|
@ -579,19 +580,21 @@ defmodule AshPostgres.DataLayer do
|
||||||
query,
|
query,
|
||||||
root_data,
|
root_data,
|
||||||
[
|
[
|
||||||
{source_resource, source_field, source_field_on_join_table, relationship},
|
{source_query, source_field, source_field_on_join_table, relationship},
|
||||||
{through_resource, destination_field_on_join_table, destination_field,
|
{through_resource, destination_field_on_join_table, destination_field,
|
||||||
through_relationship}
|
through_relationship}
|
||||||
]
|
]
|
||||||
) do
|
) do
|
||||||
|
source_query = Ash.Query.new(source_query)
|
||||||
source_values = Enum.map(root_data, &Map.get(&1, source_field))
|
source_values = Enum.map(root_data, &Map.get(&1, source_field))
|
||||||
|
|
||||||
through_resource
|
through_resource.resource
|
||||||
|> Ash.Query.new()
|
|> Ash.Query.new()
|
||||||
|> Ash.Query.set_context(through_relationship.context)
|
|> Ash.Query.set_context(through_relationship.context)
|
||||||
|> set_lateral_join_prefix(query)
|
|
||||||
|> Ash.Query.do_filter(through_relationship.filter)
|
|> Ash.Query.do_filter(through_relationship.filter)
|
||||||
|> Ash.Query.sort(Map.get(relationship, :sort))
|
|> Ash.Query.sort(through_relationship.sort)
|
||||||
|
|> Ash.Query.set_tenant(source_query.tenant)
|
||||||
|
|> set_lateral_join_prefix(query)
|
||||||
|> case do
|
|> case do
|
||||||
%{valid?: true} = query ->
|
%{valid?: true} = query ->
|
||||||
Ash.Query.data_layer_query(query)
|
Ash.Query.data_layer_query(query)
|
||||||
|
@ -601,9 +604,10 @@ defmodule AshPostgres.DataLayer do
|
||||||
end
|
end
|
||||||
|> case do
|
|> case do
|
||||||
{:ok, through_query} ->
|
{:ok, through_query} ->
|
||||||
source_resource
|
source_query.resource
|
||||||
|> Ash.Query.new()
|
|> Ash.Query.new()
|
||||||
|> Ash.Query.set_context(relationship.context)
|
|> Ash.Query.set_context(relationship.context)
|
||||||
|
|> Ash.Query.set_context(%{:data_layer => source_query.context[:data_layer]})
|
||||||
|> set_lateral_join_prefix(query)
|
|> set_lateral_join_prefix(query)
|
||||||
|> Ash.Query.do_filter(relationship.filter)
|
|> Ash.Query.do_filter(relationship.filter)
|
||||||
|> Ash.Query.sort(Map.get(relationship, :sort))
|
|> Ash.Query.sort(Map.get(relationship, :sort))
|
||||||
|
@ -2234,7 +2238,7 @@ defmodule AshPostgres.DataLayer do
|
||||||
resource
|
resource
|
||||||
|> Ash.Query.new()
|
|> Ash.Query.new()
|
||||||
|> Ash.Query.set_context(relationship.context)
|
|> Ash.Query.set_context(relationship.context)
|
||||||
|> Ash.Query.do_filter(Map.get(relationship, :filter))
|
|> Ash.Query.do_filter(relationship.filter)
|
||||||
|> Ash.Query.sort(Map.get(relationship, :sort))
|
|> Ash.Query.sort(Map.get(relationship, :sort))
|
||||||
|> case do
|
|> case do
|
||||||
%{valid?: true} = query ->
|
%{valid?: true} = query ->
|
||||||
|
|
Loading…
Reference in a new issue