Skip to content

Commit 3f429f2

Browse files
authored
feat: Add ValueBitmask to the filter DSL (#16981)
1 parent c285d56 commit 3f429f2

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

packages/google-cloud-bigtable/google/cloud/bigtable/row_filters.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,39 @@ def to_pb(self):
429429
return data_v2_pb2.RowFilter(column_range_filter=column_range)
430430

431431

432+
class ValueBitmaskFilter(RowFilter):
433+
"""Row filter for a value bitmask.
434+
435+
Matches only cells with values that satisfy the condition
436+
``(value & mask) == mask``. The mask length must exactly match the value
437+
length, otherwise the cell is not considered a match.
438+
439+
:type mask: bytes or str
440+
:param mask: A bitmask to match against cells with values. String values
441+
will be encoded as ASCII.
442+
"""
443+
444+
def __init__(self, mask):
445+
self.mask = _to_bytes(mask)
446+
447+
def __eq__(self, other):
448+
if not isinstance(other, self.__class__):
449+
return NotImplemented
450+
return other.mask == self.mask
451+
452+
def __ne__(self, other):
453+
return not self == other
454+
455+
def to_pb(self):
456+
"""Converts the row filter to a protobuf.
457+
458+
:rtype: :class:`.data_v2_pb2.RowFilter`
459+
:returns: The converted current object.
460+
"""
461+
value_bitmask = data_v2_pb2.ValueBitmask(mask=self.mask)
462+
return data_v2_pb2.RowFilter(value_bitmask_filter=value_bitmask)
463+
464+
432465
class ValueRegexFilter(_RegexFilter):
433466
"""Row filter for a value regular expression.
434467

packages/google-cloud-bigtable/tests/unit/v2_client/test_row_filters.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,27 @@ def test_value_regex_filter_to_pb_w_str():
535535
assert pb_val == expected_pb
536536

537537

538+
def test_value_bitmask_filter_to_pb_w_bytes():
539+
from google.cloud.bigtable.row_filters import ValueBitmaskFilter
540+
541+
mask = b"value-mask"
542+
row_filter = ValueBitmaskFilter(mask)
543+
pb_val = row_filter.to_pb()
544+
expected_pb = _RowFilterPB(value_bitmask_filter=_ValueBitmaskPB(mask=mask))
545+
assert pb_val == expected_pb
546+
547+
548+
def test_value_bitmask_filter_to_pb_w_str():
549+
from google.cloud.bigtable.row_filters import ValueBitmaskFilter
550+
551+
mask = "value-mask"
552+
mask_bytes = mask.encode("ascii")
553+
row_filter = ValueBitmaskFilter(mask)
554+
pb_val = row_filter.to_pb()
555+
expected_pb = _RowFilterPB(value_bitmask_filter=_ValueBitmaskPB(mask=mask_bytes))
556+
assert pb_val == expected_pb
557+
558+
538559
def test_exact_value_filter_to_pb_w_bytes():
539560
from google.cloud.bigtable.row_filters import ExactValueFilter
540561

@@ -1173,3 +1194,9 @@ def _ValueRangePB(*args, **kw):
11731194
from google.cloud.bigtable_v2.types import data as data_v2_pb2
11741195

11751196
return data_v2_pb2.ValueRange(*args, **kw)
1197+
1198+
1199+
def _ValueBitmaskPB(*args, **kw):
1200+
from google.cloud.bigtable_v2.types import data as data_v2_pb2
1201+
1202+
return data_v2_pb2.ValueBitmask(*args, **kw)

0 commit comments

Comments
 (0)