1
1
import itertools
2
+ import warnings
2
3
from copy import copy
3
4
from typing import Any , Optional , Union , Tuple as TypedTuple
4
5
@@ -347,6 +348,19 @@ def __str__(self) -> str:
347
348
return self .get_sql ()
348
349
349
350
351
+ class FetchNextAndOffsetRowsQueryBuilder (QueryBuilder ):
352
+ def _limit_sql (self ) -> str :
353
+ return " FETCH NEXT {limit} ROWS ONLY" .format (limit = self ._limit )
354
+
355
+ def _offset_sql (self ) -> str :
356
+ return " OFFSET {offset} ROWS" .format (offset = self ._offset or 0 )
357
+
358
+ @builder
359
+ def fetch_next (self , limit : int ):
360
+ warnings .warn ("`fetch_next` is deprecated - please use the `limit` method" , DeprecationWarning )
361
+ self ._limit = limit
362
+
363
+
350
364
class OracleQuery (Query ):
351
365
"""
352
366
Defines a query class for use with Oracle.
@@ -357,7 +371,7 @@ def _builder(cls, **kwargs: Any) -> "OracleQueryBuilder":
357
371
return OracleQueryBuilder (** kwargs )
358
372
359
373
360
- class OracleQueryBuilder (QueryBuilder ):
374
+ class OracleQueryBuilder (FetchNextAndOffsetRowsQueryBuilder ):
361
375
QUOTE_CHAR = None
362
376
QUERY_CLS = OracleQuery
363
377
@@ -370,6 +384,16 @@ def get_sql(self, *args: Any, **kwargs: Any) -> str:
370
384
kwargs ['groupby_alias' ] = False
371
385
return super ().get_sql (* args , ** kwargs )
372
386
387
+ def _apply_pagination (self , querystring : str ) -> str :
388
+ # Note: Overridden as Oracle specifies offset before the fetch next limit
389
+ if self ._offset :
390
+ querystring += self ._offset_sql ()
391
+
392
+ if self ._limit is not None :
393
+ querystring += self ._limit_sql ()
394
+
395
+ return querystring
396
+
373
397
374
398
class PostgreSQLQuery (Query ):
375
399
"""
@@ -670,7 +694,7 @@ def _builder(cls, **kwargs: Any) -> "MSSQLQueryBuilder":
670
694
return MSSQLQueryBuilder (** kwargs )
671
695
672
696
673
- class MSSQLQueryBuilder (QueryBuilder ):
697
+ class MSSQLQueryBuilder (FetchNextAndOffsetRowsQueryBuilder ):
674
698
QUERY_CLS = MSSQLQuery
675
699
676
700
def __init__ (self , ** kwargs : Any ) -> None :
@@ -695,17 +719,6 @@ def top(self, value: Union[str, int], percent: bool = False, with_ties: bool = F
695
719
self ._top_percent : bool = percent
696
720
self ._top_with_ties : bool = with_ties
697
721
698
- @builder
699
- def fetch_next (self , limit : int ) -> "MSSQLQueryBuilder" :
700
- # Overridden to provide a more domain-specific API for T-SQL users
701
- self ._limit = limit
702
-
703
- def _offset_sql (self ) -> str :
704
- return " OFFSET {offset} ROWS" .format (offset = self ._offset or 0 )
705
-
706
- def _limit_sql (self ) -> str :
707
- return " FETCH NEXT {limit} ROWS ONLY" .format (limit = self ._limit )
708
-
709
722
def _apply_pagination (self , querystring : str ) -> str :
710
723
# Note: Overridden as MSSQL specifies offset before the fetch next limit
711
724
if self ._limit is not None or self ._offset :
0 commit comments