Skip to content

Commit 4796ac8

Browse files
feat: add 'Rowset.add_row_range_with_prefix' (googleapis#30)
Co-authored-by: Tres Seaver <tseaver@palladion.com>
1 parent 2c8c386 commit 4796ac8

4 files changed

Lines changed: 93 additions & 0 deletions

File tree

docs/snippets_table.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,45 @@ def test_bigtable_add_row_add_row_range_add_row_range_from_keys():
691691
expected_row_keys = [b"row_key_3", b"row_key_4", b"row_key_5", b"row_key_6"]
692692
found_row_keys = [row.row_key for row in read_rows]
693693
assert found_row_keys == expected_row_keys
694+
table.truncate(timeout=200)
695+
696+
697+
def test_bigtable_add_row_range_with_prefix():
698+
row_keys = [
699+
b"row_key_1",
700+
b"row_key_2",
701+
b"row_key_3",
702+
b"sample_row_key_1",
703+
b"sample_row_key_2",
704+
]
694705

706+
rows = []
707+
for row_key in row_keys:
708+
row = Config.TABLE.row(row_key)
709+
row.set_cell(COLUMN_FAMILY_ID, COL_NAME1, CELL_VAL1)
710+
rows.append(row)
711+
Config.TABLE.mutate_rows(rows)
712+
713+
# [START bigtable_add_row_range_with_prefix]
714+
from google.cloud.bigtable import Client
715+
from google.cloud.bigtable.row_set import RowSet
716+
717+
client = Client(admin=True)
718+
instance = client.instance(INSTANCE_ID)
719+
table = instance.table(TABLE_ID)
720+
721+
row_set = RowSet()
722+
row_set.add_row_range_with_prefix("row")
723+
# [END bigtable_add_row_range_with_prefix]
724+
725+
read_rows = table.read_rows(row_set=row_set)
726+
expected_row_keys = [
727+
b"row_key_1",
728+
b"row_key_2",
729+
b"row_key_3",
730+
]
731+
found_row_keys = [row.row_key for row in read_rows]
732+
assert found_row_keys == expected_row_keys
695733
table.truncate(timeout=200)
696734

697735

google/cloud/bigtable/row_set.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,24 @@ def add_row_range_from_keys(
112112
row_range = RowRange(start_key, end_key, start_inclusive, end_inclusive)
113113
self.row_ranges.append(row_range)
114114

115+
def add_row_range_with_prefix(self, row_key_prefix):
116+
"""Add row range to row_ranges list that start with the row_key_prefix from the row keys
117+
118+
For example:
119+
120+
.. literalinclude:: snippets_table.py
121+
:start-after: [START bigtable_add_row_range_with_prefix]
122+
:end-before: [END bigtable_add_row_range_with_prefix]
123+
124+
:type row_key_prefix: str
125+
:param row_key_prefix: To retrieve all rows that start with this row key prefix.
126+
Prefix cannot be zero length."""
127+
128+
end_key = row_key_prefix[:-1] + chr(ord(row_key_prefix[-1]) + 1)
129+
self.add_row_range_from_keys(
130+
row_key_prefix.encode("utf-8"), end_key.encode("utf-8")
131+
)
132+
115133
def _update_message_request(self, message):
116134
"""Add row keys and row range to given request message
117135

tests/system.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,38 @@ def test_yield_rows_with_row_set(self):
10831083
found_row_keys = [row.row_key for row in read_rows]
10841084
self.assertEqual(found_row_keys, expected_row_keys)
10851085

1086+
def test_add_row_range_by_prefix_from_keys(self):
1087+
row_keys = [
1088+
b"row_key_1",
1089+
b"row_key_2",
1090+
b"row_key_3",
1091+
b"row_key_4",
1092+
b"sample_row_key_1",
1093+
b"sample_row_key_2",
1094+
]
1095+
1096+
rows = []
1097+
for row_key in row_keys:
1098+
row = self._table.row(row_key)
1099+
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1)
1100+
rows.append(row)
1101+
self.rows_to_delete.append(row)
1102+
self._table.mutate_rows(rows)
1103+
1104+
row_set = RowSet()
1105+
row_set.add_row_range_with_prefix("row")
1106+
1107+
read_rows = self._table.yield_rows(row_set=row_set)
1108+
1109+
expected_row_keys = [
1110+
b"row_key_1",
1111+
b"row_key_2",
1112+
b"row_key_3",
1113+
b"row_key_4",
1114+
]
1115+
found_row_keys = [row.row_key for row in read_rows]
1116+
self.assertEqual(found_row_keys, expected_row_keys)
1117+
10861118
def test_read_large_cell_limit(self):
10871119
self._maybe_emulator_skip(
10881120
"Maximum gRPC received message size for emulator is 4194304 bytes."

tests/unit/test_row_set.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ def test_add_row_range_from_keys(self):
167167
)
168168
self.assertEqual(row_set.row_ranges[0].end_key, b"row_key9")
169169

170+
def test_add_row_range_with_prefix(self):
171+
row_set = self._make_one()
172+
row_set.add_row_range_with_prefix("row")
173+
self.assertEqual(row_set.row_ranges[0].end_key, b"rox")
174+
170175
def test__update_message_request(self):
171176
row_set = self._make_one()
172177
table_name = "table_name"

0 commit comments

Comments
 (0)