Skip to content

Commit ebaf1a5

Browse files
authored
Fix PagingPredicate#reset and its tests (#234)
`list.clear()` is not available on Python2.7. We have missed that since `reset()` method is not tested. According to the standard library documentation, `list.clear()` is equivalent to `del list[:]`, so I replaced it with that. Also, added some missing tests and replaced `six.assertCountEquals` with `assertEquals` to check ordering of elements along with equality.
1 parent 931e077 commit ebaf1a5

File tree

2 files changed

+106
-83
lines changed

2 files changed

+106
-83
lines changed

hazelcast/serialization/predicate.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def set_anchor(self, nearest_page, anchor):
277277

278278
def reset(self):
279279
self.iteration_type = ITERATION_TYPE.ENTRY
280-
self.anchor_list.clear()
280+
del self.anchor_list[:]
281281
self.page = 0
282282

283283
def get_nearest_anchor_entry(self):
@@ -337,6 +337,7 @@ def comparator(self):
337337
is_not = NotPredicate
338338
false = FalsePredicate
339339
true = TruePredicate
340+
paging = PagingPredicate
340341

341342

342343
def is_greater_than(attribute, x):
@@ -354,7 +355,3 @@ def is_less_than(attribute, x):
354355
def is_less_than_or_equal_to(attribute, x):
355356
return GreaterLessPredicate(attribute, x, True, True)
356357

357-
358-
def paging_predicate(predicate, page_size):
359-
return PagingPredicate(predicate, page_size)
360-

tests/proxy/map_paging_predicate_test.py

Lines changed: 104 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33

44
from tests.base import HazelcastTestCase
55
from tests.util import configure_logging, get_abs_path, random_string
6-
from hazelcast.serialization.predicate import PagingPredicate, is_greater_than_or_equal_to, is_less_than_or_equal_to, \
7-
is_ilike
6+
from hazelcast.serialization.predicate import paging, is_greater_than_or_equal_to, is_less_than_or_equal_to, \
7+
is_ilike, true
88
from hazelcast.serialization.api import IdentifiedDataSerializable
99
from hazelcast import HazelcastClient
10-
from hazelcast.six import assertCountEqual
1110
from hazelcast.util import ITERATION_TYPE
1211
from hazelcast.core import Comparator
1312

@@ -39,24 +38,42 @@ def tearDownClass(cls):
3938
cls.client.shutdown()
4039
cls.rc.exit()
4140

41+
def test_with_inner_paging_predicate(self):
42+
predicate = paging(true(), 1)
43+
44+
with self.assertRaises(TypeError):
45+
paging(predicate, 1)
46+
47+
def test_with_non_positive_page_size(self):
48+
with self.assertRaises(ValueError):
49+
paging(true(), 0)
50+
51+
with self.assertRaises(ValueError):
52+
paging(true(), -1)
53+
54+
def test_previous_page_when_index_is_zero(self):
55+
predicate = paging(true(), 2)
56+
self.assertEqual(0, predicate.previous_page())
57+
self.assertEqual(0, predicate.previous_page())
58+
4259
"""
4360
Tests for proxy: comparator None
4461
"""
4562
def test_entry_set_with_paging_predicate(self):
4663
self._fill_map_simple()
47-
entry_set = self.map.entry_set(PagingPredicate(is_greater_than_or_equal_to('this', 3), 1))
64+
entry_set = self.map.entry_set(paging(is_greater_than_or_equal_to('this', 3), 1))
4865
self.assertEqual(len(entry_set), 1)
49-
assertCountEqual(self, entry_set[0], ['key-3', 3])
66+
self.assertEqual(entry_set[0], ('key-3', 3))
5067

5168
def test_key_set_with_paging_predicate(self):
5269
self._fill_map_simple()
53-
key_set = self.map.key_set(PagingPredicate(is_greater_than_or_equal_to('this', 3), 1))
70+
key_set = self.map.key_set(paging(is_greater_than_or_equal_to('this', 3), 1))
5471
self.assertEqual(len(key_set), 1)
5572
self.assertEqual(key_set[0], 'key-3')
5673

5774
def test_values_with_paging_predicate(self):
5875
self._fill_map_simple()
59-
values = self.map.values(PagingPredicate(is_greater_than_or_equal_to('this', 3), 1))
76+
values = self.map.values(paging(is_greater_than_or_equal_to('this', 3), 1))
6077
self.assertEqual(len(values), 1)
6178
self.assertEqual(values[0], 3)
6279

