Skip to content

Commit

Permalink
Move filter_documents tests with not in filters from `DocumentStore…
Browse files Browse the repository at this point in the history
…BaseTests` to separate class (#6343)

* Move filter_documents tests with not in filters from DocumentStoreBaseTests to separate class

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

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

* Move `filter_documents` tests with greater than equal filters from `DocumentStoreBaseTests` 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 4ab5d04 commit 6faa26a
Showing 1 changed file with 158 additions and 39 deletions.
197 changes: 158 additions & 39 deletions haystack/preview/testing/document_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,46 +412,21 @@ def test_in_filter_embedding(self, docstore: DocumentStore, filterable_docs: Lis
]


class LegacyFilterDocumentsTest(
LegacyFilterDocumentsInvalidFiltersTest,
LegacyFilterDocumentsEqualTest,
LegacyFilterDocumentsNotEqualTest,
LegacyFilterDocumentsInTest,
):
class LegacyFilterDocumentsNotInTest(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 '$nin' 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(LegacyFilterDocumentsNotInTest):
@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_nin_filter_table(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand Down Expand Up @@ -481,6 +456,22 @@ def test_nin_filter(self, docstore: DocumentStore, filterable_docs: List[Documen
result = docstore.filter_documents(filters={"page": {"$nin": ["100", "123", "n.a."]}})
assert result == [doc for doc in filterable_docs if doc.meta.get("page") not in ["100", "123"]]


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

@pytest.mark.unit
def test_gt_filter(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand All @@ -506,6 +497,22 @@ def test_gt_filter_embedding(self, docstore: DocumentStore, filterable_docs: Lis
with pytest.raises(FilterError):
docstore.filter_documents(filters={"embedding": {"$gt": embedding_zeros}})


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

@pytest.mark.unit
def test_gte_filter(self, docstore: DocumentStore, filterable_docs: List[Document]):
docstore.write_documents(filterable_docs)
Expand All @@ -531,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 @@ -556,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 @@ -581,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 @@ -621,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 @@ -653,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 @@ -750,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 6faa26a

Please sign in to comment.