diff --git a/google/cloud/bigtable/table.py b/google/cloud/bigtable/table.py index e3191a729..77d8b5a22 100644 --- a/google/cloud/bigtable/table.py +++ b/google/cloud/bigtable/table.py @@ -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. @@ -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. @@ -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) @@ -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. @@ -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 ` if both @@ -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) diff --git a/tests/unit/v2_client/test_table.py b/tests/unit/v2_client/test_table.py index 032363bd7..e33448270 100644 --- a/tests/unit/v2_client/test_table.py +++ b/tests/unit/v2_client/test_table.py @@ -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, }, @@ -887,6 +888,7 @@ 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, @@ -894,6 +896,7 @@ def mock_create_row_request(table_name, **kwargs): filter_=filter_obj, limit=limit, retry=retry, + reversed=reversed, ) assert result.rows == expected_result.rows @@ -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, @@ -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