Spaces:
Build error
Build error
import uuid | |
import pytest | |
from .helpers.collection_setup import drop_collection, full_collection_setup | |
from .helpers.helpers import request_with_validation | |
uuid_1 = str(uuid.uuid4()) | |
uuid_2 = str(uuid.uuid4()) | |
uuid_3 = str(uuid.uuid4()) | |
def setup(on_disk_vectors, collection_name): | |
full_collection_setup(collection_name=collection_name, on_disk_vectors=on_disk_vectors) | |
def set_payload(payload, points): | |
response = request_with_validation( | |
api='/collections/{collection_name}/points/payload', | |
method="POST", | |
path_params={'collection_name': collection_name}, | |
query_params={'wait': 'true'}, | |
body={ | |
"payload": payload, | |
"points": points | |
} | |
) | |
assert response.ok | |
# keyword index on `keyword` | |
set_payload({"keyword": uuid_1}, [1]) | |
set_payload({"keyword": uuid_2}, [2]) | |
set_payload({"keyword": uuid_3}, [3]) | |
response = request_with_validation( | |
api="/collections/{collection_name}/index", | |
method="PUT", | |
query_params={'wait': 'true'}, | |
path_params={"collection_name": collection_name}, | |
body={"field_name": "keyword", "field_schema": "keyword"}, | |
) | |
assert response.ok, response.text | |
# UUID index on `uuid` | |
set_payload({"uuid": uuid_1}, [1]) | |
set_payload({"uuid": uuid_2}, [2]) | |
set_payload({"uuid": uuid_3}, [3]) | |
# Create index | |
response = request_with_validation( | |
api='/collections/{collection_name}/index', | |
method="PUT", | |
path_params={'collection_name': collection_name}, | |
query_params={'wait': 'true'}, | |
body={"field_name": "uuid", "field_schema": "uuid"} | |
) | |
assert response.ok | |
yield | |
drop_collection(collection_name=collection_name) | |
def get_index_filters(filed_name): | |
# Check different filters | |
filters_arr = [] | |
match_conditions = [ | |
{"value": uuid_1}, | |
{"text": uuid_2}, | |
{"any": [uuid_1, uuid_2]}, | |
{"except": [uuid_1, uuid_2]} | |
] | |
for item in ["must", "must_not", "should"]: | |
for condition in match_conditions: | |
filters_arr.append( | |
{ | |
item: [ | |
{ | |
"key": filed_name, | |
"match": condition | |
} | |
] | |
} | |
) | |
# min_should | |
for condition in match_conditions: | |
filters_arr.append( | |
{ | |
"min_should": { | |
"conditions": [ | |
{ | |
"key": filed_name, | |
"match": condition | |
} | |
], | |
"min_count": 2 | |
} | |
} | |
) | |
return filters_arr | |
def test_filtered_query_results_same_for_different_indexes(query, collection_name): | |
for uuid_filter, keyword_filter in zip([None, *get_index_filters("uuid")], [None, *get_index_filters("keyword")]): | |
uuid_response = request_with_validation( | |
api="/collections/{collection_name}/points/query", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"query": query, | |
"limit": 10, | |
"filter": uuid_filter, | |
"with_payload": True, | |
"using": "dense-image", | |
}, | |
) | |
assert uuid_response.ok, uuid_response.text | |
uuid_query_result = uuid_response.json()["result"]["points"] | |
keyword_response = request_with_validation( | |
api="/collections/{collection_name}/points/query", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"query": query, | |
"limit": 10, | |
"filter": keyword_filter, | |
"with_payload": True, | |
"using": "dense-image", | |
}, | |
) | |
assert keyword_response.ok, keyword_response.text | |
keyword_query_result = keyword_response.json()["result"]["points"] | |
assert uuid_query_result == keyword_query_result, uuid_filter | |
def test_filtered_query_groups_results_same_for_different_indexes(collection_name): | |
for uuid_filter, keyword_filter in zip([None, *get_index_filters("uuid")], [None, *get_index_filters("keyword")]): | |
uuid_response = request_with_validation( | |
api="/collections/{collection_name}/points/query/groups", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"prefetch": [], | |
"limit": 3, | |
"query": [-1.9, 1.1, -1.1, 1.1], | |
"using": "dense-image", | |
"with_payload": True, | |
"group_by": "uuid", | |
"group_size": 2, | |
"filter": uuid_filter | |
}, | |
) | |
assert uuid_response.ok, uuid_response.text | |
uuid_query_result = uuid_response.json()["result"]["groups"] | |
keyword_response = request_with_validation( | |
api="/collections/{collection_name}/points/query/groups", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"prefetch": [], | |
"limit": 3, | |
"query": [-1.9, 1.1, -1.1, 1.1], | |
"using": "dense-image", | |
"with_payload": True, | |
"group_by": "keyword", | |
"group_size": 2, | |
"filter": keyword_filter | |
}, | |
) | |
assert keyword_response.ok, keyword_response.text | |
keyword_query_result = keyword_response.json()["result"]["groups"] | |
assert uuid_query_result == keyword_query_result, uuid_filter | |
def test_filtered_query_batches_results_same_for_different_indexes(collection_name): | |
for uuid_filter, keyword_filter in zip([None, *get_index_filters("uuid")], [None, *get_index_filters("keyword")]): | |
uuid_response = request_with_validation( | |
api="/collections/{collection_name}/points/query/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"searches": [ | |
{ | |
"limit": 3, | |
"query": [-1.9, 1.1, -1.1, 1.1], | |
"using": "dense-image", | |
"with_payload": True, | |
"filter": uuid_filter, | |
}, | |
{ | |
"limit": 3, | |
"query": [0.19, 0.83, 0.75, -0.11], | |
"using": "dense-image", | |
"with_payload": True, | |
"filter": uuid_filter | |
} | |
] | |
}, | |
) | |
assert uuid_response.ok, uuid_response.text | |
uuid_query_result = uuid_response.json()["result"][0]["points"] | |
keyword_response = request_with_validation( | |
api="/collections/{collection_name}/points/query/batch", | |
method="POST", | |
path_params={"collection_name": collection_name}, | |
body={ | |
"searches": [ | |
{ | |
"limit": 3, | |
"query": [-1.9, 1.1, -1.1, 1.1], | |
"using": "dense-image", | |
"with_payload": True, | |
"filter": keyword_filter | |
}, | |
{ | |
"limit": 3, | |
"query": [0.19, 0.83, 0.75, -0.11], | |
"using": "dense-image", | |
"with_payload": True, | |
"filter": keyword_filter | |
} | |
] | |
}, | |
) | |
assert keyword_response.ok, keyword_response.text | |
keyword_query_result = keyword_response.json()["result"][0]["points"] | |
assert uuid_query_result == keyword_query_result, uuid_filter | |