@@ -345,8 +345,21 @@ defmodule Mongo.Ecto.NormalizedQuery do
345
345
346
346
defp offset_limit(nil, _params, _pk, _query, _where), do: nil
347
347
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
+ case expr do
350
+ {:^, l, [idx]} ->
351
+ param_offset =
352
+ Enum.reduce(wheres, 0, fn %Query.BooleanExpr{expr: expr}, acc ->
353
+ _from..to = pair_param_range(expr)
354
+ acc + to
355
+ end)
356
+
357
+ value({:^, l, [idx + param_offset]}, params, pk, query, where)
358
+
359
+ _ ->
360
+ value(expr, params, pk, query, where)
361
+ end
362
+ end
350
363
351
364
defp primary_key(nil), do: nil
352
365
@@ -466,9 +479,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
466
479
{field(left, pk, query, place), ["$in": []]}
467
480
end
468
481
469
- defp pair({:in, _, [left, {:^, _, [ix, len]}]} , params, pk, query, place) do
482
+ defp pair({:in, _, [left, _]} = expr , params, pk, query, place) do
470
483
args =
471
- ix..(ix + len - 1)
484
+ expr
485
+ |> pair_param_range()
472
486
|> Enum.map(&elem(params, &1))
473
487
|> Enum.map(&value(&1, params, pk, query, place))
474
488
@@ -483,9 +497,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
483
497
{field(left, pk, query, place), [{binary_op(op), value(right, params, pk, query, place)}]}
484
498
end
485
499
486
- defp pair({:not, _, [{:in, _, [left, {:^, _, [ix, len ]}]}]} , params, pk, query, place) do
500
+ defp pair({:not, _, [{:in, _, [left, _ ]}]} = expr , params, pk, query, place) do
487
501
args =
488
- ix..(ix + len - 1)
502
+ expr
503
+ |> pair_param_range()
489
504
|> Enum.map(&elem(params, &1))
490
505
|> Enum.map(&value(&1, params, pk, query, place))
491
506
@@ -545,4 +560,16 @@ defmodule Mongo.Ecto.NormalizedQuery do
545
560
defp error(place) do
546
561
raise ArgumentError, "Invalid expression for MongoDB adapter in #{place}"
547
562
end
563
+
564
+ defp pair_param_range({:in, _, [_, {:^, _, [ix, len]}]}) do
565
+ ix..(ix + len - 1)
566
+ end
567
+
568
+ defp pair_param_range({:not, _, [{:in, _, [_, {:^, _, [ix, len]}]}]}) do
569
+ ix..(ix + len - 1)
570
+ end
571
+
572
+ defp pair_param_range(expr) do
573
+ 0..0
574
+ end
548
575
end
0 commit comments