Skip to content

Commit 0abb8e5

Browse files
committed
Fix finding the correct value for limit and offset with where arrays
1 parent 9692ffd commit 0abb8e5

File tree

1 file changed

+31
-6
lines changed

1 file changed

+31
-6
lines changed

lib/mongo_ecto/normalized_query.ex

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,19 @@ defmodule Mongo.Ecto.NormalizedQuery do
345345

346346
defp offset_limit(nil, _params, _pk, _query, _where), do: nil
347347

348-
defp offset_limit(%Query.QueryExpr{expr: expr}, params, pk, query, where),
349-
do: value(expr, params, pk, query, where)
348+
defp offset_limit(%Query.QueryExpr{expr: expr}, params, pk, %Query{wheres: wheres} = query, where) do
349+
if {:^, l, [idx]} = expr do
350+
param_offset =
351+
Enum.reduce(wheres, 0, fn %Query.BooleanExpr{expr: expr}, acc ->
352+
_from..to = pair_param_range(expr)
353+
acc + to
354+
end)
355+
356+
value({:^, l, [idx + param_offset]}, params, pk, query, where)
357+
else
358+
value(expr, params, pk, query, where)
359+
end
360+
end
350361

351362
defp primary_key(nil), do: nil
352363

@@ -466,9 +477,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
466477
{field(left, pk, query, place), ["$in": []]}
467478
end
468479

469-
defp pair({:in, _, [left, {:^, _, [ix, len]}]}, params, pk, query, place) do
480+
defp pair({:in, _, [left, _]} = expr, params, pk, query, place) do
470481
args =
471-
ix..(ix + len - 1)
482+
expr
483+
|> pair_param_range()
472484
|> Enum.map(&elem(params, &1))
473485
|> Enum.map(&value(&1, params, pk, query, place))
474486

@@ -483,9 +495,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
483495
{field(left, pk, query, place), [{binary_op(op), value(right, params, pk, query, place)}]}
484496
end
485497

486-
defp pair({:not, _, [{:in, _, [left, {:^, _, [ix, len]}]}]}, params, pk, query, place) do
498+
defp pair({:not, _, [{:in, _, [left, _]}]} = expr, params, pk, query, place) do
487499
args =
488-
ix..(ix + len - 1)
500+
expr
501+
|> pair_param_range()
489502
|> Enum.map(&elem(params, &1))
490503
|> Enum.map(&value(&1, params, pk, query, place))
491504

@@ -545,4 +558,16 @@ defmodule Mongo.Ecto.NormalizedQuery do
545558
defp error(place) do
546559
raise ArgumentError, "Invalid expression for MongoDB adapter in #{place}"
547560
end
561+
562+
defp pair_param_range({:in, _, [_, {:^, _, [ix, len]}]}) do
563+
ix..(ix + len - 1)
564+
end
565+
566+
defp pair_param_range({:not, _, [{:in, _, [_, {:^, _, [ix, len]}]}]}) do
567+
ix..(ix + len - 1)
568+
end
569+
570+
defp pair_param_range(expr) do
571+
0..0
572+
end
548573
end

0 commit comments

Comments
 (0)