Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 30bec2d

Browse filesBrowse files
committed
Merge pull request #1291 from dhermes/bigtable-row-filter
Adding Bigtable RowFilter base class.
2 parents 1e2d80a + e3c046f commit 30bec2d
Copy full SHA for 30bec2d

File tree

Expand file treeCollapse file tree

4 files changed

+176
-33
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+176
-33
lines changed

‎gcloud/bigtable/column_family.py

Copy file name to clipboardExpand all lines: gcloud/bigtable/column_family.py
-8Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,6 @@ class GarbageCollectionRule(object):
6363
don't support that feature and instead support via native classes.
6464
"""
6565

66-
def to_pb(self):
67-
"""Converts the :class:`GarbageCollectionRule` to a protobuf.
68-
69-
:raises: :class:`NotImplementedError <exceptions.NotImplementedError>`
70-
always since a virtual class.
71-
"""
72-
raise NotImplementedError
73-
7466
def __ne__(self, other):
7567
return not self.__eq__(other)
7668

‎gcloud/bigtable/row.py

Copy file name to clipboardExpand all lines: gcloud/bigtable/row.py
+93Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717

1818
from gcloud._helpers import _to_bytes
19+
from gcloud.bigtable._generated import bigtable_data_pb2 as data_pb2
1920

2021

2122
class Row(object):
@@ -31,3 +32,95 @@ class Row(object):
3132
def __init__(self, row_key, table):
3233
self._row_key = _to_bytes(row_key)
3334
self._table = table
35+
36+
37+
class RowFilter(object):
38+
"""Basic filter to apply to cells in a row.
39+
40+
These values can be combined via :class:`RowFilterChain`,
41+
:class:`RowFilterUnion` and :class:`ConditionalRowFilter`.
42+
43+
.. note::
44+
45+
This class is a do-nothing base class for all row filters.
46+
"""
47+
48+
def __ne__(self, other):
49+
return not self.__eq__(other)
50+
51+
52+
class _RegexFilter(RowFilter):
53+
"""Row filter that uses a regular expression.
54+
55+
The ``regex`` must be valid RE2 patterns. See Google's
56+
`RE2 reference`_ for the accepted syntax.
57+
58+
.. _RE2 reference: https://github.com/google/re2/wiki/Syntax
59+
60+
:type regex: bytes or str
61+
:param regex: A regular expression (RE2) for some row filter.
62+
"""
63+
64+
def __init__(self, regex):
65+
self.regex = regex
66+
67+
def __eq__(self, other):
68+
if not isinstance(other, self.__class__):
69+
return False
70+
return other.regex == self.regex
71+
72+
73+
class RowKeyRegexFilter(_RegexFilter):
74+
"""Row filter for a row key regular expression.
75+
76+
The ``regex`` must be valid RE2 patterns. See Google's
77+
`RE2 reference`_ for the accepted syntax.
78+
79+
.. _RE2 reference: https://github.com/google/re2/wiki/Syntax
80+
81+
.. note::
82+
83+
Special care need be used with the expression used. Since
84+
each of these properties can contain arbitrary bytes, the ``\\C``
85+
escape sequence must be used if a true wildcard is desired. The ``.``
86+
character will not match the new line character ``\\n``, which may be
87+
present in a binary value.
88+
89+
:type regex: bytes
90+
:param regex: A regular expression (RE2) to match cells from rows with row
91+
keys that satisfy this regex. For a
92+
``CheckAndMutateRowRequest``, this filter is unnecessary
93+
since the row key is already specified.
94+
"""
95+
96+
def to_pb(self):
97+
"""Converts the row filter to a protobuf.
98+
99+
:rtype: :class:`.data_pb2.RowFilter`
100+
:returns: The converted current object.
101+
"""
102+
return data_pb2.RowFilter(row_key_regex_filter=self.regex)
103+
104+
105+
class FamilyNameRegexFilter(_RegexFilter):
106+
"""Row filter for a family name regular expression.
107+
108+
The ``regex`` must be valid RE2 patterns. See Google's
109+
`RE2 reference`_ for the accepted syntax.
110+
111+
.. _RE2 reference: https://github.com/google/re2/wiki/Syntax
112+
113+
:type regex: str
114+
:param regex: A regular expression (RE2) to match cells from columns in a
115+
given column family. For technical reasons, the regex must
116+
not contain the ``':'`` character, even if it is not being
117+
used as a literal.
118+
"""
119+
120+
def to_pb(self):
121+
"""Converts the row filter to a protobuf.
122+
123+
:rtype: :class:`.data_pb2.RowFilter`
124+
:returns: The converted current object.
125+
"""
126+
return data_pb2.RowFilter(family_name_regex_filter=self.regex)

‎gcloud/bigtable/test_column_family.py

Copy file name to clipboardExpand all lines: gcloud/bigtable/test_column_family.py
+11-25Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,6 @@ def test_with_negative_seconds(self):
6161
self.assertEqual(result.nanos, -(10**9 - 1000 * microseconds))
6262

6363

64-
class TestGarbageCollectionRule(unittest2.TestCase):
65-
66-
def _getTargetClass(self):
67-
from gcloud.bigtable.column_family import GarbageCollectionRule
68-
return GarbageCollectionRule
69-
70-
def _makeOne(self, *args, **kwargs):
71-
return self._getTargetClass()(*args, **kwargs)
72-
73-
def test_to_pb_virtual(self):
74-
gc_rule = self._makeOne()
75-
self.assertRaises(NotImplementedError, gc_rule.to_pb)
76-
77-
7864
class TestMaxVersionsGCRule(unittest2.TestCase):
7965

8066
def _getTargetClass(self):
@@ -84,16 +70,16 @@ def _getTargetClass(self):
8470
def _makeOne(self, *args, **kwargs):
8571
return self._getTargetClass()(*args, **kwargs)
8672

87-
def test___eq__max_num_versions(self):
88-
gc_rule1 = self._makeOne(2)
89-
gc_rule2 = self._makeOne(2)
90-
self.assertEqual(gc_rule1, gc_rule2)
91-
9273
def test___eq__type_differ(self):
9374
gc_rule1 = self._makeOne(10)
9475
gc_rule2 = object()
9576
self.assertNotEqual(gc_rule1, gc_rule2)
9677

78+
def test___eq__same_value(self):
79+
gc_rule1 = self._makeOne(2)
80+
gc_rule2 = self._makeOne(2)
81+
self.assertEqual(gc_rule1, gc_rule2)
82+
9783
def test___ne__same_value(self):
9884
gc_rule1 = self._makeOne(99)
9985
gc_rule2 = self._makeOne(99)
@@ -119,18 +105,18 @@ def _getTargetClass(self):
119105
def _makeOne(self, *args, **kwargs):
120106
return self._getTargetClass()(*args, **kwargs)
121107

122-
def test___eq__max_age(self):
123-
max_age = object()
124-
gc_rule1 = self._makeOne(max_age=max_age)
125-
gc_rule2 = self._makeOne(max_age=max_age)
126-
self.assertEqual(gc_rule1, gc_rule2)
127-
128108
def test___eq__type_differ(self):
129109
max_age = object()
130110
gc_rule1 = self._makeOne(max_age=max_age)
131111
gc_rule2 = object()
132112
self.assertNotEqual(gc_rule1, gc_rule2)
133113

114+
def test___eq__same_value(self):
115+
max_age = object()
116+
gc_rule1 = self._makeOne(max_age=max_age)
117+
gc_rule2 = self._makeOne(max_age=max_age)
118+
self.assertEqual(gc_rule1, gc_rule2)
119+
134120
def test___ne__same_value(self):
135121
max_age = object()
136122
gc_rule1 = self._makeOne(max_age=max_age)

‎gcloud/bigtable/test_row.py

Copy file name to clipboardExpand all lines: gcloud/bigtable/test_row.py
+72Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,75 @@ def test_constructor_with_non_bytes(self):
4646
row_key = object()
4747
with self.assertRaises(TypeError):
4848
self._makeOne(row_key, None)
49+
50+
51+
class Test_RegexFilter(unittest2.TestCase):
52+
53+
def _getTargetClass(self):
54+
from gcloud.bigtable.row import _RegexFilter
55+
return _RegexFilter
56+
57+
def _makeOne(self, *args, **kwargs):
58+
return self._getTargetClass()(*args, **kwargs)
59+
60+
def test_constructor(self):
61+
regex = object()
62+
row_filter = self._makeOne(regex)
63+
self.assertTrue(row_filter.regex is regex)
64+
65+
def test___eq__type_differ(self):
66+
regex = object()
67+
row_filter1 = self._makeOne(regex=regex)
68+
row_filter2 = object()
69+
self.assertNotEqual(row_filter1, row_filter2)
70+
71+
def test___eq__same_value(self):
72+
regex = object()
73+
row_filter1 = self._makeOne(regex=regex)
74+
row_filter2 = self._makeOne(regex=regex)
75+
self.assertEqual(row_filter1, row_filter2)
76+
77+
def test___ne__same_value(self):
78+
regex = object()
79+
row_filter1 = self._makeOne(regex=regex)
80+
row_filter2 = self._makeOne(regex=regex)
81+
comparison_val = (row_filter1 != row_filter2)
82+
self.assertFalse(comparison_val)
83+
84+
85+
class TestRowKeyRegexFilter(unittest2.TestCase):
86+
87+
def _getTargetClass(self):
88+
from gcloud.bigtable.row import RowKeyRegexFilter
89+
return RowKeyRegexFilter
90+
91+
def _makeOne(self, *args, **kwargs):
92+
return self._getTargetClass()(*args, **kwargs)
93+
94+
def test_to_pb(self):
95+
from gcloud.bigtable._generated import bigtable_data_pb2 as data_pb2
96+
97+
regex = b'row-key-regex'
98+
row_filter = self._makeOne(regex)
99+
pb_val = row_filter.to_pb()
100+
expected_pb = data_pb2.RowFilter(row_key_regex_filter=regex)
101+
self.assertEqual(pb_val, expected_pb)
102+
103+
104+
class TestFamilyNameRegexFilter(unittest2.TestCase):
105+
106+
def _getTargetClass(self):
107+
from gcloud.bigtable.row import FamilyNameRegexFilter
108+
return FamilyNameRegexFilter
109+
110+
def _makeOne(self, *args, **kwargs):
111+
return self._getTargetClass()(*args, **kwargs)
112+
113+
def test_to_pb(self):
114+
from gcloud.bigtable._generated import bigtable_data_pb2 as data_pb2
115+
116+
regex = u'family-regex'
117+
row_filter = self._makeOne(regex)
118+
pb_val = row_filter.to_pb()
119+
expected_pb = data_pb2.RowFilter(family_name_regex_filter=regex)
120+
self.assertEqual(pb_val, expected_pb)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.