@@ -65,86 +82,95 @@ def test_values_with_paging_predicate(self):
6582
"""
6683
def test_first_page(self):
6784
self._fill_map_numeric()
68-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
69-
assertCountEqual(self, self.map.values(paging), [40, 41])
85+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
86+
self.assertEqual(self.map.values(predicate), [40, 41])
7087

7188
def test_next_page(self):
7289
self._fill_map_numeric()
73-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
74-
paging.next_page()
75-
assertCountEqual(self, self.map.values(paging), [42, 43])
90+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
91+
predicate.next_page()
92+
self.assertEqual(self.map.values(predicate), [42, 43])
7693

7794
def test_set_page(self):
7895
self._fill_map_numeric()
79-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
80-
paging.page = 4
81-
assertCountEqual(self, self.map.values(paging), [48, 49])
96+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
97+
predicate.page = 4
98+
self.assertEqual(self.map.values(predicate), [48, 49])
8299

83100
def test_get_page(self):
84-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
85-
paging.page = 4
86-
self.assertEqual(paging.page, 4)
101+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
102+
predicate.page = 4
103+
self.assertEqual(predicate.page, 4)
87104

88105
def test_page_size(self):
89-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
90-
self.assertEqual(paging.page_size, 2)
106+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
107+
self.assertEqual(predicate.page_size, 2)
91108

92109
def test_previous_page(self):
93110
self._fill_map_numeric()
94-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
95-
paging.page = 4
96-
paging.previous_page()
97-
assertCountEqual(self, self.map.values(paging), [46, 47])
111+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
112+
predicate.page = 4
113+
predicate.previous_page()
114+
self.assertEqual(self.map.values(predicate), [46, 47])
98115

99116
def test_get_4th_then_previous_page(self):
100117
self._fill_map_numeric()
101-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
102-
paging.page = 4
103-
self.map.values(paging)
104-
paging.previous_page()
105-
assertCountEqual(self, self.map.values(paging), [46, 47])
118+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
119+
predicate.page = 4
120+
self.map.values(predicate)
121+
predicate.previous_page()
122+
self.assertEqual(self.map.values(predicate), [46, 47])
106123

107124
def test_get_3rd_then_next_page(self):
108125
self._fill_map_numeric()
109-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
110-
paging.page = 3
111-
self.map.values(paging)
112-
paging.next_page()
113-
assertCountEqual(self, self.map.values(paging), [48, 49])
126+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
127+
predicate.page = 3
128+
self.map.values(predicate)
129+
predicate.next_page()
130+
self.assertEqual(self.map.values(predicate), [48, 49])
114131

115132
def test_set_nonexistent_page(self):
116133
# Trying to get page 10, which is out of range, should return empty list.
117134
self._fill_map_numeric()
118-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
119-
paging.page = 10
120-
assertCountEqual(self, self.map.values(paging), [])
135+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
136+
predicate.page = 10
137+
self.assertEqual(self.map.values(predicate), [])
121138

122139
def test_nonexistent_previous_page(self):
123140
# Trying to get previous page while already at first page should return first page.
124141
self._fill_map_numeric()
125-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
126-
paging.previous_page()
127-
assertCountEqual(self, self.map.values(paging), [40, 41])
142+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
143+
predicate.previous_page()
144+
self.assertEqual(self.map.values(predicate), [40, 41])
128145

129146
def test_nonexistent_next_page(self):
130147
# Trying to get next page while already at last page should return empty list.
131148
self._fill_map_numeric()
132-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 40), 2)
133-
paging.page = 4
134-
paging.next_page()
135-
assertCountEqual(self, self.map.values(paging), [])
149+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
150+
predicate.page = 4
151+
predicate.next_page()
152+
self.assertEqual(self.map.values(predicate), [])
136153

137154
def test_get_half_full_last_page(self):
138155
# Page size set to 2, but last page only has 1 element.
139156
self._fill_map_numeric()
140-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 41), 2)
141-
paging.page = 4
142-
assertCountEqual(self, self.map.values(paging), [49])
157+
predicate = paging(is_greater_than_or_equal_to('this', 41), 2)
158+
predicate.page = 4
159+
self.assertEqual(self.map.values(predicate), [49])
160+
161+
def test_reset(self):
162+
self._fill_map_numeric()
163+
predicate = paging(is_greater_than_or_equal_to('this', 40), 2)
164+
self.assertEqual(self.map.values(predicate), [40, 41])
165+
predicate.next_page()
166+
self.assertEqual(self.map.values(predicate), [42, 43])
167+
predicate.reset()
168+
self.assertEqual(self.map.values(predicate), [40, 41])
143169

144170
def test_empty_map(self):
145171
# Empty map should return empty list.
146-
paging = PagingPredicate(is_greater_than_or_equal_to('this', 30), 2)
147-
assertCountEqual(self, self.map.values(paging), [])
172+
predicate = paging(is_greater_than_or_equal_to('this', 30), 2)
173+
self.assertEqual(self.map.values(predicate), [])
148174

149175
@unittest.skip('Paging predicate with duplicate values will be supported in Hazelcast 4.0')
150176
def test_equal_values_paging(self):
@@ -154,56 +180,56 @@ def test_equal_values_paging(self):
154180
for i in range(50, 100):
155181
self.map.put(i, i - 50)
156182

157-
paging = PagingPredicate(is_less_than_or_equal_to('this', 8), 5)
183+
predicate = paging(is_less_than_or_equal_to('this', 8), 5)
158184

159-
assertCountEqual(self, self.map.values(paging), [0, 0, 1, 1, 2])
160-
paging.next_page()
161-
assertCountEqual(self, self.map.values(paging), [2, 3, 3, 4, 4])
162-
paging.next_page()
163-
assertCountEqual(self, self.map.values(paging), [5, 5, 6, 6, 7])
164-
paging.next_page()
165-
assertCountEqual(self, self.map.values(paging), [7, 8, 8])
185+
self.assertEqual(self.map.values(predicate), [0, 0, 1, 1, 2])
186+
predicate.next_page()
187+
self.assertEqual(self.map.values(predicate), [2, 3, 3, 4, 4])
188+
predicate.next_page()
189+
self.assertEqual(self.map.values(predicate), [5, 5, 6, 6, 7])
190+
predicate.next_page()
191+
self.assertEqual(self.map.values(predicate), [7, 8, 8])
166192

167193
"""
168194
Test for paging predicate with custom comparator
169195
"""
170196
def test_key_set_paging_with_custom_comparator(self):
171197
self._fill_map_custom_comp()
172198
custom_cmp = CustomComparator(type=1, iteration_type=ITERATION_TYPE.KEY)
173-
paging = PagingPredicate(is_ilike('__key', 'key-%'), 6, custom_cmp)
199+
predicate = paging(is_ilike('__key', 'key-%'), 6, custom_cmp)
174200

175-
key_set_page_1 = self.map.key_set(paging)
176-
paging.next_page()
177-
key_set_page_2 = self.map.key_set(paging)
178-
paging.next_page()
179-
key_set_page_3 = self.map.key_set(paging)
201+
key_set_page_1 = self.map.key_set(predicate)
202+
predicate.next_page()
203+
key_set_page_2 = self.map.key_set(predicate)
204+
predicate.next_page()
205+
key_set_page_3 = self.map.key_set(predicate)
180206

181-
assertCountEqual(self, key_set_page_1, ['key-9', 'key-8', 'key-7', 'key-6', 'key-5', 'key-4'])
182-
assertCountEqual(self, key_set_page_2, ['key-3', 'key-2', 'key-1', 'key-0'])
183-
assertCountEqual(self, key_set_page_3, [])
207+
self.assertEqual(key_set_page_1, ['key-9', 'key-8', 'key-7', 'key-6', 'key-5', 'key-4'])
208+
self.assertEqual(key_set_page_2, ['key-3', 'key-2', 'key-1', 'key-0'])
209+
self.assertEqual(key_set_page_3, [])
184210

185211
def test_values_paging_with_custom_comparator(self):
186212
self._fill_map_custom_comp_2()
187213
custom_cmp = CustomComparator(type=2, iteration_type=ITERATION_TYPE.VALUE)
188-
paging = PagingPredicate(None, 6, custom_cmp)
214+
predicate = paging(None, 6, custom_cmp)
189215

190-
values_page_1 = self.map.values(paging)
191-
paging.next_page()
192-
values_page_2 = self.map.values(paging)
193-
paging.next_page()
194-
values_page_3 = self.map.values(paging)
216+
values_page_1 = self.map.values(predicate)
217+
predicate.next_page()
218+
values_page_2 = self.map.values(predicate)
219+
predicate.next_page()
220+
values_page_3 = self.map.values(predicate)
195221

196-
assertCountEqual(self, values_page_1, ['A', 'BB', 'CCC', 'DDDD', 'EEEEE', 'FFFFFF'])
197-
assertCountEqual(self, values_page_2, ['GGGGGGG', 'HHHHHHHH', 'IIIIIIIII', 'JJJJJJJJJJ'])
198-
assertCountEqual(self, values_page_3, [])
222+
self.assertEqual(values_page_1, ['A', 'BB', 'CCC', 'DDDD', 'EEEEE', 'FFFFFF'])
223+
self.assertEqual(values_page_2, ['GGGGGGG', 'HHHHHHHH', 'IIIIIIIII', 'JJJJJJJJJJ'])
224+
self.assertEqual(values_page_3, [])
199225

200226
def test_entry_set_paging_with_custom_comparator(self):
201227
self._fill_map_custom_comp_2()
202228
custom_cmp = CustomComparator(type=2, iteration_type=ITERATION_TYPE.ENTRY)
203-
paging = PagingPredicate(None, 2, custom_cmp)
204-
page1 = self.map.entry_set(paging)
229+
predicate = paging(None, 2, custom_cmp)
230+
page1 = self.map.entry_set(predicate)
205231

206-
assertCountEqual(self, page1, [('key-65', 'A'), ('key-66', 'BB')])
232+
self.assertEqual(page1, [('key-65', 'A'), ('key-66', 'BB')])
207233

208234
def _fill_map_simple(self):
209235
self.map.put_all({

0 commit comments

Comments
 (0)