Skip to content

Commit

Permalink
Move filter_documents tests with simple logical filters from Document…
Browse files Browse the repository at this point in the history
…StoreBaseTests to separate class
  • Loading branch information
silvanocerza committed Nov 17, 2023
1 parent 2c3a74c commit 86f3db4
Showing 1 changed file with 59 additions and 42 deletions.
101 changes: 59 additions & 42 deletions haystack/preview/testing/document_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -621,50 +621,31 @@ def test_lte_filter_embedding(self, docstore: DocumentStore, filterable_docs: Li
docstore.filter_documents(filters={"embedding": {"$lte": embedding_ones}})


class LegacyFilterDocumentsTest( # pylint: disable=too-many-ancestors
LegacyFilterDocumentsInvalidFiltersTest,
LegacyFilterDocumentsEqualTest,
LegacyFilterDocumentsNotEqualTest,
LegacyFilterDocumentsInTest,
LegacyFilterDocumentsNotInTest,
LegacyFilterDocumentsGreaterThanTest,
LegacyFilterDocumentsGreaterThanEqualTest,
LegacyFilterDocumentsLessThanTest,
LegacyFilterDocumentsLessThanEqualTest,
):
class LegacyFilterDocumentsSimpleLogicalTest(FilterableDocsFixtureMixin):
"""
Utility class to test a Document Store `filter_documents` method using different types of legacy filters
Utility class to test a Document Store `filter_documents` method using logical '$and', '$or' and '$not' legacy filters
To use it create a custom test class and override the `docstore` fixture to return your Document Store.
Example usage:
```python
class MyDocumentStoreTest(LegacyFilterDocumentsTest):
class MyDocumentStoreTest(LegacyFilterDocumentsSimpleLogicalTest):
@pytest.fixture
def docstore(self):
return MyDocumentStore()
```
"""

@pytest.mark.unit
def test_no_filter_empty(self, docstore: DocumentStore):
assert docstore.filter_documents() == []
assert docstore.filter_documents(filters={}) == []

@pytest.mark.unit
def test_no_filter_not_empty(self, docstore: DocumentStore):
docs = [Document(content="test doc")]
docstore.write_documents(docs)
assert docstore.filter_documents() == docs
assert docstore.filter_documents(filters={}) == docs


class DocumentStoreBaseTests(
CountDocumentsTest, WriteDocumentsTest, DeleteDocumentsTest, LegacyFilterDocumentsTest
): # pylint: disable=too-many-ancestors
@pytest.fixture
def docstore(self) -> DocumentStore:
raise NotImplementedError()
def test_filter_simple_or(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
filters = {"$or": {"name": {"$in": ["name_0", "name_1"]}, "number": {"$lt": 1.0}}}
result = docstore.filter_documents(filters=filters)
assert result == [
doc
for doc in filterable_docs
if (("number" in doc.meta and doc.meta["number"] < 1) or doc.meta.get("name") in ["name_0", "name_1"])
]

@pytest.mark.unit
def test_filter_simple_implicit_and_with_multi_key_dict(
Expand Down Expand Up @@ -706,6 +687,53 @@ def test_filter_simple_implicit_and(self, docstore: DocumentStore, filterable_do
if "number" in doc.meta and doc.meta["number"] <= 2.0 and doc.meta["number"] >= 0.0
]


class LegacyFilterDocumentsTest( # pylint: disable=too-many-ancestors
LegacyFilterDocumentsInvalidFiltersTest,
LegacyFilterDocumentsEqualTest,
LegacyFilterDocumentsNotEqualTest,
LegacyFilterDocumentsInTest,
LegacyFilterDocumentsNotInTest,
LegacyFilterDocumentsGreaterThanTest,
LegacyFilterDocumentsGreaterThanEqualTest,
LegacyFilterDocumentsLessThanTest,
LegacyFilterDocumentsLessThanEqualTest,
LegacyFilterDocumentsSimpleLogicalTest,
):
"""
Utility class to test a Document Store `filter_documents` method using different types of legacy filters
To use it create a custom test class and override the `docstore` fixture to return your Document Store.
Example usage:
```python
class MyDocumentStoreTest(LegacyFilterDocumentsTest):
@pytest.fixture
def docstore(self):
return MyDocumentStore()
```
"""

@pytest.mark.unit
def test_no_filter_empty(self, docstore: DocumentStore):
assert docstore.filter_documents() == []
assert docstore.filter_documents(filters={}) == []

@pytest.mark.unit
def test_no_filter_not_empty(self, docstore: DocumentStore):
docs = [Document(content="test doc")]
docstore.write_documents(docs)
assert docstore.filter_documents() == docs
assert docstore.filter_documents(filters={}) == docs


class DocumentStoreBaseTests(
CountDocumentsTest, WriteDocumentsTest, DeleteDocumentsTest, LegacyFilterDocumentsTest
): # pylint: disable=too-many-ancestors
@pytest.fixture
def docstore(self) -> DocumentStore:
raise NotImplementedError()

@pytest.mark.unit
def test_filter_nested_explicit_and(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand Down Expand Up @@ -738,17 +766,6 @@ def test_filter_nested_implicit_and(self, docstore: DocumentStore, filterable_do
)
]

@pytest.mark.unit
def test_filter_simple_or(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
filters = {"$or": {"name": {"$in": ["name_0", "name_1"]}, "number": {"$lt": 1.0}}}
result = docstore.filter_documents(filters=filters)
assert result == [
doc
for doc in filterable_docs
if (("number" in doc.meta and doc.meta["number"] < 1) or doc.meta.get("name") in ["name_0", "name_1"])
]

@pytest.mark.unit
def test_filter_nested_or(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand Down

0 comments on commit 86f3db4

Please sign in to comment.