39
39
find_skip_and_limit ,
40
40
get_model_reference_fields ,
41
41
get_query_fields ,
42
+ has_page_info ,
42
43
)
43
44
44
45
PYMONGO_VERSION = tuple (pymongo .version_tuple [:2 ])
@@ -276,7 +277,7 @@ def fields(self):
276
277
return self ._type ._meta .fields
277
278
278
279
def get_queryset (
279
- self , model , info , required_fields = None , skip = None , limit = None , reversed = False , ** args
280
+ self , model , info , required_fields = None , skip = None , limit = None , ** args
280
281
) -> QuerySet :
281
282
if required_fields is None :
282
283
required_fields = list ()
@@ -325,49 +326,22 @@ def get_queryset(
325
326
else :
326
327
args .update (queryset_or_filters )
327
328
if limit is not None :
328
- if reversed :
329
- if self .order_by :
330
- order_by = self .order_by + ",-pk"
331
- else :
332
- order_by = "-pk"
333
- return (
334
- model .objects (** args )
335
- .no_dereference ()
336
- .only (* required_fields )
337
- .order_by (order_by )
338
- .skip (skip if skip else 0 )
339
- .limit (limit )
340
- )
341
- else :
342
- return (
343
- model .objects (** args )
344
- .no_dereference ()
345
- .only (* required_fields )
346
- .order_by (self .order_by )
347
- .skip (skip if skip else 0 )
348
- .limit (limit )
349
- )
329
+ return (
330
+ model .objects (** args )
331
+ .no_dereference ()
332
+ .only (* required_fields )
333
+ .order_by (self .order_by )
334
+ .skip (skip if skip else 0 )
335
+ .limit (limit )
336
+ )
350
337
elif skip is not None :
351
- if reversed :
352
- if self .order_by :
353
- order_by = self .order_by + ",-pk"
354
- else :
355
- order_by = "-pk"
356
- return (
357
- model .objects (** args )
358
- .no_dereference ()
359
- .only (* required_fields )
360
- .order_by (order_by )
361
- .skip (skip )
362
- )
363
- else :
364
- return (
365
- model .objects (** args )
366
- .no_dereference ()
367
- .only (* required_fields )
368
- .order_by (self .order_by )
369
- .skip (skip )
370
- )
338
+ return (
339
+ model .objects (** args )
340
+ .no_dereference ()
341
+ .only (* required_fields )
342
+ .order_by (self .order_by )
343
+ .skip (skip )
344
+ )
371
345
return model .objects (** args ).no_dereference ().only (* required_fields ).order_by (self .order_by )
372
346
373
347
def default_resolver (self , _root , info , required_fields = None , resolved = None , ** args ):
@@ -401,7 +375,6 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
401
375
skip = 0
402
376
count = 0
403
377
limit = None
404
- reverse = False
405
378
first = args .pop ("first" , None )
406
379
after = args .pop ("after" , None )
407
380
if after :
@@ -410,14 +383,15 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
410
383
before = args .pop ("before" , None )
411
384
if before :
412
385
before = cursor_to_offset (before )
386
+ requires_page_info = has_page_info (info )
413
387
has_next_page = False
414
388
415
389
if resolved is not None :
416
390
items = resolved
417
391
418
392
if isinstance (items , QuerySet ):
419
393
try :
420
- if last is not None and after is not None :
394
+ if last is not None :
421
395
count = items .count (with_limit_and_skip = False )
422
396
else :
423
397
count = None
@@ -426,29 +400,24 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
426
400
else :
427
401
count = len (items )
428
402
429
- skip , limit , reverse = find_skip_and_limit (
403
+ skip , limit = find_skip_and_limit (
430
404
first = first , last = last , after = after , before = before , count = count
431
405
)
432
406
433
407
if isinstance (items , QuerySet ):
434
408
if limit :
435
- _base_query : QuerySet = (
436
- items .order_by ("-pk" ).skip (skip ) if reverse else items .skip (skip )
437
- )
409
+ _base_query : QuerySet = items .skip (skip )
438
410
items = _base_query .limit (limit )
439
- has_next_page = len (_base_query .skip (limit ).only ("id" ).limit (1 )) != 0
411
+ has_next_page = len (_base_query .skip (skip + limit ).only ("id" ).limit (1 )) != 0
440
412
elif skip :
441
413
items = items .skip (skip )
442
414
else :
443
415
if limit :
444
- if reverse :
445
- _base_query = items [::- 1 ]
446
- items = _base_query [skip : skip + limit ]
447
- has_next_page = (skip + limit ) < len (_base_query )
448
- else :
449
- _base_query = items
450
- items = items [skip : skip + limit ]
451
- has_next_page = (skip + limit ) < len (_base_query )
416
+ _base_query = items
417
+ items = items [skip : skip + limit ]
418
+ has_next_page = (
419
+ (skip + limit ) < len (_base_query ) if requires_page_info else False
420
+ )
452
421
elif skip :
453
422
items = items [skip :]
454
423
iterables = list (items )
@@ -503,11 +472,11 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
503
472
else :
504
473
count = self .model .objects (args_copy ).count ()
505
474
if count != 0 :
506
- skip , limit , reverse = find_skip_and_limit (
475
+ skip , limit = find_skip_and_limit (
507
476
first = first , after = after , last = last , before = before , count = count
508
477
)
509
478
iterables = self .get_queryset (
510
- self .model , info , required_fields , skip , limit , reverse , ** args
479
+ self .model , info , required_fields , skip , limit , ** args
511
480
)
512
481
list_length = len (iterables )
513
482
if isinstance (info , GraphQLResolveInfo ):
@@ -519,14 +488,11 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
519
488
520
489
elif "pk__in" in args and args ["pk__in" ]:
521
490
count = len (args ["pk__in" ])
522
- skip , limit , reverse = find_skip_and_limit (
491
+ skip , limit = find_skip_and_limit (
523
492
first = first , last = last , after = after , before = before , count = count
524
493
)
525
494
if limit :
526
- if reverse :
527
- args ["pk__in" ] = args ["pk__in" ][::- 1 ][skip : skip + limit ]
528
- else :
529
- args ["pk__in" ] = args ["pk__in" ][skip : skip + limit ]
495
+ args ["pk__in" ] = args ["pk__in" ][skip : skip + limit ]
530
496
elif skip :
531
497
args ["pk__in" ] = args ["pk__in" ][skip :]
532
498
iterables = self .get_queryset (self .model , info , required_fields , ** args )
@@ -542,18 +508,13 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
542
508
field_name = to_snake_case (info .field_name )
543
509
items = getattr (_root , field_name , [])
544
510
count = len (items )
545
- skip , limit , reverse = find_skip_and_limit (
511
+ skip , limit = find_skip_and_limit (
546
512
first = first , last = last , after = after , before = before , count = count
547
513
)
548
514
if limit :
549
- if reverse :
550
- _base_query = items [::- 1 ]
551
- items = _base_query [skip : skip + limit ]
552
- has_next_page = (skip + limit ) < len (_base_query )
553
- else :
554
- _base_query = items
555
- items = items [skip : skip + limit ]
556
- has_next_page = (skip + limit ) < len (_base_query )
515
+ _base_query = items
516
+ items = items [skip : skip + limit ]
517
+ has_next_page = (skip + limit ) < len (_base_query ) if requires_page_info else False
557
518
elif skip :
558
519
items = items [skip :]
559
520
iterables = items
@@ -567,11 +528,6 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
567
528
)
568
529
has_previous_page = True if skip else False
569
530
570
- if reverse :
571
- iterables = list (iterables )
572
- iterables .reverse ()
573
- skip = limit
574
-
575
531
connection = connection_from_iterables (
576
532
edges = iterables ,
577
533
start_offset = skip ,
0 commit comments