Skip to content

Commit 321bb54

Browse files
authored
Merge pull request #9 from XpressAI/fahreza/vecto-data
Data Access API Update
2 parents 86e2b5d + da864d6 commit 321bb54

3 files changed

Lines changed: 70 additions & 3 deletions

File tree

tests/test_management.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from vecto.schema import (VectoIngestData, VectoEmbeddingData, VectoAttribute, VectoAnalogyStartEnd,
2424
IngestResponse, LookupResult, VectoModel, VectoVectorSpace, VectoUser,
25-
VectoToken, VectoNewTokenResponse)
25+
VectoToken, VectoNewTokenResponse, DataPage, DataEntry)
2626

2727
'''
2828
Please ensure that you have token, vecto_base_url and vector_space_id
@@ -51,6 +51,7 @@
5151
test_vector_space = ""
5252
test_vs_name = "management_sdk_test"
5353
test_vs_token = ""
54+
test_vs_data = ""
5455

5556
# Currently test disabled as a bug prevents certain VS to be deleted.
5657
# @pytest.mark.management
@@ -152,6 +153,23 @@ def test_delete_token():
152153
token_list = user_vecto.list_tokens()
153154
assert not any(token.id == test_vs_token.id for token in token_list)
154155

156+
@pytest.mark.management
157+
def test_listing():
158+
global test_vs_data
159+
logger.info("Check if vector space data can be listed and the return types are correct.")
160+
test_vs_data = user_vecto.list_vector_space_data(vector_space_id, 10, 0)
161+
assert isinstance(test_vs_data, DataPage)
162+
assert isinstance(test_vs_data.elements[0], DataEntry)
163+
164+
@pytest.mark.management
165+
def test_delete_data():
166+
global test_vs_data
167+
logger.info("Check if vector space data can be deleted.")
168+
dataEntry = test_vs_data.elements[0]
169+
user_vecto.delete_vector_space_entry(vector_space_id, dataEntry.id)
170+
updated_vs_data = user_vecto.list_vector_space_data(vector_space_id, 10, 0)
171+
updatedDataEntry = updated_vs_data.elements[0]
172+
assert dataEntry != updatedDataEntry
155173

156174
@pytest.mark.management
157175
def test_delete_vector_space():

vecto/schema.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,14 @@ class MonthlyUsageResponse(NamedTuple):
119119
'''A named tuple that contains the usage metrics for a specified vector space and month.'''
120120
year: int
121121
month: int
122-
usage: VectoUsageMetrics
122+
usage: VectoUsageMetrics
123+
124+
class DataEntry(NamedTuple):
125+
'''A named tuple that represents an individual data entry with an ID and attributes.'''
126+
id: int
127+
attributes: dict
128+
129+
class DataPage(NamedTuple):
130+
'''A named tuple of data entries, contains the total count and a list of 'DataEntry' instances.'''
131+
count: int
132+
elements: List[DataEntry]

vecto/vecto_requests.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
from .schema import (VectoIngestData, VectoEmbeddingData, VectoAttribute, VectoAnalogyStartEnd,
2929
IngestResponse, LookupResult, VectoModel, VectoVectorSpace, VectoUser,
3030
VectoToken, VectoNewTokenResponse, MODEL_MAP, VectoAnalogy,
31-
DailyUsageMetric, UsageMetric, VectoUsageMetrics, MonthlyUsageResponse)
31+
DailyUsageMetric, UsageMetric, VectoUsageMetrics, MonthlyUsageResponse,
32+
DataEntry, DataPage)
3233

3334
from .client import Client
3435
import vecto
@@ -919,6 +920,44 @@ def delete_analogy(self, vector_space_id:int, **kwargs):
919920
url = f"/api/v0/account/space/{vector_space_id}/analogy"
920921
self._client.delete(url, **kwargs)
921922

923+
def list_vector_space_data(self, vector_space_id: int, limit: int = None, offset: int = None, **kwargs):
924+
'''
925+
List the attributes of all entries in the given vector space.
926+
927+
Args:
928+
vector_space_id (int): The ID of the vector space.
929+
limit (int, optional): The maximum number of entries to return. If not specified, it will be set to 0.
930+
offset (int, optional): The offset from the start of the list to begin returning entries.
931+
**kwargs: Other keyword arguments for clients other than `requests`
932+
933+
Returns:
934+
DataPage: A DataPage instance containing the list of entries and their attributes.
935+
'''
936+
937+
url = f"/api/v0/space/{vector_space_id}/data"
938+
params = {'limit': limit, 'offset': offset}
939+
response = self._client.get(url, params=params, **kwargs)
940+
response_json = response.json()
941+
942+
# Create DataEntry instances for each element in the response
943+
data_entries = [DataEntry(**entry) for entry in response_json["elements"]]
944+
945+
# Create and return the DataPage instance
946+
return DataPage(count=response_json["count"], elements=data_entries)
947+
948+
def delete_vector_space_entry(self, vector_space_id: int, entry_id: int, **kwargs):
949+
'''
950+
Delete an entry in a vector space.
951+
952+
Args:
953+
vector_space_id (int): The ID of the vector space.
954+
entry_id (int): The ID of the entry to be deleted.
955+
**kwargs: Other keyword arguments for clients other than `requests`
956+
'''
957+
958+
url = f"/api/v0/space/{vector_space_id}/data/{entry_id}"
959+
self._client.delete(url, **kwargs)
960+
922961
###############
923962
# Metrics API #
924963
###############

0 commit comments

Comments
 (0)