Skip to content

Commit 70a6c2d

Browse files
committed
Refactor: Make protocol dep internal
- extract base class needed by clients. - Add ai_response, ai_query - Update tests and Readme
1 parent c148353 commit 70a6c2d

File tree

12 files changed

+1008
-172
lines changed

12 files changed

+1008
-172
lines changed

sdk/ahnlich-client-py/README.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ The following topics are covered:
3131
* [Delete Key](#delete-key)
3232
* [Delete Predicate](#delete-predicate)
3333
* [Bulk Requests](#bulk-requests)
34-
* [Protocol As Context Manager](#protocol-as-context-manager)
34+
* [Client As Context Manager](#client-as-context-manager)
3535
* [How to Deploy to Artifactory](#deploy-to-artifactory)
3636
* [Type Meanings](#type-meanings)
3737
* [Change Log](#change-log)
@@ -335,20 +335,17 @@ response: server_response.ServerResult = client.exec()
335335

336336

337337

338-
## Protocol As Context Manager
338+
## Client As Context Manager
339339

340-
The protocol class can be used as a context manager hereby closing the connection pool automatically upon context end.
340+
The DB client class can be used as a context manager hereby closing the connection pool automatically upon context end.
341341

342342

343343
```py
344344
from ahnlich_client_py import AhnlichDBClient
345-
from ahnlich_client_py import AhnlichProtocol
346345

347-
connection_protocol = AhnlichProtocol(address="127.0.0.1", port=1369)
348346

349-
with pro as protocol:
350-
client = AhnlichDBClient(connection_protocol=connection_protocol)
351-
response: server_response.ServerResult = client.ping()
347+
with client.AhnlichDBClient(address="127.0.0.1", port=port) as db_client:
348+
response: server_response.ServerResult = db_client.ping()
352349

353350
```
354351
However, closing the connection pool can be done by calling `cleanup()` on the client.
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from ahnlich_client_py import builders, libs
22
from ahnlich_client_py.client import AhnlichDBClient
33
from ahnlich_client_py.config import AhnlichDBPoolSettings
4-
from ahnlich_client_py.internals import db_query, db_response
5-
from ahnlich_client_py.protocol import AhnlichProtocol
4+
from ahnlich_client_py.internals import db_query, db_response, ai_query, ai_response

sdk/ahnlich-client-py/ahnlich_client_py/builders/db.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from ahnlich_client_py import exceptions as ah_exceptions
66
from ahnlich_client_py.internals import db_query
77
from ahnlich_client_py.internals import serde_types as st
8-
from ahnlich_client_py.protocol import AhnlichProtocol
98

109

1110
class NonZeroSizeInteger:
@@ -142,7 +141,3 @@ def to_server_query(self) -> db_query.ServerQuery:
142141
server_query = db_query.ServerQuery(queries=queries)
143142
self.drop()
144143
return server_query
145-
146-
def execute_requests(self, protocol: AhnlichProtocol):
147-
response = protocol.process_request(message=self.to_server_query())
148-
return response
Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,47 @@
11
import typing
22

3-
from ahnlich_client_py import builders, protocol
4-
from ahnlich_client_py.exceptions import AhnlichClientException
3+
from ahnlich_client_py import builders
4+
from ahnlich_client_py.config import AhnlichDBPoolSettings
55
from ahnlich_client_py.internals import db_query, db_response
66
from ahnlich_client_py.internals import serde_types as st
7+
from ahnlich_client_py.internals.base_client import BaseClient
78

89

9-
class AhnlichDBClient:
10-
"""Wrapper for interacting with Ahnlich database or ai"""
10+
class AhnlichDBClient(BaseClient):
11+
"""Wrapper for interacting with Ahnlich database"""
1112

1213
def __init__(
1314
self,
14-
address: str = None,
15-
port: int = None,
16-
timeout_sec: float = 5.0,
17-
connection_protocol: protocol.AhnlichProtocol = None,
15+
address: str,
16+
port: int,
17+
connect_timeout_sec: float = 5.0,
18+
pool_settings: AhnlichDBPoolSettings = AhnlichDBPoolSettings(),
1819
) -> None:
19-
if not connection_protocol and (address is None or port is None):
20-
raise AhnlichClientException(
21-
"Either connection protocol or address and port must be provided"
22-
)
23-
self.protocol = connection_protocol or protocol.AhnlichProtocol(
24-
address=address, port=port, timeout_sec=timeout_sec
20+
21+
super().__init__(
22+
address=address,
23+
port=port,
24+
connect_timeout_sec=connect_timeout_sec,
25+
pool_settings=pool_settings,
2526
)
27+
2628
self.builder = builders.AhnlichDBRequestBuilder()
2729

28-
def __del__(self):
29-
self.cleanup()
30+
def get_response_class(self):
31+
return db_response.ServerResult
3032

3133
def get_key(
3234
self, store_name: str, keys: typing.Sequence[db_query.Array]
3335
) -> db_response.ServerResult:
3436

3537
self.builder.get_key(store_name=store_name, keys=keys)
36-
return self.protocol.process_request(self.builder.to_server_query())
38+
return self.process_request(self.builder.to_server_query())
3739

3840
def get_by_predicate(
3941
self, store_name: str, condition: db_query.PredicateCondition
4042
) -> db_response.ServerResult:
4143
self.builder.get_by_predicate(store_name=store_name, condition=condition)
42-
return self.protocol.process_request(self.builder.to_server_query())
44+
return self.process_request(self.builder.to_server_query())
4345

4446
def get_sim_n(
4547
self,
@@ -56,13 +58,13 @@ def get_sim_n(
5658
algorithm=algorithm,
5759
condition=condition,
5860
)
59-
return self.protocol.process_request(self.builder.to_server_query())
61+
return self.process_request(self.builder.to_server_query())
6062

6163
def create_pred_index(
6264
self, store_name: str, predicates: typing.Sequence[str]
6365
) -> db_response.ServerResult:
6466
self.builder.create_pred_index(store_name=store_name, predicates=predicates)
65-
return self.protocol.process_request(self.builder.to_server_query())
67+
return self.process_request(self.builder.to_server_query())
6668

6769
def drop_pred_index(
6870
self,
@@ -75,7 +77,7 @@ def drop_pred_index(
7577
predicates=predicates,
7678
error_if_not_exists=error_if_not_exists,
7779
)
78-
return self.protocol.process_request(self.builder.to_server_query())
80+
return self.process_request(self.builder.to_server_query())
7981

8082
def set(
8183
self,
@@ -85,27 +87,27 @@ def set(
8587
],
8688
) -> db_response.ServerResult:
8789
self.builder.set(store_name=store_name, inputs=inputs)
88-
return self.protocol.process_request(self.builder.to_server_query())
90+
return self.process_request(self.builder.to_server_query())
8991

9092
def delete_key(
9193
self, store_name: str, keys: typing.Sequence[db_query.Array]
9294
) -> db_response.ServerResult:
9395
self.builder.delete_key(store_name=store_name, keys=keys)
94-
return self.protocol.process_request(self.builder.to_server_query())
96+
return self.process_request(self.builder.to_server_query())
9597

9698
def delete_predicate(
9799
self, store_name: str, condition: db_query.PredicateCondition
98100
) -> db_response.ServerResult:
99101
self.builder.delete_predicate(store_name=store_name, condition=condition)
100-
return self.protocol.process_request(self.builder.to_server_query())
102+
return self.process_request(self.builder.to_server_query())
101103

102104
def drop_store(
103105
self, store_name: str, error_if_not_exists: bool
104106
) -> db_response.ServerResult:
105107
self.builder.drop_store(
106108
store_name=store_name, error_if_not_exists=error_if_not_exists
107109
)
108-
return self.protocol.process_request(self.builder.to_server_query())
110+
return self.process_request(self.builder.to_server_query())
109111

110112
def create_store(
111113
self,
@@ -125,36 +127,32 @@ def create_store(
125127
error_if_exists=error_if_exists,
126128
)
127129
message = self.builder.to_server_query()
128-
return self.protocol.process_request(message=message)
130+
return self.process_request(message=message)
129131

130132
def list_stores(self) -> db_response.ServerResult:
131133
self.builder.list_stores()
132-
return self.protocol.process_request(self.builder.to_server_query())
134+
return self.process_request(self.builder.to_server_query())
133135

134136
def info_server(self) -> db_response.ServerResult:
135137
self.builder.info_server()
136-
return self.protocol.process_request(
138+
return self.process_request(
137139
message=self.builder.to_server_query(),
138140
)
139141

140142
def list_clients(self) -> db_response.ServerResult:
141143
self.builder.list_clients()
142-
return self.protocol.process_request(
144+
return self.process_request(
143145
message=self.builder.to_server_query(),
144146
)
145147

146148
def ping(self) -> db_response.ServerResult:
147149
self.builder.ping()
148-
return self.protocol.process_request(message=self.builder.to_server_query())
150+
return self.process_request(message=self.builder.to_server_query())
149151

150152
def pipeline(self) -> builders.AhnlichDBRequestBuilder:
151153
"""Gives you a request builder to create multple requests"""
152154
return self.builder
153155

154156
def exec(self) -> db_response.ServerResult:
155157
"""Executes a pipelined request"""
156-
return self.protocol.process_request(message=self.builder.to_server_query())
157-
158-
def cleanup(self):
159-
"""closes the socket connection as well as connection pool"""
160-
self.protocol.cleanup()
158+
return self.process_request(message=self.builder.to_server_query())

0 commit comments

Comments
 (0)