Spaces:
Build error
Build error
from operator import itemgetter | |
import pytest | |
from .helpers.collection_setup import basic_collection_setup, drop_collection | |
from .helpers.helpers import request_with_validation | |
def setup(on_disk_vectors, on_disk_payload, collection_name): | |
basic_collection_setup(collection_name=collection_name, on_disk_vectors=on_disk_vectors, | |
on_disk_payload=on_disk_payload) | |
yield | |
drop_collection(collection_name=collection_name) | |
def assert_points(collection_name, points, nonexisting_ids=None, with_vectors=False): | |
ids = [point['id'] for point in points] | |
ids.extend(nonexisting_ids or []) | |
if not with_vectors: | |
for point in points: | |
point['vector'] = None | |
response = request_with_validation( | |
api='/collections/{collection_name}/points', | |
method='POST', | |
path_params={'collection_name': collection_name}, | |
body={'ids': ids, 'with_vector': with_vectors, 'with_payload': True}, | |
) | |
assert response.ok | |
for point, expected in zip( | |
sorted(response.json()['result'], key=itemgetter('id')), | |
sorted(points, key=itemgetter('id')) | |
): | |
assert point.get('id') == expected.get('id') | |
assert point.get('payload') == expected.get('payload') | |
assert point.get('vector') == expected.get('vector') | |
def test_batch_update(collection_name): | |
# Upsert and delete points | |
response = request_with_validation( | |
api="/collections/{collection_name}/points/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"operations": [ | |
{ | |
"upsert": { | |
"points": [ | |
{ | |
"id": 7, | |
"vector": [1.0, 2.0, 3.0, 4.0], | |
"payload": {}, | |
}, | |
] | |
} | |
}, | |
{ | |
"upsert": { | |
"points": [ | |
{ | |
"id": 8, | |
"vector": [1.0, 2.0, 3.0, 4.0], | |
"payload": {}, | |
}, | |
] | |
} | |
}, | |
{"delete": {"points": [8]}}, | |
{ | |
"upsert": { | |
"points": [ | |
{ | |
"id": 7, | |
"vector": [2.0, 1.0, 3.0, 4.0], | |
"payload": {}, | |
}, | |
] | |
} | |
}, | |
{ | |
"upsert": { | |
"points": [ | |
{ | |
"id": 9, | |
"vector": { | |
"sparse-text": { | |
"indices": [123, 321], | |
"values": [5.5, 5.5] | |
} | |
}, | |
"payload": {}, | |
}, | |
] | |
} | |
}, | |
{"delete": {"points": [10]}}, | |
] | |
}, | |
query_params={"wait": "true"}, | |
) | |
assert response.ok | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 7, | |
"vector": [2.0, 1.0, 3.0, 4.0], | |
"payload": {}, | |
} | |
], | |
nonexisting_ids=[8], | |
with_vectors=True, | |
) | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 9, | |
"vector": { | |
"sparse-text": { | |
"indices": [123, 321], | |
"values": [5.5, 5.5] | |
}, | |
}, | |
"payload": {}, | |
} | |
], | |
nonexisting_ids=[10], | |
with_vectors=True, | |
) | |
# Update vector | |
response = request_with_validation( | |
api="/collections/{collection_name}/points/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"operations": [ | |
{ | |
"update_vectors": { | |
"points": [ | |
{ | |
"id": 7, | |
"vector": [1.0, 2.0, 3.0, 4.0], | |
}, | |
] | |
} | |
}, | |
{ | |
"update_vectors": { | |
"points": [ | |
{ | |
"id": 7, | |
"vector": [9.0, 2.0, 4.0, 2.0], | |
}, | |
] | |
} | |
}, | |
] | |
}, | |
query_params={"wait": "true"}, | |
) | |
assert response.ok | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 7, | |
"vector": [9.0, 2.0, 4.0, 2.0], | |
"payload": {}, | |
} | |
], | |
nonexisting_ids=[8], | |
with_vectors=True, | |
) | |
# Upsert point and delete vector | |
response = request_with_validation( | |
api="/collections/{collection_name}/points/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"operations": [ | |
{ | |
"upsert": { | |
"points": [ | |
{ | |
"id": 9, | |
"vector": [0.0, 5.0, 2.0, 1.0], | |
"payload": {}, | |
}, | |
] | |
} | |
}, | |
{ | |
"delete_vectors": { | |
"points": [9], | |
"vector": [""], | |
} | |
}, | |
] | |
}, | |
query_params={"wait": "true"}, | |
) | |
assert response.ok | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 7, | |
"vector": [9.0, 2.0, 4.0, 2.0], | |
"payload": {}, | |
}, | |
{ | |
"id": 9, | |
"vector": {}, | |
"payload": {}, | |
} | |
], | |
nonexisting_ids=[8], | |
with_vectors=True, | |
) | |
def test_batch_update_payload(collection_name): | |
# Batch on multiple points | |
response = request_with_validation( | |
api="/collections/{collection_name}/points/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"operations": [ | |
{ | |
"overwrite_payload": { | |
"payload": { | |
"test_payload": "1", | |
}, | |
"points": [1], | |
}, | |
}, | |
{ | |
"overwrite_payload": { | |
"payload": { | |
"test_payload": "2", | |
}, | |
"points": [2], | |
}, | |
}, | |
] | |
}, | |
) | |
assert response.ok | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 1, | |
"payload": { | |
"test_payload": "1", | |
}, | |
"vector": None, | |
}, | |
{ | |
"id": 2, | |
"payload": { | |
"test_payload": "2", | |
}, | |
"vector": None, | |
}, | |
] | |
) | |
# Clear multiple | |
response = request_with_validation( | |
api="/collections/{collection_name}/points/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"operations": [ | |
{ | |
"clear_payload": { | |
"points": [1], | |
}, | |
}, | |
{ | |
"clear_payload": { | |
"points": [2], | |
}, | |
}, | |
] | |
}, | |
query_params={"wait": "true"}, | |
) | |
assert response.ok | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 1, | |
"payload": {}, | |
}, | |
{ | |
"id": 2, | |
"payload": {}, | |
}, | |
] | |
) | |
# Batch update on the same point | |
response = request_with_validation( | |
api="/collections/{collection_name}/points/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"operations": [ | |
{ | |
"overwrite_payload": { | |
"payload": { | |
"test_payload_1": "1", | |
}, | |
"points": [1], | |
}, | |
}, | |
{ | |
"set_payload": { | |
"payload": { | |
"test_payload_2": "2", | |
"test_payload_3": "3", | |
}, | |
"points": [1], | |
} | |
}, | |
{ | |
"delete_payload": { | |
"keys": [ | |
"test_payload_2", | |
], | |
"points": [1], | |
}, | |
}, | |
] | |
}, | |
query_params={"wait": "true"}, | |
) | |
assert response.ok | |
assert_points(collection_name, | |
[ | |
{ | |
"id": 1, | |
"payload": { | |
"test_payload_1": "1", | |
"test_payload_3": "3", | |
}, | |
}, | |
] | |
) | |