Skip to content

Commit 82e1bb3

Browse files
authored
Merge pull request #47 from epsilla-cloud/dev
add facets
2 parents 78f5313 + 5d2c6c7 commit 82e1bb3

4 files changed

Lines changed: 86 additions & 25 deletions

File tree

pyepsilla/enterprise/client.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
import pprint
88
import socket
99
from typing import Optional, Union
10-
from ..utils.search_engine import SearchEngine
1110

1211
import requests
1312
import sentry_sdk
1413
from pydantic import BaseModel, Field, constr
1514

15+
from ..utils.search_engine import SearchEngine
16+
1617
requests.packages.urllib3.disable_warnings() # type: ignore
1718

1819

@@ -26,7 +27,9 @@ class DbModel(BaseModel):
2627

2728

2829
class Client(cloud.Client):
29-
def __init__(self, base_url: str, project_id: Optional[str] = "default", headers: dict = None):
30+
def __init__(
31+
self, base_url: str, project_id: Optional[str] = "default", headers: dict = None
32+
):
3033
self._project_id = project_id
3134
self._baseurl = f"{base_url}/api/v3/project/{project_id}"
3235
self._timeout = 10
@@ -176,7 +179,12 @@ def list_tables(self):
176179
return status_code, body
177180

178181
# Create table
179-
def create_table(self, table_name: str, table_fields: list[dict] = None, indices: list[dict] = None):
182+
def create_table(
183+
self,
184+
table_name: str,
185+
table_fields: list[dict] = None,
186+
indices: list[dict] = None,
187+
):
180188
if self._db_id is None:
181189
raise Exception("[ERROR] db_id is None!")
182190
if table_fields is None:
@@ -250,32 +258,43 @@ def query(
250258
limit: int = 2,
251259
filter: Optional[str] = None,
252260
with_distance: Optional[bool] = False,
261+
facets: Optional[list[dict]] = None,
253262
):
254263
req_url = "{}/data/query".format(self._baseurl)
255264
req_data = {"table": table_name}
256265
if query_text is not None:
257266
req_data["query"] = query_text
258267
if query_index is not None:
259268
req_data["queryIndex"] = query_index
260-
if query_field != None:
269+
if query_field is not None:
261270
req_data["queryField"] = query_field
262-
if query_vector != None:
271+
if query_vector is not None:
263272
req_data["queryVector"] = query_vector
264-
if response_fields != None:
273+
if response_fields is not None:
265274
req_data["response"] = response_fields
266-
if limit != None:
275+
if limit is not None:
267276
req_data["limit"] = limit
268-
if filter != None:
277+
if filter is not None:
269278
req_data["filter"] = filter
270279
if with_distance is not False:
271280
req_data["withDistance"] = with_distance
281+
if facets is not None and len(facets) > 0:
282+
aggregate_not_existing = 0
283+
for facet in facets:
284+
if "aggregate" not in facet:
285+
aggregate_not_existing += 1
286+
if aggregate_not_existing > 0:
287+
raise Exception("[ERROR] key aggregate is a must in facets!")
288+
else:
289+
req_data["facets"] = facets
272290

273291
res = requests.post(
274292
url=req_url, data=json.dumps(req_data), headers=self._header, verify=False
275293
)
276294
status_code = res.status_code
277295
body = res.json()
278296
res.close()
297+
del res
279298
return status_code, body
280299

281300
# Delete data from table

pyepsilla/vectordb/client.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
import socket
88
import time
99
from typing import Optional, Union
10-
from ..utils.search_engine import SearchEngine
1110

1211
import requests
1312
import sentry_sdk
1413
from requests.packages.urllib3.exceptions import InsecureRequestWarning
1514

15+
from ..utils.search_engine import SearchEngine
16+
1617
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
1718

1819

