Skip to content

Commit 38c3a15

Browse files
Merge pull request #138 from fabiansinz/master
Limit and offset in fetch object
2 parents f6fcd18 + fbc5c27 commit 38c3a15

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

datajoint/fetch.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from functools import wraps
33
import itertools
44
import re
5+
import warnings
56
from .blob import unpack
67
import numpy as np
78
from datajoint import DataJointError
@@ -41,17 +42,11 @@ def __init__(self, relation):
4142
self._relation = relation._relation
4243
else:
4344
self.behavior = dict(
44-
offset=0, limit=None, order_by=None, as_dict=False
45+
offset=None, limit=None, order_by=None, as_dict=False
4546
)
4647
self._relation = relation
4748

4849

49-
@copy_first
50-
def from_to(self, fro, to):
51-
self.behavior['offset'] = fro
52-
self.behavior['limit'] = to - fro
53-
return self
54-
5550
@copy_first
5651
def order_by(self, *args):
5752
if len(args) > 0:
@@ -64,10 +59,18 @@ def as_dict(self):
6459
return self
6560

6661
@copy_first
67-
def limit_to(self, limit):
62+
def limit(self, limit):
6863
self.behavior['limit'] = limit
6964
return self
7065

66+
@copy_first
67+
def offset(self, offset):
68+
if self.behavior['limit'] is None:
69+
warnings.warn('You should supply a limit together with an offset,')
70+
self.behavior['offset'] = offset
71+
return self
72+
73+
7174
@copy_first
7275
def set_behavior(self, **kwargs):
7376
self.behavior.update(kwargs)
@@ -86,7 +89,9 @@ def __call__(self, **kwargs):
8689
8790
"""
8891
behavior = dict(self.behavior, **kwargs)
89-
92+
if behavior['limit'] is None and behavior['offset'] is not None:
93+
warnings.warn('Offset set, but no limit. Setting limit to a large number. Consider setting a limit yourself.')
94+
behavior['limit'] = 2*len(self._relation)
9095
cur = self._relation.cursor(**behavior)
9196

9297
heading = self._relation.heading

tests/test_fetch.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,22 @@ def test_order_by_direct(self):
6767
for c, l in zip(cur, langs):
6868
assert_true(np.all([cc == ll for cc, ll in zip(c, l)]), 'Sorting order is different')
6969

70-
def test_limit_to(self):
71-
"""Test the limit_to function """
70+
def test_limit(self):
71+
"""Test the limit function """
7272
langs = schema.Language.contents
7373

74-
cur = self.lang.fetch.limit_to(4)(order_by=['language', 'name DESC'])
74+
cur = self.lang.fetch.limit(4)(order_by=['language', 'name DESC'])
7575
langs.sort(key=itemgetter(0), reverse=True)
7676
langs.sort(key=itemgetter(1), reverse=False)
7777
assert_equal(len(cur), 4, 'Length is not correct')
7878
for c, l in list(zip(cur, langs))[:4]:
7979
assert_true(np.all([cc == ll for cc, ll in zip(c, l)]), 'Sorting order is different')
8080

81-
def test_from_to(self):
82-
"""Test the from_to function """
81+
def test_limit_offset(self):
82+
"""Test the limit and offset functions together"""
8383
langs = schema.Language.contents
8484

85-
cur = self.lang.fetch.from_to(2, 6)(order_by=['language', 'name DESC'])
85+
cur = self.lang.fetch(offset=2, limit=4, order_by=['language', 'name DESC'])
8686
langs.sort(key=itemgetter(0), reverse=True)
8787
langs.sort(key=itemgetter(1), reverse=False)
8888
assert_equal(len(cur), 4, 'Length is not correct')

0 commit comments

Comments
 (0)