Files
qdrant/tests/openapi/test_strict_mode_nested.py
Andrey Vasnetsov 4695549910 fix strict mode validation for nested filters (#7264)
* fix strict mode validation for nested filters

* fix test
2025-09-29 11:30:25 +02:00

143 lines
4.6 KiB
Python

import pytest
from .helpers.collection_setup import drop_collection
from .helpers.helpers import request_with_validation
from .test_nested_payload_indexing import nested_payload_collection_setup
@pytest.fixture(autouse=True)
def setup(on_disk_vectors, on_disk_payload, collection_name):
nested_payload_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 test_nested_strict_mode(collection_name):
response = request_with_validation(
api='/collections/{collection_name}',
method="GET",
path_params={'collection_name': collection_name},
)
assert response.ok
# Include strict mode into the test
response = request_with_validation(
api='/collections/{collection_name}',
method="PATCH",
path_params={'collection_name': collection_name},
body={
"strict_mode_config": {
"enabled": True,
"unindexed_filtering_retrieve": False
}
}
)
assert response.ok
# Create nested array 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": "country.cities[].population",
"field_schema": "float"
}
)
assert response.ok
# Search with nested filter on indexed & non payload
response = request_with_validation(
api='/collections/{collection_name}/points/scroll',
method="POST",
path_params={'collection_name': collection_name},
body={
"filter": {
"must": [
{
"nested": {
"key": "country.cities",
"filter": {
"must": [
{
"key": "population",
"range": {
"gte": 8.0,
}
},
{
"key": "sightseeing",
"values_count": {
"lt": 3
}
}
]
}
}
}
]
},
"limit": 3
}
)
# One payload index is missing
assert not response.ok
# Create missing payload 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": "country.cities[].sightseeing",
"field_schema": "integer"
}
)
assert response.ok
# Search with nested filter on indexed & non payload
response = request_with_validation(
api='/collections/{collection_name}/points/scroll',
method="POST",
path_params={'collection_name': collection_name},
body={
"filter": {
"must": [
{
"nested": {
"key": "country.cities",
"filter": {
"must": [
{
"key": "population",
"range": {
"gte": 8.0,
}
},
{
"key": "sightseeing",
"values_count": {
"lt": 3
}
}
]
}
}
}
]
},
"limit": 3
}
)
assert response.ok
assert len(response.json()['result']['points']) == 1
# Only Tokio has more than 8M inhabitants and less than 3 sightseeing
assert response.json()['result']['points'][0]['payload']['country']['name'] == "Japan"