@@ -345,6 +345,22 @@ 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 (
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
+
348
364
defp offset_limit ( % Query.QueryExpr { expr: expr } , params , pk , query , where ) ,
349
365
do: value ( expr , params , pk , query , where )
350
366
@@ -466,9 +482,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
466
482
{ field ( left , pk , query , place ) , [ "$in": [ ] ] }
467
483
end
468
484
469
- defp pair ( { :in , _ , [ left , { :^ , _ , [ ix , len ] } ] } , params , pk , query , place ) do
485
+ defp pair ( { :in , _ , [ left , _ ] } = expr , params , pk , query , place ) do
470
486
args =
471
- ix .. ( ix + len - 1 )
487
+ expr
488
+ |> pair_params_range ( )
472
489
|> Enum . map ( & elem ( params , & 1 ) )
473
490
|> Enum . map ( & value ( & 1 , params , pk , query , place ) )
474
491
@@ -483,9 +500,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
483
500
{ field ( left , pk , query , place ) , [ { binary_op ( op ) , value ( right , params , pk , query , place ) } ] }
484
501
end
485
502
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
487
504
args =
488
- ix .. ( ix + len - 1 )
505
+ expr
506
+ |> pair_params_range ( )
489
507
|> Enum . map ( & elem ( params , & 1 ) )
490
508
|> Enum . map ( & value ( & 1 , params , pk , query , place ) )
491
509
@@ -545,4 +563,8 @@ defmodule Mongo.Ecto.NormalizedQuery do
545
563
defp error ( place ) do
546
564
raise ArgumentError , "Invalid expression for MongoDB adapter in #{ place } "
547
565
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
548
570
end
0 commit comments