Skip to content

Commit da27527

Browse files
fix: improve rowset revision (#979)
1 parent 8dad1cf commit da27527

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

google/cloud/bigtable/data/_async/_read_rows.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ def _revise_request_rowset(
342342
_RowSetComplete: if there are no rows left to process after the revision
343343
"""
344344
# if user is doing a whole table scan, start a new one with the last seen key
345-
if row_set is None or (not row_set.row_ranges and row_set.row_keys is not None):
345+
if row_set is None or (not row_set.row_ranges and not row_set.row_keys):
346346
last_seen = last_seen_row_key
347347
return RowSetPB(row_ranges=[RowRangePB(start_key_open=last_seen)])
348348
# remove seen keys from user-specific key list

tests/unit/data/_async/test__read_rows.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,31 @@ def test_ctor(self):
9898
(["d", "c", "b", "a"], "b", ["d", "c"]),
9999
],
100100
)
101-
def test_revise_request_rowset_keys(self, in_keys, last_key, expected):
101+
@pytest.mark.parametrize("with_range", [True, False])
102+
def test_revise_request_rowset_keys_with_range(
103+
self, in_keys, last_key, expected, with_range
104+
):
102105
from google.cloud.bigtable_v2.types import RowSet as RowSetPB
103106
from google.cloud.bigtable_v2.types import RowRange as RowRangePB
107+
from google.cloud.bigtable.data.exceptions import _RowSetComplete
104108

105109
in_keys = [key.encode("utf-8") for key in in_keys]
106110
expected = [key.encode("utf-8") for key in expected]
107111
last_key = last_key.encode("utf-8")
108112

109-
sample_range = RowRangePB(start_key_open=last_key)
110-
row_set = RowSetPB(row_keys=in_keys, row_ranges=[sample_range])
111-
revised = self._get_target_class()._revise_request_rowset(row_set, last_key)
112-
assert revised.row_keys == expected
113-
assert revised.row_ranges == [sample_range]
113+
if with_range:
114+
sample_range = [RowRangePB(start_key_open=last_key)]
115+
else:
116+
sample_range = []
117+
row_set = RowSetPB(row_keys=in_keys, row_ranges=sample_range)
118+
if not with_range and expected == []:
119+
# expect exception if we are revising to an empty rowset
120+
with pytest.raises(_RowSetComplete):
121+
self._get_target_class()._revise_request_rowset(row_set, last_key)
122+
else:
123+
revised = self._get_target_class()._revise_request_rowset(row_set, last_key)
124+
assert revised.row_keys == expected
125+
assert revised.row_ranges == sample_range
114126

115127
@pytest.mark.parametrize(
116128
"in_ranges,last_key,expected",
@@ -157,9 +169,13 @@ def test_revise_request_rowset_keys(self, in_keys, last_key, expected):
157169
),
158170
],
159171
)
160-
def test_revise_request_rowset_ranges(self, in_ranges, last_key, expected):
172+
@pytest.mark.parametrize("with_key", [True, False])
173+
def test_revise_request_rowset_ranges(
174+
self, in_ranges, last_key, expected, with_key
175+
):
161176
from google.cloud.bigtable_v2.types import RowSet as RowSetPB
162177
from google.cloud.bigtable_v2.types import RowRange as RowRangePB
178+
from google.cloud.bigtable.data.exceptions import _RowSetComplete
163179

164180
# convert to protobuf
165181
next_key = (last_key + "a").encode("utf-8")
@@ -172,10 +188,20 @@ def test_revise_request_rowset_ranges(self, in_ranges, last_key, expected):
172188
RowRangePB(**{k: v.encode("utf-8") for k, v in r.items()}) for r in expected
173189
]
174190

175-
row_set = RowSetPB(row_ranges=in_ranges, row_keys=[next_key])
176-
revised = self._get_target_class()._revise_request_rowset(row_set, last_key)
177-
assert revised.row_keys == [next_key]
178-
assert revised.row_ranges == expected
191+
if with_key:
192+
row_keys = [next_key]
193+
else:
194+
row_keys = []
195+
196+
row_set = RowSetPB(row_ranges=in_ranges, row_keys=row_keys)
197+
if not with_key and expected == []:
198+
# expect exception if we are revising to an empty rowset
199+
with pytest.raises(_RowSetComplete):
200+
self._get_target_class()._revise_request_rowset(row_set, last_key)
201+
else:
202+
revised = self._get_target_class()._revise_request_rowset(row_set, last_key)
203+
assert revised.row_keys == row_keys
204+
assert revised.row_ranges == expected
179205

180206
@pytest.mark.parametrize("last_key", ["a", "b", "c"])
181207
def test_revise_request_full_table(self, last_key):

0 commit comments

Comments
 (0)