This commit is contained in:
Konsta Vesterinen
2014-05-06 14:51:48 +03:00
parent c3e1774019
commit 340c14e0b2
3 changed files with 81 additions and 60 deletions

View File

@@ -59,7 +59,7 @@ LocaleType
IPAddressType IPAddressType
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
.. module:: sqlalchemy_utils.types.ip_addresss .. module:: sqlalchemy_utils.types.ip_address
.. autoclass:: IPAddressType .. autoclass:: IPAddressType

View File

@@ -4,7 +4,10 @@ Utility classes
QueryChain QueryChain
---------- ----------
.. module:: sqlalchemy_utils.query_chain .. automodule:: sqlalchemy_utils.query_chain
API
^^^
.. autoclass:: QueryChain .. autoclass:: QueryChain
:members: :members:

View File

@@ -1,3 +1,79 @@
"""
QueryChain is a wrapper for sequence of queries.
Features:
* Easy iteration for sequence of queries
* Limit and offset which are applied to all queries in the chain
* Smart __getitem__ support
Initialization
^^^^^^^^^^^^^^
QueryChain takes iterable of queries as first argument. Additionally limit and
offset parameters can be given
::
chain = QueryChain([session.query(User), session.query(Article)])
chain = QueryChain(
[session.query(User), session.query(Article)],
limit=4
)
Simple iteration
^^^^^^^^^^^^^^^^
::
chain = QueryChain([session.query(User), session.query(Article)])
for obj in chain:
print obj
Limit and offset
^^^^^^^^^^^^^^^^
Lets say you have 5 blog posts, 5 articles and 5 news items in your
database.
::
chain = QueryChain(
[
session.query(BlogPost),
session.query(Article),
session.query(NewsItem)
],
limit=5
)
list(chain) # all blog posts but not articles and news items
chain.offset = 4
list(chain) # last blog post, and first four articles
Chain slicing
^^^^^^^^^^^^^
::
chain = QueryChain(
[
session.query(BlogPost),
session.query(Article),
session.query(NewsItem)
]
)
chain[3:6] # New QueryChain with offset=3 and limit=6
"""
from copy import copy from copy import copy
@@ -5,70 +81,12 @@ class QueryChain(object):
""" """
QueryChain can be used as a wrapper for sequence of queries. QueryChain can be used as a wrapper for sequence of queries.
Features:
* Easy iteration for sequence of queries
* Limit and offset which are smartly applied to all queries
* Smart __getitem__ support
:param queries: A sequence of SQLAlchemy Query objects :param queries: A sequence of SQLAlchemy Query objects
:param limit: Similar to normal query limit this parameter can be used for :param limit: Similar to normal query limit this parameter can be used for
limiting the number of results for the whole query chain. limiting the number of results for the whole query chain.
:param offset: Similar to normal query offset this parameter can be used :param offset: Similar to normal query offset this parameter can be used
for offsetting the query chain as a whole. for offsetting the query chain as a whole.
Simple iteration
^^^^^^^^^^^^^^^^
::
chain = QueryChain([session.query(User), session.query(Article)])
for obj in chain:
print obj
Limit and offset
^^^^^^^^^^^^^^^^
Lets say you have 5 blog posts, 5 articles and 5 news items in your
database.
::
chain = QueryChain(
[
session.query(BlogPost),
session.query(Article),
session.query(NewsItem)
],
limit=5
)
list(chain) # all blog posts but not articles and news items
chain.offset = 4
list(chain) # last blog post, and first four articles
Chain slicing
^^^^^^^^^^^^^
::
chain = QueryChain(
[
session.query(BlogPost),
session.query(Article),
session.query(NewsItem)
]
)
chain[3:6] # New QueryChain with offset=3 and limit=6
.. versionadded: 0.26.0 .. versionadded: 0.26.0
""" """
def __init__(self, queries, limit=None, offset=None): def __init__(self, queries, limit=None, offset=None):