@@ -249,10 +250,11 @@ def query(
249250
query_index: str = None,
250251
query_field: str = None,
251252
query_vector: Union[list, dict] = None,
252-
response_fields: list = None,
253+
response_fields: Optional[list] = None,
253254
limit: int = 2,
254-
filter: str = "",
255-
with_distance: bool = False,
255+
filter: Optional[str] = None,
256+
with_distance: Optional[bool] = False,
257+
facets: Optional[list[dict]] = None,
256258
):
257259
if self._db is None:
258260
raise Exception("[ERROR] Please use_db() first!")
@@ -266,6 +268,15 @@ def query(
266268
"filter": filter,
267269
"withDistance": with_distance,
268270
}
271+
if facets is not None and len(facets) > 0:
272+
aggregate_not_existing = 0
273+
for facet in facets:
274+
if "aggregate" not in facet:
275+
aggregate_not_existing += 1
276+
if aggregate_not_existing > 0:
277+
raise Exception("[ERROR] key aggregate is a must in facets!")
278+
else:
279+
req_data["facets"] = facets
269280
if query_text is not None:
270281
req_data["query"] = query_text
271282
if query_index is not None:
@@ -280,6 +291,7 @@ def query(
280291
status_code = res.status_code
281292
body = res.json()
282293
res.close()
294+
del res
283295
return status_code, body
284296

285297
def get(
@@ -291,6 +303,7 @@ def get(
291303
filter: Optional[str] = None,
292304
skip: Optional[int] = None,
293305
limit: Optional[int] = None,
306+
facets: Optional[list[dict]] = None,
294307
):
295308
if self._db is None:
296309
raise Exception("[ERROR] Please use_db() first!")
@@ -302,26 +315,36 @@ def get(
302315
print(
303316
"[WARN] Both primary_keys and ids are prvoided, will use primary keys by default!"
304317
)
305-
if primary_keys == None and ids != None:
318+
if primary_keys is None and ids is not None:
306319
primary_keys = ids
307320

308321
req_data = {"table": table_name}
309322

310-
if response_fields != None:
323+
if response_fields is not None:
311324
req_data["response"] = response_fields
312325

313-
if primary_keys != None:
326+
if primary_keys is not None:
314327
req_data["primaryKeys"] = primary_keys
315328

316-
if filter != None:
329+
if filter is not None:
317330
req_data["filter"] = filter
318331

319-
if skip != None:
332+
if skip is not None:
320333
req_data["skip"] = filter
321334

322-
if limit != None:
335+
if limit is not None:
323336
req_data["limit"] = limit
324337

338+
if facets is not None and len(facets) > 0:
339+
aggregate_not_existing = 0
340+
for facet in facets:
341+
if "aggregate" not in facet:
342+
aggregate_not_existing += 1
343+
if aggregate_not_existing > 0:
344+
raise Exception("[ERROR] key aggregate is a must in facets!")
345+
else:
346+
req_data["facets"] = facets
347+
325348
req_url = "{}/api/{}/data/get".format(self._baseurl, self._db)
326349
res = requests.post(
327350
url=req_url, data=json.dumps(req_data), headers=self._header, verify=False

pyepsilla/vectordb/sentry.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,21 @@
44
# Sentry collects crash reports and performance numbers
55
# It is possible to turn off data collection using an environment variable named "SENTRY_DISABLE"
66

7-
import os, sys, platform, uuid, hashlib, socket, requests
7+
import hashlib
8+
import os
9+
import platform
10+
import socket
11+
import sys
12+
import uuid
13+
14+
import requests
815
import sentry_sdk
916
from sentry_sdk.integrations.atexit import AtexitIntegration
17+
1018
from .version import __version__
1119

1220
CONFIG_URL = "https://config.epsilla.com/candidate.json"
13-
SENTRY_DSN = "https://c705adb9ba9a5750ab5719c69021e3b0@o4505952171917312.ingest.sentry.io/4506031458746368"
21+
SENTRY_DSN = "https://7b7043e213409f7125c511127697d668@o4506949201428480.ingest.us.sentry.io/4506949333680128"
1422

1523
try:
1624
r = requests.get(CONFIG_URL, headers={"Agent": "PyEpsilla"}, timeout=2)
@@ -19,15 +27,18 @@
1927
except Exception:
2028
pass
2129

30+
2231
def callback(pending, timeout):
2332
sys.stderr.flush()
24-
33+
34+
2535
def get_external_ip() -> str:
2636
try:
2737
return requests.get("https://api.ipify.org", timeout=2).text
2838
except Exception:
2939
return "NA"
3040

41+
3142
def init_sentry():
3243
if "SENTRY_DISABLE" not in os.environ:
3344
try:
@@ -37,10 +48,18 @@ def init_sentry():
3748
sentry_sdk.set_tag("uid", uid)
3849
sentry_sdk.set_tag("internal_ip", internal_ip)
3950
sentry_sdk.set_tag("external_ip", external_ip)
40-
sentry_sdk.set_user({'ip_address': '{{auto}}'})
41-
sentry_sdk.set_user({"username": "{}-{}-{}".format(socket.gethostname(), internal_ip, external_ip)})
51+
sentry_sdk.set_user({"ip_address": "{{auto}}"})
52+
sentry_sdk.set_user(
53+
{
54+
"username": "{}-{}-{}".format(
55+
socket.gethostname(), internal_ip, external_ip
56+
)
57+
}
58+
)
4259
sentry_sdk.set_tag("version", platform.version())
43-
sentry_sdk.set_tag("platform", "{}-{}".format(sys.platform, platform.machine()))
60+
sentry_sdk.set_tag(
61+
"platform", "{}-{}".format(sys.platform, platform.machine())
62+
)
4463
sentry_sdk.init(
4564
dsn=SENTRY_DSN,
4665
release=__version__,

pyepsilla/vectordb/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.3.4"
1+
__version__ = "0.3.5"

0 commit comments

Comments
 (0)