Skip to content

Commit

Permalink
Move filter_documents tests with greater than equal filters from `D…
Browse files Browse the repository at this point in the history
…ocumentStoreBaseTests` to separate class (#6345)

* Move filter_documents tests with greater than equal filters from DocumentStoreBaseTests to separate class

* Move `filter_documents` tests with less than filters from `DocumentStoreBaseTests` to separate class (#6346)

* Move filter_documents tests with less than filters from DocumentStoreBaseTests to separate class

* Move `filter_documents` tests with less than equal filters from `DocumentStoreBaseTests` to separate class (#6347)

* Move filter_documents tests with less than equal filters from DocumentStoreBaseTests to separate class

* Move `filter_documents` tests with simple logical filters from `DocumentStoreBaseTests` to separate class (#6348)

* Move filter_documents tests with simple logical filters from DocumentStoreBaseTests to separate class

* Move filter_documents tests with nested logical filters from DocumentStoreBaseTests to separate class (#6349)
  • Loading branch information
silvanocerza authored Nov 17, 2023
1 parent 59e34aa commit 2b6e2f0
Showing 1 changed file with 126 additions and 41 deletions.
167 changes: 126 additions & 41 deletions haystack/preview/testing/document_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -498,48 +498,21 @@ def test_gt_filter_embedding(self, docstore: DocumentStore, filterable_docs: Lis
docstore.filter_documents(filters={"embedding": {"$gt": embedding_zeros}})


class LegacyFilterDocumentsTest(
LegacyFilterDocumentsInvalidFiltersTest,
LegacyFilterDocumentsEqualTest,
LegacyFilterDocumentsNotEqualTest,
LegacyFilterDocumentsInTest,
LegacyFilterDocumentsNotInTest,
LegacyFilterDocumentsGreaterThanTest,
):
class LegacyFilterDocumentsGreaterThanEqualTest(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 explicit '$gte' 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(LegacyFilterDocumentsGreaterThanEqualTest):
@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_gte_filter(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand All @@ -565,6 +538,22 @@ def test_gte_filter_embedding(self, docstore: DocumentStore, filterable_docs: Li
with pytest.raises(FilterError):
docstore.filter_documents(filters={"embedding": {"$gte": embedding_zeros}})


class LegacyFilterDocumentsLessThanTest(FilterableDocsFixtureMixin):
"""
Utility class to test a Document Store `filter_documents` method using explicit '$lt' 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(LegacyFilterDocumentsLessThanTest):
@pytest.fixture
def docstore(self):
return MyDocumentStore()
```
"""

@pytest.mark.unit
def test_lt_filter(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand All @@ -590,6 +579,22 @@ def test_lt_filter_embedding(self, docstore: DocumentStore, filterable_docs: Lis
with pytest.raises(FilterError):
docstore.filter_documents(filters={"embedding": {"$lt": embedding_ones}})


class LegacyFilterDocumentsLessThanEqualTest(FilterableDocsFixtureMixin):
"""
Utility class to test a Document Store `filter_documents` method using explicit '$lte' 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(LegacyFilterDocumentsLessThanEqualTest):
@pytest.fixture
def docstore(self):
return MyDocumentStore()
```
"""

@pytest.mark.unit
def test_lte_filter(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand All @@ -615,6 +620,33 @@ def test_lte_filter_embedding(self, docstore: DocumentStore, filterable_docs: Li
with pytest.raises(FilterError):
docstore.filter_documents(filters={"embedding": {"$lte": embedding_ones}})


class LegacyFilterDocumentsSimpleLogicalTest(FilterableDocsFixtureMixin):
"""
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(LegacyFilterDocumentsSimpleLogicalTest):
@pytest.fixture
def docstore(self):
return MyDocumentStore()
```
"""

@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_simple_implicit_and_with_multi_key_dict(
self, docstore: DocumentStore, filterable_docs: List[Document]
Expand Down Expand Up @@ -655,6 +687,22 @@ 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 LegacyFilterDocumentsNestedLogicalTest(FilterableDocsFixtureMixin):
"""
Utility class to test a Document Store `filter_documents` method using multiple nested 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(LegacyFilterDocumentsNestedLogicalTest):
@pytest.fixture
def docstore(self):
return MyDocumentStore()
```
"""

@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 @@ -687,17 +735,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 Expand Up @@ -784,3 +821,51 @@ def test_filter_nested_multiple_identical_operators_same_level(
or (doc.meta.get("chapter") in ["intro", "abstract"] and doc.meta.get("page") == "123")
)
]


class LegacyFilterDocumentsTest( # pylint: disable=too-many-ancestors
LegacyFilterDocumentsInvalidFiltersTest,
LegacyFilterDocumentsEqualTest,
LegacyFilterDocumentsNotEqualTest,
LegacyFilterDocumentsInTest,
LegacyFilterDocumentsNotInTest,
LegacyFilterDocumentsGreaterThanTest,
LegacyFilterDocumentsGreaterThanEqualTest,
LegacyFilterDocumentsLessThanTest,
LegacyFilterDocumentsLessThanEqualTest,
LegacyFilterDocumentsSimpleLogicalTest,
LegacyFilterDocumentsNestedLogicalTest,
):
"""
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()

0 comments on commit 2b6e2f0

Please sign in to comment.