Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions spanner/google/cloud/spanner_v1/keyset.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
class KeyRange(object):
"""Identify range of table rows via start / end points.

Specify either a `start_open` or `start_closed` key, or defaults to
`start_closed = []`. Specify either an `end_open` or `end_closed` key,
or defaults to `end_closed = []`. However, at least one key has to be
specified. If no keys are specified, ValueError is raised.

:type start_open: list of scalars
:param start_open: keys identifying start of range (this key excluded)

Expand All @@ -35,6 +40,8 @@ class KeyRange(object):

:type end_closed: list of scalars
:param end_closed: keys identifying end of range (this key included)

:raises ValueError: if no keys are specified
"""
def __init__(self, start_open=None, start_closed=None,
end_open=None, end_closed=None):
Expand All @@ -43,9 +50,13 @@ def __init__(self, start_open=None, start_closed=None,

if start_open and start_closed:
raise ValueError("Specify one of 'start_open' / 'start_closed'.")
elif start_open is None and start_closed is None:
start_closed = []

if end_open and end_closed:
raise ValueError("Specify one of 'end_open' / 'end_closed'.")
elif end_open is None and end_closed is None:
end_closed = []

self.start_open = start_open
self.start_closed = start_closed
Expand Down
8 changes: 4 additions & 4 deletions spanner/tests/unit/test_keyset.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,29 +48,29 @@ def test_ctor_w_only_start_open(self):
self.assertEqual(krange.start_open, KEY_1)
self.assertEqual(krange.start_closed, None)
self.assertEqual(krange.end_open, None)
self.assertEqual(krange.end_closed, None)
self.assertEqual(krange.end_closed, [])

def test_ctor_w_only_start_closed(self):
KEY_1 = [u'key_1']
krange = self._make_one(start_closed=KEY_1)
self.assertEqual(krange.start_open, None)
self.assertEqual(krange.start_closed, KEY_1)
self.assertEqual(krange.end_open, None)
self.assertEqual(krange.end_closed, None)
self.assertEqual(krange.end_closed, [])

def test_ctor_w_only_end_open(self):
KEY_1 = [u'key_1']
krange = self._make_one(end_open=KEY_1)
self.assertEqual(krange.start_open, None)
self.assertEqual(krange.start_closed, None)
self.assertEqual(krange.start_closed, [])
self.assertEqual(krange.end_open, KEY_1)
self.assertEqual(krange.end_closed, None)

def test_ctor_w_only_end_closed(self):
KEY_1 = [u'key_1']
krange = self._make_one(end_closed=KEY_1)
self.assertEqual(krange.start_open, None)
self.assertEqual(krange.start_closed, None)
self.assertEqual(krange.start_closed, [])
self.assertEqual(krange.end_open, None)
self.assertEqual(krange.end_closed, KEY_1)

Expand Down