As of January 1, 2020 this library no longer supports Python 2 on the latest released version.
Library versions released prior to that date will continue to be available. For more information please
visit Python 2 support on Google Cloud.
Source code for google.cloud.bigtable.row_set
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""User-friendly container for Google Cloud Bigtable RowSet """
from google.cloud._helpers import _to_bytes
[docs]class RowSet(object):
"""Convenience wrapper of google.bigtable.v2.RowSet
Useful for creating a set of row keys and row ranges, which can
be passed to yield_rows method of class:`.Table.yield_rows`.
"""
def __init__(self):
self.row_keys = []
self.row_ranges = []
def __eq__(self, other):
if not isinstance(other, self.__class__):
return NotImplemented
if len(other.row_keys) != len(self.row_keys):
return False
if len(other.row_ranges) != len(self.row_ranges):
return False
if not set(other.row_keys) == set(self.row_keys):
return False
if not set(other.row_ranges) == set(self.row_ranges):
return False
return True
def __ne__(self, other):
return not self == other
[docs] def add_row_key(self, row_key):
"""Add row key to row_keys list.
For example:
.. literalinclude:: snippets_table.py
:start-after: [START bigtable_api_add_row_key]
:end-before: [END bigtable_api_add_row_key]
:dedent: 4
:type row_key: bytes
:param row_key: The key of a row to read
"""
self.row_keys.append(row_key)
[docs] def add_row_range(self, row_range):
"""Add row_range to row_ranges list.
For example:
.. literalinclude:: snippets_table.py
:start-after: [START bigtable_api_add_row_range]
:end-before: [END bigtable_api_add_row_range]
:dedent: 4
:type row_range: class:`RowRange`
:param row_range: The row range object having start and end key
"""
self.row_ranges.append(row_range)
[docs] def add_row_range_from_keys(
self, start_key=None, end_key=None, start_inclusive=True, end_inclusive=False
):
"""Add row range to row_ranges list from the row keys
For example:
.. literalinclude:: snippets_table.py
:start-after: [START bigtable_api_row_range_from_keys]
:end-before: [END bigtable_api_row_range_from_keys]
:dedent: 4
:type start_key: bytes
:param start_key: (Optional) Start key of the row range. If left empty,
will be interpreted as the empty string.
:type end_key: bytes
:param end_key: (Optional) End key of the row range. If left empty,
will be interpreted as the empty string and range will
be unbounded on the high end.
:type start_inclusive: bool
:param start_inclusive: (Optional) Whether the ``start_key`` should be
considered inclusive. The default is True (inclusive).
:type end_inclusive: bool
:param end_inclusive: (Optional) Whether the ``end_key`` should be
considered inclusive. The default is False (exclusive).
"""
row_range = RowRange(start_key, end_key, start_inclusive, end_inclusive)
self.row_ranges.append(row_range)
[docs] def add_row_range_with_prefix(self, row_key_prefix):
"""Add row range to row_ranges list that start with the row_key_prefix from the row keys
For example:
.. literalinclude:: snippets_table.py
:start-after: [START bigtable_api_add_row_range_with_prefix]
:end-before: [END bigtable_api_add_row_range_with_prefix]
:type row_key_prefix: str
:param row_key_prefix: To retrieve all rows that start with this row key prefix.
Prefix cannot be zero length."""
end_key = row_key_prefix[:-1] + chr(ord(row_key_prefix[-1]) + 1)
self.add_row_range_from_keys(
row_key_prefix.encode("utf-8"), end_key.encode("utf-8")
)
def _update_message_request(self, message):
"""Add row keys and row range to given request message
:type message: class:`data_messages_v2_pb2.ReadRowsRequest`
:param message: The ``ReadRowsRequest`` protobuf
"""
for each in self.row_keys:
message.rows.row_keys._pb.append(_to_bytes(each))
for each in self.row_ranges:
r_kwrags = each.get_range_kwargs()
message.rows.row_ranges.append(r_kwrags)
[docs]class RowRange(object):
"""Convenience wrapper of google.bigtable.v2.RowRange
:type start_key: bytes
:param start_key: (Optional) Start key of the row range. If left empty,
will be interpreted as the empty string.
:type end_key: bytes
:param end_key: (Optional) End key of the row range. If left empty,
will be interpreted as the empty string and range will
be unbounded on the high end.
:type start_inclusive: bool
:param start_inclusive: (Optional) Whether the ``start_key`` should be
considered inclusive. The default is True (inclusive).
:type end_inclusive: bool
:param end_inclusive: (Optional) Whether the ``end_key`` should be
considered inclusive. The default is False (exclusive).
"""
def __init__(
self, start_key=None, end_key=None, start_inclusive=True, end_inclusive=False
):
self.start_key = start_key
self.start_inclusive = start_inclusive
self.end_key = end_key
self.end_inclusive = end_inclusive
def _key(self):
"""A tuple key that uniquely describes this field.
Used to compute this instance's hashcode and evaluate equality.
Returns:
Tuple[str]: The contents of this :class:`.RowRange`.
"""
return (self.start_key, self.start_inclusive, self.end_key, self.end_inclusive)
def __hash__(self):
return hash(self._key())
def __eq__(self, other):
if not isinstance(other, self.__class__):
return NotImplemented
return self._key() == other._key()
def __ne__(self, other):
return not self == other
[docs] def get_range_kwargs(self):
"""Convert row range object to dict which can be passed to
google.bigtable.v2.RowRange add method.
"""
range_kwargs = {}
if self.start_key is not None:
start_key_key = "start_key_open"
if self.start_inclusive:
start_key_key = "start_key_closed"
range_kwargs[start_key_key] = _to_bytes(self.start_key)
if self.end_key is not None:
end_key_key = "end_key_open"
if self.end_inclusive:
end_key_key = "end_key_closed"
range_kwargs[end_key_key] = _to_bytes(self.end_key)
return range_kwargs