@@ -345,8 +345,19 @@ 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
+ 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
350
361
351
362
defp primary_key ( nil ) , do: nil
352
363
@@ -466,9 +477,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
466
477
{ field ( left , pk , query , place ) , [ "$in": [ ] ] }
467
478
end
468
479
469
- defp pair ( { :in , _ , [ left , { :^ , _ , [ ix , len ] } ] } , params , pk , query , place ) do
480
+ defp pair ( { :in , _ , [ left , _ ] } = expr , params , pk , query , place ) do
470
481
args =
471
- ix .. ( ix + len - 1 )
482
+ expr
483
+ |> pair_param_range ( )
472
484
|> Enum . map ( & elem ( params , & 1 ) )
473
485
|> Enum . map ( & value ( & 1 , params , pk , query , place ) )
474
486
@@ -483,9 +495,10 @@ defmodule Mongo.Ecto.NormalizedQuery do
483
495
{ field ( left , pk , query , place ) , [ { binary_op ( op ) , value ( right , params , pk , query , place ) } ] }
484
496
end
485
497
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
487
499
args =
488
- ix .. ( ix + len - 1 )
500
+ expr
501
+ |> pair_param_range ( )
489
502
|> Enum . map ( & elem ( params , & 1 ) )
490
503
|> Enum . map ( & value ( & 1 , params , pk , query , place ) )
491
504
@@ -545,4 +558,16 @@ defmodule Mongo.Ecto.NormalizedQuery do
545
558
defp error ( place ) do
546
559
raise ArgumentError , "Invalid expression for MongoDB adapter in #{ place } "
547
560
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
548
573
end
0 commit comments