refactor queries into separate files

This commit is contained in:
collerek
2020-09-16 11:51:44 +02:00
parent 54aaa97de2
commit a5d9916575
8 changed files with 67 additions and 26 deletions

BIN
.coverage

Binary file not shown.

View File

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

View 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

View 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

View 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

View 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

View File

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

View File

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