Skip to content

Commit 59513b7

Browse files
sumit-qltseaver
authored andcommitted
Bigtable: Add '{RowSet,RowRange}.{__eq__,.__ne__}' (#6025)
1 parent faa3722 commit 59513b7

File tree

2 files changed

+206
-0
lines changed

2 files changed

+206
-0
lines changed

google/cloud/bigtable/row_set.py

+47
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,27 @@ def __init__(self):
2929
self.row_keys = []
3030
self.row_ranges = []
3131

32+
def __eq__(self, other):
33+
if not isinstance(other, self.__class__):
34+
return NotImplemented
35+
36+
if len(other.row_keys) != len(self.row_keys):
37+
return False
38+
39+
if len(other.row_ranges) != len(self.row_ranges):
40+
return False
41+
42+
if not set(other.row_keys) == set(self.row_keys):
43+
return False
44+
45+
if not set(other.row_ranges) == set(self.row_ranges):
46+
return False
47+
48+
return True
49+
50+
def __ne__(self, other):
51+
return not self == other
52+
3253
def add_row_key(self, row_key):
3354
"""Add row key to row_keys list.
3455
@@ -112,6 +133,32 @@ def __init__(self, start_key=None, end_key=None,
112133
self.end_key = end_key
113134
self.end_inclusive = end_inclusive
114135

136+
def _key(self):
137+
"""A tuple key that uniquely describes this field.
138+
139+
Used to compute this instance's hashcode and evaluate equality.
140+
141+
Returns:
142+
Tuple[str]: The contents of this :class:`.RowRange`.
143+
"""
144+
return (
145+
self.start_key,
146+
self.start_inclusive,
147+
self.end_key,
148+
self.end_inclusive,
149+
)
150+
151+
def __hash__(self):
152+
return hash(self._key())
153+
154+
def __eq__(self, other):
155+
if not isinstance(other, self.__class__):
156+
return NotImplemented
157+
return self._key() == other._key()
158+
159+
def __ne__(self, other):
160+
return not self == other
161+
115162
def get_range_kwargs(self):
116163
""" Convert row range object to dict which can be passed to
117164
google.bigtable.v2.RowRange add method.

tests/unit/test_row_set.py

+159
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,115 @@ def test_constructor(self):
3232
self.assertEqual([], row_set.row_keys)
3333
self.assertEqual([], row_set.row_ranges)
3434

35+
def test__eq__(self):
36+
row_key1 = b"row_key1"
37+
row_key2 = b"row_key1"
38+
row_range1 = RowRange(b"row_key4", b"row_key9")
39+
row_range2 = RowRange(b"row_key4", b"row_key9")
40+
41+
row_set1 = self._make_one()
42+
row_set2 = self._make_one()
43+
44+
row_set1.add_row_key(row_key1)
45+
row_set2.add_row_key(row_key2)
46+
row_set1.add_row_range(row_range1)
47+
row_set2.add_row_range(row_range2)
48+
49+
self.assertEqual(row_set1, row_set2)
50+
51+
def test__eq__type_differ(self):
52+
row_set1 = self._make_one()
53+
row_set2 = object()
54+
self.assertNotEqual(row_set1, row_set2)
55+
56+
def test__eq__len_row_keys_differ(self):
57+
row_key1 = b"row_key1"
58+
row_key2 = b"row_key1"
59+
60+
row_set1 = self._make_one()
61+
row_set2 = self._make_one()
62+
63+
row_set1.add_row_key(row_key1)
64+
row_set1.add_row_key(row_key2)
65+
row_set2.add_row_key(row_key2)
66+
67+
self.assertNotEqual(row_set1, row_set2)
68+
69+
def test__eq__len_row_ranges_differ(self):
70+
row_range1 = RowRange(b"row_key4", b"row_key9")
71+
row_range2 = RowRange(b"row_key4", b"row_key9")
72+
73+
row_set1 = self._make_one()
74+
row_set2 = self._make_one()
75+
76+
row_set1.add_row_range(row_range1)
77+
row_set1.add_row_range(row_range2)
78+
row_set2.add_row_range(row_range2)
79+
80+
self.assertNotEqual(row_set1, row_set2)
81+
82+
def test__eq__row_keys_differ(self):
83+
row_set1 = self._make_one()
84+
row_set2 = self._make_one()
85+
86+
row_set1.add_row_key(b"row_key1")
87+
row_set1.add_row_key(b"row_key2")
88+
row_set1.add_row_key(b"row_key3")
89+
row_set2.add_row_key(b"row_key1")
90+
row_set2.add_row_key(b"row_key2")
91+
row_set2.add_row_key(b"row_key4")
92+
93+
self.assertNotEqual(row_set1, row_set2)
94+
95+
def test__eq__row_ranges_differ(self):
96+
row_range1 = RowRange(b"row_key4", b"row_key9")
97+
row_range2 = RowRange(b"row_key14", b"row_key19")
98+
row_range3 = RowRange(b"row_key24", b"row_key29")
99+
100+
row_set1 = self._make_one()
101+
row_set2 = self._make_one()
102+
103+
row_set1.add_row_range(row_range1)
104+
row_set1.add_row_range(row_range2)
105+
row_set1.add_row_range(row_range3)
106+
row_set2.add_row_range(row_range1)
107+
row_set2.add_row_range(row_range2)
108+
109+
self.assertNotEqual(row_set1, row_set2)
110+
111+
def test__ne__(self):
112+
row_key1 = b"row_key1"
113+
row_key2 = b"row_key1"
114+
row_range1 = RowRange(b"row_key4", b"row_key9")
115+
row_range2 = RowRange(b"row_key5", b"row_key9")
116+
117+
row_set1 = self._make_one()
118+
row_set2 = self._make_one()
119+
120+
row_set1.add_row_key(row_key1)
121+
row_set2.add_row_key(row_key2)
122+
row_set1.add_row_range(row_range1)
123+
row_set2.add_row_range(row_range2)
124+
125+
self.assertNotEqual(row_set1, row_set2)
126+
127+
def test__ne__same_value(self):
128+
row_key1 = b"row_key1"
129+
row_key2 = b"row_key1"
130+
row_range1 = RowRange(b"row_key4", b"row_key9")
131+
row_range2 = RowRange(b"row_key4", b"row_key9")
132+
133+
row_set1 = self._make_one()
134+
row_set2 = self._make_one()
135+
136+
row_set1.add_row_key(row_key1)
137+
row_set2.add_row_key(row_key2)
138+
row_set1.add_row_range(row_range1)
139+
row_set2.add_row_range(row_range2)
140+
141+
comparison_val = (row_set1 != row_set2)
142+
self.assertFalse(comparison_val)
143+
35144
def test_add_row_key(self):
36145
row_set = self._make_one()
37146
row_set.add_row_key("row_key1")
@@ -92,6 +201,56 @@ def test_constructor(self):
92201
self.assertTrue(row_range.start_inclusive)
93202
self.assertFalse(row_range.end_inclusive)
94203

204+
def test___hash__set_equality(self):
205+
row_range1 = self._make_one('row_key1', 'row_key9')
206+
row_range2 = self._make_one('row_key1', 'row_key9')
207+
set_one = {row_range1, row_range2}
208+
set_two = {row_range1, row_range2}
209+
self.assertEqual(set_one, set_two)
210+
211+
def test___hash__not_equals(self):
212+
row_range1 = self._make_one('row_key1', 'row_key9')
213+
row_range2 = self._make_one('row_key1', 'row_key19')
214+
set_one = {row_range1}
215+
set_two = {row_range2}
216+
self.assertNotEqual(set_one, set_two)
217+
218+
def test__eq__(self):
219+
start_key = b"row_key1"
220+
end_key = b"row_key9"
221+
row_range1 = self._make_one(start_key, end_key,
222+
True, False)
223+
row_range2 = self._make_one(start_key, end_key,
224+
True, False)
225+
self.assertEqual(row_range1, row_range2)
226+
227+
def test___eq__type_differ(self):
228+
start_key = b"row_key1"
229+
end_key = b"row_key9"
230+
row_range1 = self._make_one(start_key, end_key,
231+
True, False)
232+
row_range2 = object()
233+
self.assertNotEqual(row_range1, row_range2)
234+
235+
def test__ne__(self):
236+
start_key = b"row_key1"
237+
end_key = b"row_key9"
238+
row_range1 = self._make_one(start_key, end_key,
239+
True, False)
240+
row_range2 = self._make_one(start_key, end_key,
241+
False, True)
242+
self.assertNotEqual(row_range1, row_range2)
243+
244+
def test__ne__same_value(self):
245+
start_key = b"row_key1"
246+
end_key = b"row_key9"
247+
row_range1 = self._make_one(start_key, end_key,
248+
True, False)
249+
row_range2 = self._make_one(start_key, end_key,
250+
True, False)
251+
comparison_val = (row_range1 != row_range2)
252+
self.assertFalse(comparison_val)
253+
95254
def test_get_range_kwargs_closed_open(self):
96255
start_key = b"row_key1"
97256
end_key = b"row_key9"

0 commit comments

Comments
 (0)