From a5d9916575f2d6068125d352b20e7713fbd7d13c Mon Sep 17 00:00:00 2001 From: collerek Date: Wed, 16 Sep 2020 11:51:44 +0200 Subject: [PATCH] refactor queries into separate files --- .coverage | Bin 53248 -> 53248 bytes ormar/queryset/__init__.py | 6 +++++- ormar/queryset/filter_query.py | 17 +++++++++++++++++ ormar/queryset/limit_query.py | 11 +++++++++++ ormar/queryset/offset_query.py | 11 +++++++++++ ormar/queryset/order_query.py | 14 ++++++++++++++ ormar/queryset/query.py | 23 +++++------------------ ormar/queryset/queryset.py | 11 ++++------- 8 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 ormar/queryset/filter_query.py create mode 100644 ormar/queryset/limit_query.py create mode 100644 ormar/queryset/offset_query.py create mode 100644 ormar/queryset/order_query.py diff --git a/.coverage b/.coverage index e405d35945826d3b6dc1f2aa95ec42c6f14b3a53..52f858750a390b6da189fa468c25b0f1abde0a4f 100644 GIT binary patch delta 1167 zcmZ8hU1(cX9KW~cvNZSO{BOQ)liaikT02l^h|AiUIopAKYNB*|5Z2v>p=k+rO_vX9 zi17}l;LEJzD2P5-5ft=cLSSPZU1WnjjLjmblSX%^pc87Ehhf63O*}U=n(gKM|Nq~| zIp_ZF<(^(ar&rKdPX+mrKqwU1ABuzyl=cVL<%r5_415QlK?a@&jBn!=d=ih~9_g0! zo^)J#T-+2dh-btpQ5EhAUkD4rKK?KMDu0&ON;cWg_YAA#@MMtnl2emm)S;VoPwBw$q4bqbn3PI@M1pfBJzuEtDH{EpU5Ut z3lx3E*>P2)HrBB#Q8+td=BVFCwqjPI#jLEYeXuz#$9Ptzm+_mNd@7en=QD{c-D?C8 zlj)cosq`y}bi7SdZWJRX*WsM0*;#7&j~tP@jq}Nq$^W@gvCC+iP0nY#cHJkK_b6?} zlpY%M3lCaud8gVb@IfV4~P>5QI5al^{1m)YncvNQl$kg$JtU@3j zFkcFECF|`_F<03cU{sIm1C{L>JJYp^Txef$11Jd&Z~N@x~+Ik+*^Nw zG>m4msuzrx{eM>*GlGZWZcqK!u~w}g+;j-I>vF3wR;c}cS-163V6gAW4+`fE<3h1g zs3A$AkWX2?+bHPqauHmn#Z|vrYJH>|W!;$OofJ`=cWxH9REvZ5vSXmxZ>P<(_Ko0k z+iSU{^O@A-&RVLnIc8`(@t@1!w^4fBw(*;uuV}^E_T0i|sx`1Vi*tE%nd^|p)0(=Kjz>BPsM2B5T-$?hzu)KkJLh*koY5I}bcTIX zY31t8HMYj;>c+adP`x!Q)=J2(fKTuW2H_fD9KkcV4`0Rw!j>>8bPIKShTq^H^S5{d zilCRshwLGZs73`<67jTJ86%l!wJ`?byI~>|4vr*R)k;092okTWhyooccOa#XRgB~T zM>-uEMoR`9O^k+!H|0~>!m5FhE8^)Pbk2%rf>Fw_w@_6W2HD(n(^sZ8J;5c{H}Yd>mv2L})Q&@>(`{uWGVZo1jkRnq@w$uic7;mARhHVF03GV{_IrD}AJB*C z$=CJ@Dkm~J;%jfBir_KJa!ML%XxPYzdBnjfA*f+{$j1(g?4zQiSl%c1^G-E&+wLg; zZ`09mu~xzs1^j{^@C7y@ME@)R!_Wp6D8X4A#qV$k&*7)|As)hA_%?3F7HacT2pT0N zqpp%Z|JlDEKiqQf=Y}))g2}|O(I|6cs+6ST*=!={k9V2=CeoeAK>0aC>YF{6ECxMo z%=(m=^V|K&@2f$Lj)F_Nib?-sJpMMY?@zLVmZBo<%0b#6^sEIyBOlSEHbS|nV0_IU zZ|6ixjACpvaCAWhv=*TxYr?c>!F$qlCbqH~SzemW#+DMlr;`iW#iOV%&6osvKp^Ym z=gUfXS~v51k1}iT1IN+KP9&UJUdW{m!_nyK>nYV)M01QdVws4s5_pN~iIv({LdZM) R!c55+QLW454v?|%;6E+M52gSB diff --git a/ormar/queryset/__init__.py b/ormar/queryset/__init__.py index 7bf6fc6..2bc0a6d 100644 --- a/ormar/queryset/__init__.py +++ b/ormar/queryset/__init__.py @@ -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 -__all__ = ["QuerySet"] +__all__ = ["QuerySet", "FilterQuery", "LimitQuery", "OffsetQuery", "OrderQuery"] diff --git a/ormar/queryset/filter_query.py b/ormar/queryset/filter_query.py new file mode 100644 index 0000000..8db8185 --- /dev/null +++ b/ormar/queryset/filter_query.py @@ -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 diff --git a/ormar/queryset/limit_query.py b/ormar/queryset/limit_query.py new file mode 100644 index 0000000..2de7950 --- /dev/null +++ b/ormar/queryset/limit_query.py @@ -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 diff --git a/ormar/queryset/offset_query.py b/ormar/queryset/offset_query.py new file mode 100644 index 0000000..bca365b --- /dev/null +++ b/ormar/queryset/offset_query.py @@ -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 diff --git a/ormar/queryset/order_query.py b/ormar/queryset/order_query.py new file mode 100644 index 0000000..cbb4a81 --- /dev/null +++ b/ormar/queryset/order_query.py @@ -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 diff --git a/ormar/queryset/query.py b/ormar/queryset/query.py index 5cb507c..b1e8830 100644 --- a/ormar/queryset/query.py +++ b/ormar/queryset/query.py @@ -7,6 +7,7 @@ import ormar # noqa I100 from ormar.fields import BaseField from ormar.fields.foreign_key import ForeignKeyField from ormar.fields.many_to_many import ManyToManyField +from ormar.queryset import FilterQuery, LimitQuery, OffsetQuery, OrderQuery from ormar.relations.alias_manager import AliasManager if TYPE_CHECKING: # pragma no cover @@ -170,27 +171,13 @@ class Query: from_key = part 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( self, expr: sqlalchemy.sql.select ) -> sqlalchemy.sql.select: - expr = self.filter(expr) - if self.limit_count: - expr = expr.limit(self.limit_count) - - if self.query_offset: - expr = expr.offset(self.query_offset) - - for order in self.order_bys: - expr = expr.order_by(order) + expr = FilterQuery(filter_clauses=self.filter_clauses).apply(expr) + expr = LimitQuery(limit_count=self.limit_count).apply(expr) + expr = OffsetQuery(query_offset=self.query_offset).apply(expr) + expr = OrderQuery(order_bys=self.order_bys).apply(expr) return expr def _reset_query_parameters(self) -> None: diff --git a/ormar/queryset/queryset.py b/ormar/queryset/queryset.py index a4c48d3..79f9ff2 100644 --- a/ormar/queryset/queryset.py +++ b/ormar/queryset/queryset.py @@ -5,9 +5,11 @@ import sqlalchemy import ormar # noqa I100 from ormar import MultipleMatches, NoMatch +from ormar.queryset import FilterQuery from ormar.queryset.clause import QueryClause from ormar.queryset.query import Query + if TYPE_CHECKING: # pragma no cover from ormar import Model @@ -119,14 +121,9 @@ class QuerySet: async def delete(self, **kwargs: Any) -> int: if kwargs: return await self.filter(**kwargs).delete() - qry = Query( - model_cls=self.model_cls, - select_related=self._select_related, - filter_clauses=self.filter_clauses, - offset=self.query_offset, - limit_count=self.limit_count, + expr = FilterQuery(filter_clauses=self.filter_clauses,).apply( + self.table.delete() ) - expr = qry.filter(self.table.delete()) return await self.database.execute(expr) def limit(self, limit_count: int) -> "QuerySet":