refactor queries into separate files
This commit is contained in:
@ -1,3 +1,7 @@
|
|||||||
|
from ormar.queryset.filter_query import FilterQuery
|
||||||
|
from ormar.queryset.limit_query import LimitQuery
|
||||||
|
from ormar.queryset.offset_query import OffsetQuery
|
||||||
|
from ormar.queryset.order_query import OrderQuery
|
||||||
from ormar.queryset.queryset import QuerySet
|
from ormar.queryset.queryset import QuerySet
|
||||||
|
|
||||||
__all__ = ["QuerySet"]
|
__all__ = ["QuerySet", "FilterQuery", "LimitQuery", "OffsetQuery", "OrderQuery"]
|
||||||
|
|||||||
17
ormar/queryset/filter_query.py
Normal file
17
ormar/queryset/filter_query.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
class FilterQuery:
|
||||||
|
def __init__(self, filter_clauses: List) -> None:
|
||||||
|
self.filter_clauses = filter_clauses
|
||||||
|
|
||||||
|
def apply(self, expr: sqlalchemy.sql.select) -> sqlalchemy.sql.select:
|
||||||
|
if self.filter_clauses:
|
||||||
|
if len(self.filter_clauses) == 1:
|
||||||
|
clause = self.filter_clauses[0]
|
||||||
|
else:
|
||||||
|
clause = sqlalchemy.sql.and_(*self.filter_clauses)
|
||||||
|
expr = expr.where(clause)
|
||||||
|
return expr
|
||||||
11
ormar/queryset/limit_query.py
Normal file
11
ormar/queryset/limit_query.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
class LimitQuery:
|
||||||
|
def __init__(self, limit_count: int) -> None:
|
||||||
|
self.limit_count = limit_count
|
||||||
|
|
||||||
|
def apply(self, expr: sqlalchemy.sql.select) -> sqlalchemy.sql.select:
|
||||||
|
if self.limit_count:
|
||||||
|
expr = expr.limit(self.limit_count)
|
||||||
|
return expr
|
||||||
11
ormar/queryset/offset_query.py
Normal file
11
ormar/queryset/offset_query.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
class OffsetQuery:
|
||||||
|
def __init__(self, query_offset: int) -> None:
|
||||||
|
self.query_offset = query_offset
|
||||||
|
|
||||||
|
def apply(self, expr: sqlalchemy.sql.select) -> sqlalchemy.sql.select:
|
||||||
|
if self.query_offset:
|
||||||
|
expr = expr.offset(self.query_offset)
|
||||||
|
return expr
|
||||||
14
ormar/queryset/order_query.py
Normal file
14
ormar/queryset/order_query.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
class OrderQuery:
|
||||||
|
def __init__(self, order_bys: List) -> None:
|
||||||
|
self.order_bys = order_bys
|
||||||
|
|
||||||
|
def apply(self, expr: sqlalchemy.sql.select) -> sqlalchemy.sql.select:
|
||||||
|
if self.order_bys:
|
||||||
|
for order in self.order_bys:
|
||||||
|
expr = expr.order_by(order)
|
||||||
|
return expr
|
||||||
@ -7,6 +7,7 @@ import ormar # noqa I100
|
|||||||
from ormar.fields import BaseField
|
from ormar.fields import BaseField
|
||||||
from ormar.fields.foreign_key import ForeignKeyField
|
from ormar.fields.foreign_key import ForeignKeyField
|
||||||
from ormar.fields.many_to_many import ManyToManyField
|
from ormar.fields.many_to_many import ManyToManyField
|
||||||
|
from ormar.queryset import FilterQuery, LimitQuery, OffsetQuery, OrderQuery
|
||||||
from ormar.relations.alias_manager import AliasManager
|
from ormar.relations.alias_manager import AliasManager
|
||||||
|
|
||||||
if TYPE_CHECKING: # pragma no cover
|
if TYPE_CHECKING: # pragma no cover
|
||||||
@ -170,27 +171,13 @@ class Query:
|
|||||||
from_key = part
|
from_key = part
|
||||||
return to_key, from_key
|
return to_key, from_key
|
||||||
|
|
||||||
def filter(self, expr: sqlalchemy.sql.select) -> sqlalchemy.sql.select: # noqa A003
|
|
||||||
if self.filter_clauses:
|
|
||||||
if len(self.filter_clauses) == 1:
|
|
||||||
clause = self.filter_clauses[0]
|
|
||||||
else:
|
|
||||||
clause = sqlalchemy.sql.and_(*self.filter_clauses)
|
|
||||||
expr = expr.where(clause)
|
|
||||||
return expr
|
|
||||||
|
|
||||||
def _apply_expression_modifiers(
|
def _apply_expression_modifiers(
|
||||||
self, expr: sqlalchemy.sql.select
|
self, expr: sqlalchemy.sql.select
|
||||||
) -> sqlalchemy.sql.select:
|
) -> sqlalchemy.sql.select:
|
||||||
expr = self.filter(expr)
|
expr = FilterQuery(filter_clauses=self.filter_clauses).apply(expr)
|
||||||
if self.limit_count:
|
expr = LimitQuery(limit_count=self.limit_count).apply(expr)
|
||||||
expr = expr.limit(self.limit_count)
|
expr = OffsetQuery(query_offset=self.query_offset).apply(expr)
|
||||||
|
expr = OrderQuery(order_bys=self.order_bys).apply(expr)
|
||||||
if self.query_offset:
|
|
||||||
expr = expr.offset(self.query_offset)
|
|
||||||
|
|
||||||
for order in self.order_bys:
|
|
||||||
expr = expr.order_by(order)
|
|
||||||
return expr
|
return expr
|
||||||
|
|
||||||
def _reset_query_parameters(self) -> None:
|
def _reset_query_parameters(self) -> None:
|
||||||
|
|||||||
@ -5,9 +5,11 @@ import sqlalchemy
|
|||||||
|
|
||||||
import ormar # noqa I100
|
import ormar # noqa I100
|
||||||
from ormar import MultipleMatches, NoMatch
|
from ormar import MultipleMatches, NoMatch
|
||||||
|
from ormar.queryset import FilterQuery
|
||||||
from ormar.queryset.clause import QueryClause
|
from ormar.queryset.clause import QueryClause
|
||||||
from ormar.queryset.query import Query
|
from ormar.queryset.query import Query
|
||||||
|
|
||||||
|
|
||||||
if TYPE_CHECKING: # pragma no cover
|
if TYPE_CHECKING: # pragma no cover
|
||||||
from ormar import Model
|
from ormar import Model
|
||||||
|
|
||||||
@ -119,14 +121,9 @@ class QuerySet:
|
|||||||
async def delete(self, **kwargs: Any) -> int:
|
async def delete(self, **kwargs: Any) -> int:
|
||||||
if kwargs:
|
if kwargs:
|
||||||
return await self.filter(**kwargs).delete()
|
return await self.filter(**kwargs).delete()
|
||||||
qry = Query(
|
expr = FilterQuery(filter_clauses=self.filter_clauses,).apply(
|
||||||
model_cls=self.model_cls,
|
self.table.delete()
|
||||||
select_related=self._select_related,
|
|
||||||
filter_clauses=self.filter_clauses,
|
|
||||||
offset=self.query_offset,
|
|
||||||
limit_count=self.limit_count,
|
|
||||||
)
|
)
|
||||||
expr = qry.filter(self.table.delete())
|
|
||||||
return await self.database.execute(expr)
|
return await self.database.execute(expr)
|
||||||
|
|
||||||
def limit(self, limit_count: int) -> "QuerySet":
|
def limit(self, limit_count: int) -> "QuerySet":
|
||||||
|
|||||||
Reference in New Issue
Block a user