diff --git a/python/semantic_kernel/connectors/in_memory.py b/python/semantic_kernel/connectors/in_memory.py index f2e1dc30fbe1..4ccab0775f06 100644 --- a/python/semantic_kernel/connectors/in_memory.py +++ b/python/semantic_kernel/connectors/in_memory.py @@ -735,9 +735,8 @@ def _get_filtered_records(self, options: VectorSearchOptions) -> dict[TKey, Attr raise VectorStoreOperationException(f"Error evaluating filter: {e}") from e filtered_records: dict[TKey, AttributeDict] = {} for key, record in self.inner_storage.items(): - for filter in callable_filters: - if self._run_filter(filter, record): - filtered_records[key] = record + if all(self._run_filter(filter, record) for filter in callable_filters): + filtered_records[key] = record return filtered_records def _parse_and_validate_filter(self, filter_str: str) -> Callable: diff --git a/python/tests/unit/connectors/memory/test_in_memory.py b/python/tests/unit/connectors/memory/test_in_memory.py index 7955b7696632..1fd96cf15f49 100644 --- a/python/tests/unit/connectors/memory/test_in_memory.py +++ b/python/tests/unit/connectors/memory/test_in_memory.py @@ -123,6 +123,28 @@ async def test_valid_lambda_filter_attribute_access(collection): assert "2" in results +async def test_multiple_filters_are_combined_with_and(collection): + await collection.upsert([ + {"id": "1", "content": "a", "vector": [1, 2, 3, 4, 5]}, + {"id": "2", "content": "b", "vector": [1, 2, 3, 4, 5]}, + {"id": "3", "content": "a", "vector": [1, 2, 3, 4, 5]}, + ]) + filters = ["lambda x: x.content == 'a'", "lambda x: x.id != '3'"] + results = collection._get_filtered_records(type("opt", (), {"filter": filters})()) + assert list(results) == ["1"] + + +async def test_multiple_callable_filters_are_combined_with_and(collection): + await collection.upsert([ + {"id": "1", "content": "a", "vector": [1, 2, 3, 4, 5]}, + {"id": "2", "content": "b", "vector": [1, 2, 3, 4, 5]}, + {"id": "3", "content": "a", "vector": [1, 2, 3, 4, 5]}, + ]) + filters = [lambda x: x.content == "a", lambda x: x.id != "3"] + results = collection._get_filtered_records(type("opt", (), {"filter": filters})()) + assert list(results) == ["1"] + + async def test_invalid_filter_not_lambda(collection): with raises(VectorStoreOperationException, match="must be a lambda expression"): collection._get_filtered_records(type("opt", (), {"filter": "x.id == '1'"})())