Skip to content

Commit 06a48e8

Browse files
authored
map.remove_all implementation (#566)
map.remove_all is implemented
1 parent 7843a07 commit 06a48e8

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import hazelcast
2+
3+
from hazelcast.predicate import between
4+
5+
client = hazelcast.HazelcastClient()
6+
7+
predicate_map = client.get_map("predicate-map").blocking()
8+
9+
for i in range(10):
10+
predicate_map.put("key" + str(i), i)
11+
12+
predicate = between("this", 3, 5)
13+
14+
predicate_map.remove_all(predicate)
15+
16+
print(predicate_map.values())
17+
18+
client.shutdown()
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from hazelcast.protocol.client_message import OutboundMessage, REQUEST_HEADER_SIZE, create_initial_buffer
2+
from hazelcast.protocol.builtin import StringCodec
3+
from hazelcast.protocol.builtin import DataCodec
4+
5+
# hex: 0x013E00
6+
_REQUEST_MESSAGE_TYPE = 81408
7+
# hex: 0x013E01
8+
_RESPONSE_MESSAGE_TYPE = 81409
9+
10+
_REQUEST_INITIAL_FRAME_SIZE = REQUEST_HEADER_SIZE
11+
12+
13+
def encode_request(name, predicate):
14+
buf = create_initial_buffer(_REQUEST_INITIAL_FRAME_SIZE, _REQUEST_MESSAGE_TYPE)
15+
StringCodec.encode(buf, name)
16+
DataCodec.encode(buf, predicate, True)
17+
return OutboundMessage(buf, False)

hazelcast/proxy/map.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
map_put_transient_with_max_idle_codec,
7171
map_set_with_max_idle_codec,
7272
map_remove_interceptor_codec,
73+
map_remove_all_codec,
7374
)
7475
from hazelcast.proxy.base import (
7576
Proxy,
@@ -1283,6 +1284,28 @@ def remove(self, key: KeyType) -> Future[typing.Optional[ValueType]]:
12831284

12841285
return self._remove_internal(key_data)
12851286

1287+
def remove_all(self, predicate: Predicate) -> Future[None]:
1288+
"""Removes all entries which match with the supplied predicate
1289+
1290+
Args:
1291+
predicate: Used to select entries to be removed from map.
1292+
1293+
Returns:
1294+
None
1295+
"""
1296+
1297+
check_not_none(predicate, "predicate can't be None")
1298+
1299+
try:
1300+
predicate_data = self._to_data(predicate)
1301+
1302+
except SchemaNotReplicatedError as e:
1303+
return self._send_schema_and_retry(e, self.remove_all, predicate)
1304+
1305+
request = map_remove_all_codec.encode_request(self.name, predicate_data)
1306+
1307+
return self._invoke(request)
1308+
12861309
def remove_if_same(self, key: KeyType, value: ValueType) -> Future[bool]:
12871310
"""Removes the entry for a key only if it is currently mapped to a
12881311
given value.
@@ -2215,6 +2238,9 @@ def remove( # type: ignore[override]
22152238
) -> typing.Optional[ValueType]:
22162239
return self._wrapped.remove(key).result()
22172240

2241+
def remove_all(self, predicate: Predicate) -> None: # type: ignore[override]
2242+
return self._wrapped.remove_all(predicate).result()
2243+
22182244
def remove_if_same( # type: ignore[override]
22192245
self,
22202246
key: KeyType,

tests/integration/backward_compatible/proxy/map_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,15 @@ def test_remove(self):
495495
self.assertEqual(0, self.map.size())
496496
self.assertFalse(self.map.contains_key("key"))
497497

498+
def test_remove_all_with_none_predicate(self):
499+
with self.assertRaises(AssertionError):
500+
self.map.remove_all(None)
501+
502+
def test_remove_all(self):
503+
self.fill_map()
504+
self.map.remove_all(predicate=sql("__key > 'key-7'"))
505+
self.assertEqual(self.map.size(), 8)
506+
498507
def test_remove_if_same_when_same(self):
499508
self.map.put("key", "value")
500509

0 commit comments

Comments
 (0)