Skip to content

Commit

Permalink
Supporting refining of existing results generators.
Browse files Browse the repository at this point in the history
  • Loading branch information
rolobio committed Feb 7, 2017
1 parent 6f60abd commit 60df685
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 13 deletions.
14 changes: 7 additions & 7 deletions dictorm/dictorm.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,10 +337,8 @@ def _execute_once(self):
"""
if not self.executed:
self.executed = True
if not self.refined:
# Use the default order by
self.refine(order_by=self.order_by)
self.curs.execute(self.query.query, self.query.wheres)
query = self.query.build()
self.curs.execute(query, self.query.wheres)


# for python 2.7
Expand All @@ -357,11 +355,13 @@ def __len__(self):

def refine(self, **kw):
"""
Refine the results of this generator before the results are fetched.
Get a new ResultsGenerator built from this generator's properties, but
now with the additional properties provided as arguments.
See Query.refine for supported refinements.
"""
self.query.refine(**kw)
self.query.build()
return self
return ResultsGenerator(self.query)



Expand Down
21 changes: 15 additions & 6 deletions dictorm/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -826,7 +826,7 @@ def test_real(self):
self.assertEqual(_remove_refs(car_owners), _remove_refs([milton, peter]))


def test_refine(self):
def test_refine_order_by(self):
"""
A result set can be refined using order by. A reference can be refined
using the same technique.
Expand Down Expand Up @@ -861,7 +861,7 @@ def test_refine(self):
self.assertEqual(list(all_subordinates.refine(name='Alice')), [alice,])


def test_refine2(self):
def test_refine_offset_limit(self):
"""
A result set can be refined using an offset and limit.
"""
Expand All @@ -872,14 +872,23 @@ def test_refine2(self):
abe = Person(name='Abe').flush()
gus = Person(name='Gus').flush()

self.assertEqual(list(Person.get_where()), [bob, aly, tom, abe, gus])
persons = Person.get_where()
self.assertEqual(list(persons), [bob, aly, tom, abe, gus])
self.assertEqual(list(persons), [bob, aly, tom, abe, gus])

# Using limit and offset, but in such a way that it returns everything
if self.db.kind == 'postgresql':
self.assertEqual(list(Person.get_where().refine(limit='ALL', offset=0)),
self.assertEqual(list(persons.refine(limit='ALL', offset=0)),
[bob, aly, tom, abe, gus])

self.assertEqual(list(Person.get_where().refine(limit=2)), [bob, aly])
self.assertEqual(list(Person.get_where().refine(limit=2, offset=3)), [abe, gus])
# Single refine
limited = persons.refine(limit=2)
self.assertEqual(list(limited), [bob, aly])
self.assertEqual(list(limited), [bob, aly])

self.assertEqual(list(limited.refine(offset=3)), [abe, gus])
# Multiple refinings
self.assertEqual(list(persons.refine(limit=2).refine(offset=2)), [tom, abe])


def test_onetoone_cache(self):
Expand Down

0 comments on commit 60df685

Please sign in to comment.