Skip to content

Commit

Permalink
Fix finding the correct value for limit and offset with where arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
exAspArk committed Jan 17, 2019
1 parent 9692ffd commit 0abb8e5
Showing 1 changed file with 31 additions and 6 deletions.
37 changes: 31 additions & 6 deletions lib/mongo_ecto/normalized_query.ex
Original file line number Diff line number Diff line change
Expand Up @@ -345,8 +345,19 @@ defmodule Mongo.Ecto.NormalizedQuery do

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

defp offset_limit(%Query.QueryExpr{expr: expr}, params, pk, query, where),
do: value(expr, params, pk, query, where)
defp offset_limit(%Query.QueryExpr{expr: expr}, params, pk, %Query{wheres: wheres} = query, where) do
if {:^, l, [idx]} = expr do
param_offset =
Enum.reduce(wheres, 0, fn %Query.BooleanExpr{expr: expr}, acc ->
_from..to = pair_param_range(expr)
acc + to
end)

value({:^, l, [idx + param_offset]}, params, pk, query, where)
else
value(expr, params, pk, query, where)
end
end

defp primary_key(nil), do: nil

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

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

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

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

Expand Down Expand Up @@ -545,4 +558,16 @@ defmodule Mongo.Ecto.NormalizedQuery do
defp error(place) do
raise ArgumentError, "Invalid expression for MongoDB adapter in #{place}"
end

defp pair_param_range({:in, _, [_, {:^, _, [ix, len]}]}) do
ix..(ix + len - 1)
end

defp pair_param_range({:not, _, [{:in, _, [_, {:^, _, [ix, len]}]}]}) do
ix..(ix + len - 1)
end

defp pair_param_range(expr) do
0..0
end
end

0 comments on commit 0abb8e5

Please sign in to comment.