Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support reversed scans #918

Closed
wants to merge 11 commits into from
13 changes: 13 additions & 0 deletions google/cloud/bigtable/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,7 @@ def read_rows(
end_inclusive=False,
row_set=None,
retry=DEFAULT_RETRY_READ_ROWS,
reversed=None,
):
"""Read rows from this table.

Expand Down Expand Up @@ -619,6 +620,11 @@ def read_rows(
method or the :meth:`~google.api_core.retry.Retry.with_deadline`
method.

:type reversed: bool
:param reversed: (Optional) Whether records should return in descending
lexicographical order. The default is False
(ascending).

:rtype: :class:`.PartialRowsData`
:returns: A :class:`.PartialRowsData` a generator for consuming
the streamed results.
Expand All @@ -632,6 +638,7 @@ def read_rows(
end_inclusive=end_inclusive,
app_profile_id=self._app_profile_id,
row_set=row_set,
reversed=reversed,
)
data_client = self._instance._client.table_data_client
return PartialRowsData(data_client.read_rows, request_pb, retry)
Expand Down Expand Up @@ -1265,6 +1272,7 @@ def _create_row_request(
end_inclusive=False,
app_profile_id=None,
row_set=None,
reversed=None,
):
"""Creates a request to read rows in a table.

Expand Down Expand Up @@ -1301,6 +1309,9 @@ def _create_row_request(
:param row_set: (Optional) The row set containing multiple row keys and
row_ranges.

:param reversed: (Optional) Whether records should return in descending
lexicographical order. The default is False (ascending).

:rtype: :class:`data_messages_v2_pb2.ReadRowsRequest`
:returns: The ``ReadRowsRequest`` protobuf corresponding to the inputs.
:raises: :class:`ValueError <exceptions.ValueError>` if both
Expand All @@ -1316,6 +1327,8 @@ def _create_row_request(
request_kwargs["rows_limit"] = limit
if app_profile_id is not None:
request_kwargs["app_profile_id"] = app_profile_id
if reversed is not None:
request_kwargs["reversed"] = reversed

message = data_messages_v2_pb2.ReadRowsRequest(**request_kwargs)

Expand Down
14 changes: 14 additions & 0 deletions tests/unit/v2_client/test_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,7 @@ def mock_create_row_request(table_name, **kwargs):
"app_profile_id": app_profile_id,
"end_key": None,
"limit": None,
"reversed": None,
"start_key": None,
"filter_": filter_obj,
},
Expand Down Expand Up @@ -887,13 +888,15 @@ def mock_create_row_request(table_name, **kwargs):
end_key = b"end-key"
filter_obj = object()
limit = 22
reversed = True
with _Monkey(MUT, _create_row_request=mock_create_row_request):
result = table.read_rows(
start_key=start_key,
end_key=end_key,
filter_=filter_obj,
limit=limit,
retry=retry,
reversed=reversed,
)

assert result.rows == expected_result.rows
Expand All @@ -903,6 +906,7 @@ def mock_create_row_request(table_name, **kwargs):
"end_key": end_key,
"filter_": filter_obj,
"limit": limit,
"reversed": reversed,
"end_inclusive": False,
"app_profile_id": app_profile_id,
"row_set": None,
Expand Down Expand Up @@ -2102,6 +2106,16 @@ def test__create_row_request_with_limit():
assert result == expected_result


def test__create_row_request_with_reversed():
from google.cloud.bigtable.table import _create_row_request

table_name = "table_name"
reversed = True
result = _create_row_request(table_name, reversed=reversed)
expected_result = _ReadRowsRequestPB(table_name=table_name, reversed=reversed)
assert result == expected_result


def test__create_row_request_with_row_set():
from google.cloud.bigtable.table import _create_row_request
from google.cloud.bigtable.row_set import RowSet
Expand Down
Loading