@@ -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