Files
qdrant/tests/e2e_tests/test_immutable_index.py
2025-11-14 12:29:35 +01:00

103 lines
3.9 KiB
Python

import uuid
import random
from qdrant_client import models
from e2e_tests.client_utils import ClientUtils
from e2e_tests.models import QdrantContainerConfig
class TestImmutableIndex:
"""Test Qdrant immutable index functionality."""
def test_immutable_full_text_index(self, qdrant_container_factory):
"""
Test scenario:
1. Create a collection with specific configuration
2. Add multiple payload indexes
3. Insert 100 points
4. Verify points count matches in collection and all indexes
"""
config = QdrantContainerConfig()
container_info = qdrant_container_factory(config)
client = ClientUtils(host=container_info.host, port=container_info.http_port)
assert client.wait_for_server(), "Server failed to start"
collection_name = "test_immutable_index"
# 1. Create collection with specific configuration
vector_dim = 256
collection_config = {
"vectors": {
"size": vector_dim,
"distance": "Cosine"
},
"on_disk_payload": False, # True in example issue
"optimizers_config": {
"indexing_threshold": 1,
}
}
client.create_collection(collection_name, collection_config)
# 2. Create payload indexes using ClientUtils method
client.create_payload_index(
collection_name=collection_name,
field_name="chunk_id",
field_schema=models.PayloadSchemaType.UUID
)
client.create_payload_index(
collection_name=collection_name,
field_name="text",
field_schema=models.TextIndexParams(
type=models.TextIndexType.TEXT,
tokenizer=models.TokenizerType.WORD,
min_token_len=2,
max_token_len=15,
lowercase=True
)
)
# 3. Insert 100 points
points = []
vectors_count = 100
for i in range(vectors_count):
point = models.PointStruct(
id=i,
vector=[round(random.uniform(0, 1), 2) for _ in range(vector_dim)],
payload={
"chunk_id": str(uuid.uuid4()),
"library_id": str(uuid.uuid4()),
"folder_id": str(uuid.uuid4()),
"text": f"This is test text number {i} with some random words for indexing",
"media_id": str(uuid.uuid4())
}
)
points.append(point)
client.client.upsert(
collection_name=collection_name,
points=points,
wait=True
)
status_result = client.wait_for_status(collection_name, "green")
assert status_result == "ok", f"Collection did not reach green status within timeout"
# 4. Verify points count using collection metadata
collection_data = client.get_collection_info_dict(collection_name)
collection_points_count = collection_data["result"]["points_count"]
assert collection_points_count == vectors_count, f"Expected {vectors_count} points in collection, got {collection_points_count}"
# Check payload schema exists and has expected number of points
payload_schema = collection_data["result"].get("payload_schema", {})
expected_fields = ["chunk_id", "text"]
for field in expected_fields:
assert field in payload_schema, f"Expected field '{field}' not found in payload schema"
field_info = payload_schema[field]
# Check that each indexed field has the expected number of points
# The points count in the payload schema should equal the collection points count
assert field_info.points == vectors_count, f"Expected {vectors_count} points in index '{field}', got {field_info.points}"