@@ -345,6 +345,22 @@ defmodule Mongo.Ecto.NormalizedQuery do
345345
346346 defp offset_limit ( nil , _params , _pk , _query , _where ) , do: nil
347347
348+ defp offset_limit (
349+ % Query.QueryExpr { expr: { :^ , l , [ idx ] } = expr } ,
350+ params ,
351+ pk ,
352+ % Query { wheres: wheres } = query ,
353+ where
354+ ) do
355+ param_offset =
356+ Enum . reduce ( wheres , 0 , fn % Query.BooleanExpr { expr: expr } , acc ->
357+ _from .. to = pair_params_range ( expr )
358+ acc + to
359+ end )
360+
361+ value ( { :^ , l , [ idx + param_offset ] } , params , pk , query , where )
362+ end
363+
348364 defp offset_limit ( % Query.QueryExpr { expr: expr } , params , pk , query , where ) ,
349365 do: value ( expr , params , pk , query , where )
350366
@@ -466,9 +482,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
466482 { field ( left , pk , query , place ) , [ "$in": [ ] ] }
467483 end
468484
469- defp pair ( { :in , _ , [ left , { :^ , _ , [ ix , len ] } ] } , params , pk , query , place ) do
485+ defp pair ( { :in , _ , [ left , _ ] } = expr , params , pk , query , place ) do
470486 args =
471- ix .. ( ix + len - 1 )
487+ expr
488+ |> pair_params_range ( )
472489 |> Enum . map ( & elem ( params , & 1 ) )
473490 |> Enum . map ( & value ( & 1 , params , pk , query , place ) )
474491
@@ -483,9 +500,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
483500 { field ( left , pk , query , place ) , [ { binary_op ( op ) , value ( right , params , pk , query , place ) } ] }
484501 end
485502
486- defp pair ( { :not , _ , [ { :in , _ , [ left , { :^ , _ , [ ix , len ] } ] } ] } , params , pk , query , place ) do
503+ defp pair ( { :not , _ , [ { :in , _ , [ left , _ ] } ] } = expr , params , pk , query , place ) do
487504 args =
488- ix .. ( ix + len - 1 )
505+ expr
506+ |> pair_params_range ( )
489507 |> Enum . map ( & elem ( params , & 1 ) )
490508 |> Enum . map ( & value ( & 1 , params , pk , query , place ) )
491509
@@ -545,4 +563,8 @@ defmodule Mongo.Ecto.NormalizedQuery do
545563 defp error ( place ) do
546564 raise ArgumentError , "Invalid expression for MongoDB adapter in #{ place } "
547565 end
566+
567+ defp pair_params_range ( { :in , _ , [ _ , { :^ , _ , [ ix , len ] } ] } ) , do: ix .. ( ix + len - 1 )
568+ defp pair_params_range ( { :not , _ , [ { :in , _ , [ _ , { :^ , _ , [ ix , len ] } ] } ] } ) , do: ix .. ( ix + len - 1 )
569+ defp pair_params_range ( expr ) , do: 0 .. 0
548570end
0 commit comments