From b7ac05b6f2b018635d9248831f1e9dc734facff4 Mon Sep 17 00:00:00 2001 From: shah Date: Thu, 6 Aug 2026 02:17:49 +0200 Subject: [PATCH] fix(vector_store): normalize QdrantStore.search_vectors() to return "metadata" QdrantStore.search_vectors() returned results keyed by "payload" while HybridSearch and PineconeStore both expect/return "metadata". This silently dropped metadata from Qdrant results and caused HybridSearch.filter_by_metadata to reject every candidate when a filter was applied (empty result sets). Fixes #840 --- semantica/vector_store/qdrant_store.py | 2 +- tests/vector_store/test_vector_store_deepdive.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/semantica/vector_store/qdrant_store.py b/semantica/vector_store/qdrant_store.py index 8bc0c357..88e5b397 100644 --- a/semantica/vector_store/qdrant_store.py +++ b/semantica/vector_store/qdrant_store.py @@ -165,7 +165,7 @@ class QdrantCollection: { "id": result.id, "score": result.score, - "payload": result.payload or {}, + "metadata": result.payload or {}, } ) diff --git a/tests/vector_store/test_vector_store_deepdive.py b/tests/vector_store/test_vector_store_deepdive.py index 2cd2bf94..7c7beb7c 100644 --- a/tests/vector_store/test_vector_store_deepdive.py +++ b/tests/vector_store/test_vector_store_deepdive.py @@ -232,6 +232,16 @@ class TestVectorStoreDeepDive(unittest.TestCase): self.assertEqual(len(results), 1) self.assertEqual(results[0]["id"], "vec_1") + self.assertIn("metadata", results[0]) + self.assertNotIn("payload", results[0]) + self.assertEqual(results[0]["metadata"], {"type": "a"}) + + hybrid = HybridSearch() + matched = hybrid.filter_by_metadata( + results, MetadataFilter().eq("type", "a") + ) + self.assertEqual(len(matched), 1) + @patch('semantica.vector_store.weaviate_store.weaviate') @patch('semantica.vector_store.weaviate_store.MetadataQuery') @patch('semantica.vector_store.weaviate_store.WEAVIATE_AVAILABLE', True)