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
^^^^^^^^^^^^^
.. module:: sqlalchemy_utils.types.ip_addresss
.. module:: sqlalchemy_utils.types.ip_address
.. autoclass:: IPAddressType

View File

@@ -4,7 +4,10 @@ Utility classes
QueryChain
----------
.. module:: sqlalchemy_utils.query_chain
.. automodule:: sqlalchemy_utils.query_chain
API
^^^
.. autoclass:: QueryChain
: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
@@ -5,70 +81,12 @@ class QueryChain(object):
"""
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 limit: Similar to normal query limit this parameter can be used for
limiting the number of results for the whole query chain.
:param offset: Similar to normal query offset this parameter can be used
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
"""
def __init__(self, queries, limit=None, offset=None):