From 25e0aa4ed3396225b555d2c0d185369d27be9083 Mon Sep 17 00:00:00 2001 From: KMohnishM Date: Wed, 1 Jul 2026 08:31:52 +0530 Subject: [PATCH] debezium/dbz#2156 feat: implement unified metadata filtering API and adapter translations Signed-off-by: KMohnishM --- tests/integration/test_chroma_pipeline.py | 18 ++++++++++++++++++ tests/integration/test_milvus_adapter.py | 20 ++++++++++++++++++++ tests/unit/test_pgvector_adapter.py | 13 +++++++++++++ 3 files changed, 51 insertions(+) diff --git a/tests/integration/test_chroma_pipeline.py b/tests/integration/test_chroma_pipeline.py index e7c71a1..c596582 100644 --- a/tests/integration/test_chroma_pipeline.py +++ b/tests/integration/test_chroma_pipeline.py @@ -51,6 +51,24 @@ def test_chroma_as_retriever(chroma_adapter: ChromaAdapter) -> None: assert results[0].id == "test_id_retriever" +def test_chroma_metadata_filtering(chroma_adapter: ChromaAdapter) -> None: + """Verify that ChromaAdapter retrieves only filtered metadata matching documents.""" + doc_match = Document( + page_content="Electronics topic query", metadata={"category": "electronics", "tenant": "user1"}, id="doc_match" + ) + doc_skip = Document( + page_content="Electronics topic query", metadata={"category": "clothing", "tenant": "user1"}, id="doc_skip" + ) + chroma_adapter.upsert(doc_match) + chroma_adapter.upsert(doc_skip) + + # Filter exactly category=electronics + retriever = chroma_adapter.as_retriever(metadata_filter={"category": "electronics"}, search_kwargs={"k": 2}) + results = retriever.invoke("Electronics topic query") + assert len(results) == 1 + assert results[0].id == "doc_match" + + def test_e2e_pipeline_chroma_hard_delete( chroma_adapter: ChromaAdapter, document_builder: DocumentBuilder, diff --git a/tests/integration/test_milvus_adapter.py b/tests/integration/test_milvus_adapter.py index 0d8cc95..3037f78 100755 --- a/tests/integration/test_milvus_adapter.py +++ b/tests/integration/test_milvus_adapter.py @@ -102,3 +102,23 @@ def test_milvus_adapter_upsert_missing_id(milvus_adapter: MilvusAdapter) -> None with pytest.raises(ValueError) as exc_info: milvus_adapter.upsert(doc) assert "Document ID must be provided" in str(exc_info.value) + + +def test_milvus_adapter_metadata_filtering(milvus_adapter: MilvusAdapter) -> None: + """Verify that MilvusAdapter filters documents matching metadata expression.""" + doc_match = Document( + page_content="Matching product description", metadata={"category": "books", "in_stock": True}, id="doc_match" + ) + doc_skip = Document( + page_content="Matching product description", metadata={"category": "clothing", "in_stock": True}, id="doc_skip" + ) + + milvus_adapter.upsert(doc_match) + milvus_adapter.upsert(doc_skip) + + # Filter with category == books + retriever = milvus_adapter.as_retriever(metadata_filter={"category": "books"}, search_kwargs={"k": 2}) + results = retriever.invoke("Matching product") + assert len(results) == 1 + doc_id = results[0].id or results[0].metadata.get("pk") + assert doc_id == "doc_match" diff --git a/tests/unit/test_pgvector_adapter.py b/tests/unit/test_pgvector_adapter.py index 801fc7a..2bd31ce 100755 --- a/tests/unit/test_pgvector_adapter.py +++ b/tests/unit/test_pgvector_adapter.py @@ -142,3 +142,16 @@ def test_pgvector_adapter_as_retriever(mock_pgvector: MagicMock) -> None: adapter.as_retriever(search_kwargs={"k": 3}) adapter.store.as_retriever.assert_called_once_with(search_kwargs={"k": 3}) + + +def test_pgvector_adapter_metadata_filtering(mock_pgvector: MagicMock) -> None: + """Verify that PGVectorAdapter maps metadata_filter to search_kwargs filter dictionary.""" + embeddings = FakeEmbeddings(size=128) + adapter = PGVectorAdapter( + connection_string="postgresql+psycopg://postgres:secret@localhost:5432/mydb", + collection_name="test_collection", + embeddings=embeddings, + ) + + adapter.as_retriever(metadata_filter={"category": "electronics"}, search_kwargs={"k": 3}) + adapter.store.as_retriever.assert_called_once_with(search_kwargs={"k": 3, "filter": {"category": "electronics"}})