Skip to content

Commit ca153d5

Browse files
Refator nil map joins (#4602)
1 parent f7615de commit ca153d5

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

Diff for: integration_test/cases/repo.exs

+20
Original file line numberDiff line numberDiff line change
@@ -1432,6 +1432,26 @@ defmodule Ecto.Integration.RepoTest do
14321432
assert p3 == %{id: pid3}
14331433
end
14341434

1435+
test "take with join nil maps" do
1436+
TestRepo.insert!(%Post{})
1437+
1438+
assert {%{title: nil}, %{title: nil}} ==
1439+
from(p1 in Post)
1440+
|> join(:left, [p1], p2 in Post, on: p1.id == p2.id)
1441+
|> select([p1, p2], {map(p1, [:title]), map(p2, [:title])})
1442+
|> TestRepo.one()
1443+
end
1444+
1445+
test "take with join nil source" do
1446+
TestRepo.insert!(%Post{})
1447+
1448+
assert {%{title: nil}, nil} ==
1449+
from(p1 in Post)
1450+
|> join(:left, [p1], p2 in Post, on: p2.id == -1)
1451+
|> select([p1, p2], {map(p1, [:title]), p2})
1452+
|> TestRepo.one()
1453+
end
1454+
14351455
test "take with preload assocs" do
14361456
%{id: pid} = TestRepo.insert!(%Post{title: "post"})
14371457
TestRepo.insert!(%Comment{post_id: pid, text: "comment"})

Diff for: lib/ecto/repo/queryable.ex

+3-12
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,11 @@ defmodule Ecto.Repo.Queryable do
203203
struct_load!(types, values, [{field, value} | acc], all_nil?, struct, adapter)
204204
end
205205

206-
def struct_load!([], values, _acc, true, _struct, _adapter) do
206+
def struct_load!([], values, _acc, true, struct, _adapter) when struct != %{} do
207207
{nil, values}
208208
end
209209

210-
def struct_load!([], values, acc, false, struct, _adapter) do
210+
def struct_load!([], values, acc, _all_nil?, struct, _adapter) do
211211
{Map.merge(struct, Map.new(acc)), values}
212212
end
213213

@@ -310,7 +310,7 @@ defmodule Ecto.Repo.Queryable do
310310

311311
defp process(row, {:merge, left, right}, from, adapter) do
312312
{left, row} = process(row, left, from, adapter)
313-
{right, row} = process_merge(row, right, from, adapter)
313+
{right, row} = process(row, right, from, adapter)
314314

315315
data =
316316
case {left, right} do
@@ -427,15 +427,6 @@ defmodule Ecto.Repo.Queryable do
427427
end)
428428
end
429429

430-
defp process_merge(row, {:source, {source, schema}, prefix, types}, _from, adapter) do
431-
struct = Ecto.Schema.Loader.load_struct(schema, prefix, source)
432-
struct_load!(types, row, [], false, struct, adapter)
433-
end
434-
435-
defp process_merge(row, process, from, adapter) do
436-
process(row, process, from, adapter)
437-
end
438-
439430
@compile {:inline, load!: 5}
440431
defp load!(type, value, field, struct, adapter) do
441432
case Ecto.Type.adapter_load(adapter, type, value) do

0 commit comments

Comments
 (0)