Skip to content

Commit c89c2f3

Browse files
authored
[HZ-5319] Asyncio Examples (hazelcast#768)
1 parent b34f9df commit c89c2f3

File tree

3 files changed

+224
-0
lines changed

3 files changed

+224
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import asyncio
2+
3+
from hazelcast.asyncio import HazelcastClient
4+
from hazelcast.serialization.api import (
5+
CompactSerializer,
6+
CompactWriter,
7+
CompactReader,
8+
)
9+
10+
11+
class Address:
12+
def __init__(self, city: str, street: str):
13+
self.city = city
14+
self.street = street
15+
16+
def __repr__(self):
17+
return f"Address(city='{self.city}', street='{self.street}')"
18+
19+
20+
class Employee:
21+
def __init__(self, name: str, age: int, address: Address):
22+
self.name = name
23+
self.age = age
24+
self.address = address
25+
26+
def __repr__(self):
27+
return f"Employee(name='{self.name}', age={self.age}, address={self.address})"
28+
29+
30+
class AddressSerializer(CompactSerializer[Address]):
31+
def read(self, reader: CompactReader):
32+
city = reader.read_string("city")
33+
street = reader.read_string("street")
34+
return Address(city, street)
35+
36+
def write(self, writer: CompactWriter, obj: Address):
37+
writer.write_string("city", obj.city)
38+
writer.write_string("street", obj.street)
39+
40+
def get_type_name(self):
41+
return "Address"
42+
43+
def get_class(self):
44+
return Address
45+
46+
47+
class EmployeeSerializer(CompactSerializer[Employee]):
48+
def read(self, reader: CompactReader):
49+
name = reader.read_string("name")
50+
age = reader.read_int32("age")
51+
address = reader.read_compact("address")
52+
return Employee(name, age, address)
53+
54+
def write(self, writer: CompactWriter, obj: Employee):
55+
writer.write_string("name", obj.name)
56+
writer.write_int32("age", obj.age)
57+
writer.write_compact("address", obj.address)
58+
59+
def get_type_name(self):
60+
return "Employee"
61+
62+
def get_class(self):
63+
return Employee
64+
65+
66+
async def amain():
67+
client = await HazelcastClient.create_and_start(
68+
compact_serializers=[AddressSerializer(), EmployeeSerializer()]
69+
)
70+
employees = await client.get_map("employees")
71+
await employees.set(
72+
0,
73+
Employee(
74+
name="John Doe",
75+
age=42,
76+
address=Address(
77+
city="Cambridge",
78+
street="3487 Cedar Lane",
79+
),
80+
),
81+
)
82+
employee = await employees.get(0)
83+
print(employee)
84+
await client.shutdown()
85+
86+
87+
if __name__ == "__main__":
88+
asyncio.run(amain())
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import asyncio
2+
3+
from hazelcast.asyncio import HazelcastClient
4+
5+
6+
async def amain():
7+
client = await HazelcastClient.create_and_start()
8+
my_map = await client.get_map("my-map")
9+
10+
# Fill the map
11+
await my_map.put("1", "Tokyo")
12+
await my_map.put("2", "Paris")
13+
await my_map.put("3", "Istanbul")
14+
15+
entry = await my_map.get("3")
16+
print("Entry with key 3:", entry)
17+
18+
map_size = await my_map.size()
19+
print("Map size:", map_size)
20+
21+
# Print the map
22+
print("\nIterating over the map: \n")
23+
24+
entries = await my_map.entry_set()
25+
for key, value in entries:
26+
print("%s -> %s" % (key, value))
27+
28+
await client.shutdown()
29+
30+
31+
if __name__ == "__main__":
32+
asyncio.run(amain())
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import asyncio
2+
import logging
3+
4+
from hazelcast.vector import Type, Vector, Metric, IndexConfig
5+
6+
logging.basicConfig(level=logging.DEBUG)
7+
8+
from hazelcast.asyncio import HazelcastClient
9+
from hazelcast.config import Config
10+
from hazelcast.proxy.vector_collection import Document
11+
12+
13+
async def amain():
14+
# Connect to the cluster
15+
cfg = Config()
16+
cfg.cluster_members = ["localhost:5701"]
17+
client = await HazelcastClient.create_and_start(cfg)
18+
19+
vc_name = "my-vector-collection"
20+
21+
# Create the VectorCollection
22+
indexes = [
23+
IndexConfig(name="default-vector", metric=Metric.COSINE, dimension=2),
24+
]
25+
await client.create_vector_collection_config(vc_name, indexes=indexes)
26+
27+
# Use the VectorCollection
28+
vc = await client.get_vector_collection(vc_name)
29+
doc1 = Document(
30+
"value1",
31+
[
32+
Vector("default-vector", Type.DENSE, [0.1, 0.5]),
33+
],
34+
)
35+
36+
# Add the Document
37+
key = "key-1"
38+
await vc.set(key, doc1)
39+
40+
# Add another Document
41+
doc2 = Document(
42+
"value2",
43+
[
44+
Vector("default-vector", Type.DENSE, [0.5, 0.7]),
45+
],
46+
)
47+
48+
# Add the Document
49+
key = "key-2"
50+
await vc.set(key, doc2)
51+
52+
# Optimize collection
53+
await vc.optimize()
54+
55+
# Search for a vector
56+
results = await vc.search_near_vector(
57+
Vector("default-vector", Type.DENSE, [0.2, 0.3]),
58+
limit=2,
59+
include_value=True,
60+
include_vectors=True,
61+
)
62+
for i, result in enumerate(results):
63+
print(
64+
f"{i+1}.",
65+
"Key:",
66+
result.key,
67+
"Value:",
68+
result.value,
69+
"Score:",
70+
result.score,
71+
"Vector:",
72+
result.vectors,
73+
)
74+
75+
print("size:", await vc.size())
76+
77+
# Delete all entries
78+
await vc.clear()
79+
print("cleared collection")
80+
print("size:", await vc.size())
81+
82+
# Search for a vector
83+
results = await vc.search_near_vector(
84+
Vector("default-vector", Type.DENSE, [0.2, 0.3]),
85+
limit=2,
86+
include_value=True,
87+
include_vectors=True,
88+
)
89+
for i, result in enumerate(results):
90+
print(
91+
f"{i+1}.",
92+
"Key:",
93+
result.key,
94+
"Value:",
95+
result.value,
96+
"Score:",
97+
result.score,
98+
"Vector:",
99+
result.vectors,
100+
)
101+
102+
103+
if __name__ == "__main__":
104+
asyncio.run(amain())

0 commit comments

Comments
 (0)