Skip to content

Commit b1ff9ed

Browse files
authored
fix: respect opts[:left_only?] argument passed to join_all_relationships
2 parents 64e976e + 91834ff commit b1ff9ed

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

lib/join.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ defmodule AshSql.Join do
8282
parent_query,
8383
no_inner_join?
8484
) do
85-
no_inner_join? =
86-
no_inner_join? || query.__ash_bindings__.context[:data_layer][:no_inner_join?]
85+
no_inner_join? = left_join_only?(query, opts, no_inner_join?)
8786

8887
case join_parent_paths(query, filter, relationship_paths) do
8988
{:ok, query} ->
@@ -228,6 +227,12 @@ defmodule AshSql.Join do
228227
end
229228
end
230229

230+
@doc false
231+
def left_join_only?(query, opts, explicit?) do
232+
explicit? || query.__ash_bindings__.context[:data_layer][:no_inner_join?] ||
233+
opts[:left_only?] || false
234+
end
235+
231236
@doc false
232237
def parent_expr(filter) do
233238
filter

test/join_test.exs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# SPDX-FileCopyrightText: 2024 ash_sql contributors <https://github.com/ash-project/ash_sql/graphs/contributors>
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
defmodule AshSql.JoinTest do
6+
use ExUnit.Case, async: true
7+
8+
alias AshSql.Join
9+
10+
defp query(data_layer_context \\ %{}) do
11+
%{__ash_bindings__: %{context: %{data_layer: data_layer_context}}}
12+
end
13+
14+
describe "left_join_only?/3" do
15+
test "a select-context join is never inner joined" do
16+
assert Join.left_join_only?(query(), [left_only?: true], false)
17+
end
18+
19+
test "a filter-context join may still be inner joined" do
20+
refute Join.left_join_only?(query(), [], false)
21+
end
22+
23+
test "the data layer context can force left joins" do
24+
assert Join.left_join_only?(query(%{no_inner_join?: true}), [], false)
25+
end
26+
27+
test "an explicit no_inner_join? forces left joins" do
28+
assert Join.left_join_only?(query(), [], true)
29+
end
30+
31+
test "returns a boolean rather than nil" do
32+
assert Join.left_join_only?(query(), [], false) == false
33+
end
34+
end
35+
end

0 commit comments

Comments
 (0)