@@ -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
548573end
0 commit comments