weaviate-haystack 2.1.1__tar.gz → 2.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/.gitignore +9 -0
  2. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/CHANGELOG.md +16 -0
  3. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/PKG-INFO +1 -1
  4. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/pyproject.toml +7 -7
  5. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/components/retrievers/weaviate/__init__.py +4 -0
  6. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/components/retrievers/weaviate/bm25_retriever.py +23 -4
  7. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/components/retrievers/weaviate/embedding_retriever.py +24 -4
  8. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/document_stores/weaviate/_filters.py +4 -0
  9. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/document_stores/weaviate/auth.py +4 -0
  10. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/conftest.py +4 -0
  11. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/test_auth.py +4 -0
  12. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/test_bm25_retriever.py +54 -0
  13. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/test_document_store.py +4 -0
  14. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/test_embedding_retriever.py +57 -0
  15. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/test_filters.py +4 -0
  16. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/LICENSE.txt +0 -0
  17. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/README.md +0 -0
  18. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/docker-compose.yml +0 -0
  19. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/pydoc/config.yml +0 -0
  20. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/document_stores/weaviate/__init__.py +0 -0
  21. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/src/haystack_integrations/document_stores/weaviate/document_store.py +0 -0
  22. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/__init__.py +0 -0
  23. {weaviate_haystack-2.1.1 → weaviate_haystack-2.1.3}/tests/test_files/robot1.jpg +0 -0
@@ -135,3 +135,12 @@ dmypy.json
135
135
  # Docs generation artifacts
136
136
  _readme_*.md
137
137
  .idea
138
+
139
+ # macOS
140
+ .DS_Store
141
+
142
+ # http cache (requests-cache)
143
+ **/http_cache.sqlite
144
+
145
+ # ruff
146
+ .ruff_cache
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [unreleased]
4
+
5
+ ### 🚀 Features
6
+
7
+ - Add filter_policy to weaviate integration (#824)
8
+
9
+ ### 🐛 Bug Fixes
10
+
11
+ - Weaviate filter error (#811)
12
+ - Fix connection to Weaviate Cloud Service (#624)
13
+
14
+ ### ⚙️ Miscellaneous Tasks
15
+
16
+ - Retry tests to reduce flakyness (#836)
17
+ - Update ruff invocation to include check parameter (#853)
18
+
3
19
  ## [integrations/weaviate-v2.1.0] - 2024-06-10
4
20
 
5
21
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: weaviate-haystack
3
- Version: 2.1.1
3
+ Version: 2.1.3
4
4
  Summary: An integration of Weaviate vector database with Haystack
5
5
  Project-URL: Source, https://github.com/deepset-ai/haystack-core-integrations
6
6
  Project-URL: Documentation, https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/weaviate/README.md
@@ -63,7 +63,7 @@ detached = true
63
63
  dependencies = ["black>=23.1.0", "mypy>=1.0.0", "ruff>=0.0.243"]
64
64
  [tool.hatch.envs.lint.scripts]
65
65
  typing = "mypy --install-types --non-interactive --explicit-package-bases {args:src/ tests}"
66
- style = ["ruff {args:.}", "black --check --diff {args:.}"]
66
+ style = ["ruff check {args:.}", "black --check --diff {args:.}"]
67
67
  fmt = ["black {args:.}", "ruff --fix {args:.}", "style"]
68
68
  all = ["style", "typing"]
69
69
 
@@ -75,7 +75,7 @@ skip-string-normalization = true
75
75
  [tool.ruff]
76
76
  target-version = "py38"
77
77
  line-length = 120
78
- select = [
78
+ lint.select = [
79
79
  "A",
80
80
  "ARG",
81
81
  "B",
@@ -102,7 +102,7 @@ select = [
102
102
  "W",
103
103
  "YTT",
104
104
  ]
105
- ignore = [
105
+ lint.ignore = [
106
106
  # Allow non-abstract empty methods in abstract base classes
107
107
  "B027",
108
108
  # Allow boolean positional values in function calls, like `dict.get(... True)`
@@ -118,18 +118,18 @@ ignore = [
118
118
  "PLR0913",
119
119
  "PLR0915",
120
120
  ]
121
- unfixable = [
121
+ lint.unfixable = [
122
122
  # Don't touch unused imports
123
123
  "F401",
124
124
  ]
125
125
 
126
- [tool.ruff.isort]
126
+ [tool.ruff.lint.isort]
127
127
  known-first-party = ["src"]
128
128
 
129
- [tool.ruff.flake8-tidy-imports]
129
+ [tool.ruff.lint.flake8-tidy-imports]
130
130
  ban-relative-imports = "parents"
131
131
 
132
- [tool.ruff.per-file-ignores]
132
+ [tool.ruff.lint.per-file-ignores]
133
133
  # Tests can use magic values, assertions, and relative imports
134
134
  "tests/**/*" = ["PLR2004", "S101", "TID252"]
135
135
 
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from .bm25_retriever import WeaviateBM25Retriever
2
6
  from .embedding_retriever import WeaviateEmbeddingRetriever
3
7
 
@@ -1,6 +1,12 @@
1
- from typing import Any, Dict, List, Optional
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from typing import Any, Dict, List, Optional, Union
2
6
 
3
7
  from haystack import Document, component, default_from_dict, default_to_dict
8
+ from haystack.document_stores.types import FilterPolicy
9
+ from haystack.document_stores.types.filter_policy import apply_filter_policy
4
10
  from haystack_integrations.document_stores.weaviate import WeaviateDocumentStore
5
11
 
6
12
 
@@ -26,6 +32,7 @@ class WeaviateBM25Retriever:
26
32
  document_store: WeaviateDocumentStore,
27
33
  filters: Optional[Dict[str, Any]] = None,
28
34
  top_k: int = 10,
35
+ filter_policy: Union[str, FilterPolicy] = FilterPolicy.REPLACE,
29
36
  ):
30
37
  """
31
38
  Create a new instance of WeaviateBM25Retriever.
@@ -36,10 +43,14 @@ class WeaviateBM25Retriever:
36
43
  Custom filters applied when running the retriever
37
44
  :param top_k:
38
45
  Maximum number of documents to return
46
+ :param filter_policy: Policy to determine how filters are applied.
39
47
  """
40
48
  self._document_store = document_store
41
49
  self._filters = filters or {}
42
50
  self._top_k = top_k
51
+ self._filter_policy = (
52
+ filter_policy if isinstance(filter_policy, FilterPolicy) else FilterPolicy.from_str(filter_policy)
53
+ )
43
54
 
44
55
  def to_dict(self) -> Dict[str, Any]:
45
56
  """
@@ -52,6 +63,7 @@ class WeaviateBM25Retriever:
52
63
  self,
53
64
  filters=self._filters,
54
65
  top_k=self._top_k,
66
+ filter_policy=self._filter_policy.value,
55
67
  document_store=self._document_store.to_dict(),
56
68
  )
57
69
 
@@ -68,6 +80,11 @@ class WeaviateBM25Retriever:
68
80
  data["init_parameters"]["document_store"] = WeaviateDocumentStore.from_dict(
69
81
  data["init_parameters"]["document_store"]
70
82
  )
83
+ # Pipelines serialized with old versions of the component might not
84
+ # have the filter_policy field.
85
+ if filter_policy := data["init_parameters"].get("filter_policy"):
86
+ data["init_parameters"]["filter_policy"] = FilterPolicy.from_str(filter_policy)
87
+
71
88
  return default_from_dict(cls, data)
72
89
 
73
90
  @component.output_types(documents=List[Document])
@@ -77,12 +94,14 @@ class WeaviateBM25Retriever:
77
94
 
78
95
  :param query:
79
96
  The query text.
80
- :param filters:
81
- Filters to use when running the retriever.
97
+ :param filters: Filters applied to the retrieved Documents. The way runtime filters are applied depends on
98
+ the `filter_policy` chosen at retriever initialization. See init method docstring for more
99
+ details.
82
100
  :param top_k:
83
101
  The maximum number of documents to return.
84
102
  """
85
- filters = filters or self._filters
103
+ filters = apply_filter_policy(self._filter_policy, self._filters, filters)
104
+
86
105
  top_k = top_k or self._top_k
87
106
  documents = self._document_store._bm25_retrieval(query=query, filters=filters, top_k=top_k)
88
107
  return {"documents": documents}
@@ -1,6 +1,12 @@
1
- from typing import Any, Dict, List, Optional
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from typing import Any, Dict, List, Optional, Union
2
6
 
3
7
  from haystack import Document, component, default_from_dict, default_to_dict
8
+ from haystack.document_stores.types import FilterPolicy
9
+ from haystack.document_stores.types.filter_policy import apply_filter_policy
4
10
  from haystack_integrations.document_stores.weaviate import WeaviateDocumentStore
5
11
 
6
12
 
@@ -18,6 +24,7 @@ class WeaviateEmbeddingRetriever:
18
24
  top_k: int = 10,
19
25
  distance: Optional[float] = None,
20
26
  certainty: Optional[float] = None,
27
+ filter_policy: Union[str, FilterPolicy] = FilterPolicy.REPLACE,
21
28
  ):
22
29
  """
23
30
  Creates a new instance of WeaviateEmbeddingRetriever.
@@ -32,6 +39,8 @@ class WeaviateEmbeddingRetriever:
32
39
  The maximum allowed distance between Documents' embeddings.
33
40
  :param certainty:
34
41
  Normalized distance between the result item and the search vector.
42
+ :param filter_policy:
43
+ Policy to determine how filters are applied.
35
44
  :raises ValueError:
36
45
  If both `distance` and `certainty` are provided.
37
46
  See https://weaviate.io/developers/weaviate/api/graphql/search-operators#variables to learn more about
@@ -46,6 +55,9 @@ class WeaviateEmbeddingRetriever:
46
55
  self._top_k = top_k
47
56
  self._distance = distance
48
57
  self._certainty = certainty
58
+ self._filter_policy = (
59
+ filter_policy if isinstance(filter_policy, FilterPolicy) else FilterPolicy.from_str(filter_policy)
60
+ )
49
61
 
50
62
  def to_dict(self) -> Dict[str, Any]:
51
63
  """
@@ -60,6 +72,7 @@ class WeaviateEmbeddingRetriever:
60
72
  top_k=self._top_k,
61
73
  distance=self._distance,
62
74
  certainty=self._certainty,
75
+ filter_policy=self._filter_policy.value,
63
76
  document_store=self._document_store.to_dict(),
64
77
  )
65
78
 
@@ -76,6 +89,12 @@ class WeaviateEmbeddingRetriever:
76
89
  data["init_parameters"]["document_store"] = WeaviateDocumentStore.from_dict(
77
90
  data["init_parameters"]["document_store"]
78
91
  )
92
+
93
+ # Pipelines serialized with old versions of the component might not
94
+ # have the filter_policy field.
95
+ if filter_policy := data["init_parameters"].get("filter_policy"):
96
+ data["init_parameters"]["filter_policy"] = FilterPolicy.from_str(filter_policy)
97
+
79
98
  return default_from_dict(cls, data)
80
99
 
81
100
  @component.output_types(documents=List[Document])
@@ -92,8 +111,9 @@ class WeaviateEmbeddingRetriever:
92
111
 
93
112
  :param query_embedding:
94
113
  Embedding of the query.
95
- :param filters:
96
- Filters to use when running the retriever.
114
+ :param filters: Filters applied to the retrieved Documents. The way runtime filters are applied depends on
115
+ the `filter_policy` chosen at retriever initialization. See init method docstring for more
116
+ details.
97
117
  :param top_k:
98
118
  The maximum number of documents to return.
99
119
  :param distance:
@@ -105,7 +125,7 @@ class WeaviateEmbeddingRetriever:
105
125
  See https://weaviate.io/developers/weaviate/api/graphql/search-operators#variables to learn more about
106
126
  `distance` and `certainty` parameters.
107
127
  """
108
- filters = filters or self._filters
128
+ filters = apply_filter_policy(self._filter_policy, self._filters, filters)
109
129
  top_k = top_k or self._top_k
110
130
 
111
131
  distance = distance or self._distance
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from typing import Any, Dict
2
6
 
3
7
  from dateutil import parser
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from abc import ABC, abstractmethod
2
6
  from dataclasses import dataclass, field, fields
3
7
  from enum import Enum
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from pathlib import Path
2
6
 
3
7
  import pytest
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from haystack_integrations.document_stores.weaviate.auth import (
2
6
  AuthApiKey,
3
7
  AuthBearerToken,
@@ -1,5 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from unittest.mock import Mock, patch
2
6
 
7
+ import pytest
8
+ from haystack.document_stores.types import FilterPolicy
3
9
  from haystack_integrations.components.retrievers.weaviate import WeaviateBM25Retriever
4
10
  from haystack_integrations.document_stores.weaviate import WeaviateDocumentStore
5
11
 
@@ -10,6 +16,13 @@ def test_init_default():
10
16
  assert retriever._document_store == mock_document_store
11
17
  assert retriever._filters == {}
12
18
  assert retriever._top_k == 10
19
+ assert retriever._filter_policy == FilterPolicy.REPLACE
20
+
21
+ retriever = WeaviateBM25Retriever(document_store=mock_document_store, filter_policy="replace")
22
+ assert retriever._filter_policy == FilterPolicy.REPLACE
23
+
24
+ with pytest.raises(ValueError):
25
+ WeaviateBM25Retriever(document_store=mock_document_store, filter_policy="keep_all")
13
26
 
14
27
 
15
28
  @patch("haystack_integrations.document_stores.weaviate.document_store.weaviate")
@@ -21,6 +34,7 @@ def test_to_dict(_mock_weaviate):
21
34
  "init_parameters": {
22
35
  "filters": {},
23
36
  "top_k": 10,
37
+ "filter_policy": "replace",
24
38
  "document_store": {
25
39
  "type": "haystack_integrations.document_stores.weaviate.document_store.WeaviateDocumentStore",
26
40
  "init_parameters": {
@@ -49,6 +63,45 @@ def test_to_dict(_mock_weaviate):
49
63
 
50
64
  @patch("haystack_integrations.document_stores.weaviate.document_store.weaviate")
51
65
  def test_from_dict(_mock_weaviate):
66
+ retriever = WeaviateBM25Retriever.from_dict(
67
+ {
68
+ "type": "haystack_integrations.components.retrievers.weaviate.bm25_retriever.WeaviateBM25Retriever",
69
+ "init_parameters": {
70
+ "filters": {},
71
+ "top_k": 10,
72
+ "filter_policy": "replace",
73
+ "document_store": {
74
+ "type": "haystack_integrations.document_stores.weaviate.document_store.WeaviateDocumentStore",
75
+ "init_parameters": {
76
+ "url": None,
77
+ "collection_settings": {
78
+ "class": "Default",
79
+ "invertedIndexConfig": {"indexNullState": True},
80
+ "properties": [
81
+ {"name": "_original_id", "dataType": ["text"]},
82
+ {"name": "content", "dataType": ["text"]},
83
+ {"name": "dataframe", "dataType": ["text"]},
84
+ {"name": "blob_data", "dataType": ["blob"]},
85
+ {"name": "blob_mime_type", "dataType": ["text"]},
86
+ {"name": "score", "dataType": ["number"]},
87
+ ],
88
+ },
89
+ "auth_client_secret": None,
90
+ "additional_headers": None,
91
+ "embedded_options": None,
92
+ "additional_config": None,
93
+ },
94
+ },
95
+ },
96
+ }
97
+ )
98
+ assert retriever._document_store
99
+ assert retriever._filters == {}
100
+ assert retriever._top_k == 10
101
+
102
+
103
+ @patch("haystack_integrations.document_stores.weaviate.document_store.weaviate")
104
+ def test_from_dict_no_filter_policy(_mock_weaviate):
52
105
  retriever = WeaviateBM25Retriever.from_dict(
53
106
  {
54
107
  "type": "haystack_integrations.components.retrievers.weaviate.bm25_retriever.WeaviateBM25Retriever",
@@ -83,6 +136,7 @@ def test_from_dict(_mock_weaviate):
83
136
  assert retriever._document_store
84
137
  assert retriever._filters == {}
85
138
  assert retriever._top_k == 10
139
+ assert retriever._filter_policy == FilterPolicy.REPLACE
86
140
 
87
141
 
88
142
  @patch("haystack_integrations.components.retrievers.weaviate.bm25_retriever.WeaviateDocumentStore")
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  import base64
2
6
  import os
3
7
  import random
@@ -1,6 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from unittest.mock import Mock, patch
2
6
 
3
7
  import pytest
8
+ from haystack.document_stores.types import FilterPolicy
4
9
  from haystack_integrations.components.retrievers.weaviate import WeaviateEmbeddingRetriever
5
10
  from haystack_integrations.document_stores.weaviate import WeaviateDocumentStore
6
11
 
@@ -11,9 +16,16 @@ def test_init_default():
11
16
  assert retriever._document_store == mock_document_store
12
17
  assert retriever._filters == {}
13
18
  assert retriever._top_k == 10
19
+ assert retriever._filter_policy == FilterPolicy.REPLACE
14
20
  assert retriever._distance is None
15
21
  assert retriever._certainty is None
16
22
 
23
+ retriever = WeaviateEmbeddingRetriever(document_store=mock_document_store, filter_policy="replace")
24
+ assert retriever._filter_policy == FilterPolicy.REPLACE
25
+
26
+ with pytest.raises(ValueError):
27
+ WeaviateEmbeddingRetriever(document_store=mock_document_store, filter_policy="keep_all")
28
+
17
29
 
18
30
  def test_init_with_distance_and_certainty():
19
31
  mock_document_store = Mock(spec=WeaviateDocumentStore)
@@ -30,6 +42,7 @@ def test_to_dict(_mock_weaviate):
30
42
  "init_parameters": {
31
43
  "filters": {},
32
44
  "top_k": 10,
45
+ "filter_policy": "replace",
33
46
  "distance": None,
34
47
  "certainty": None,
35
48
  "document_store": {
@@ -60,6 +73,49 @@ def test_to_dict(_mock_weaviate):
60
73
 
61
74
  @patch("haystack_integrations.document_stores.weaviate.document_store.weaviate")
62
75
  def test_from_dict(_mock_weaviate):
76
+ retriever = WeaviateEmbeddingRetriever.from_dict(
77
+ {
78
+ "type": "haystack_integrations.components.retrievers.weaviate.embedding_retriever.WeaviateEmbeddingRetriever", # noqa: E501
79
+ "init_parameters": {
80
+ "filters": {},
81
+ "top_k": 10,
82
+ "filter_policy": "replace",
83
+ "distance": None,
84
+ "certainty": None,
85
+ "document_store": {
86
+ "type": "haystack_integrations.document_stores.weaviate.document_store.WeaviateDocumentStore",
87
+ "init_parameters": {
88
+ "url": None,
89
+ "collection_settings": {
90
+ "class": "Default",
91
+ "invertedIndexConfig": {"indexNullState": True},
92
+ "properties": [
93
+ {"name": "_original_id", "dataType": ["text"]},
94
+ {"name": "content", "dataType": ["text"]},
95
+ {"name": "dataframe", "dataType": ["text"]},
96
+ {"name": "blob_data", "dataType": ["blob"]},
97
+ {"name": "blob_mime_type", "dataType": ["text"]},
98
+ {"name": "score", "dataType": ["number"]},
99
+ ],
100
+ },
101
+ "auth_client_secret": None,
102
+ "additional_headers": None,
103
+ "embedded_options": None,
104
+ "additional_config": None,
105
+ },
106
+ },
107
+ },
108
+ }
109
+ )
110
+ assert retriever._document_store
111
+ assert retriever._filters == {}
112
+ assert retriever._top_k == 10
113
+ assert retriever._distance is None
114
+ assert retriever._certainty is None
115
+
116
+
117
+ @patch("haystack_integrations.document_stores.weaviate.document_store.weaviate")
118
+ def test_from_dict_no_filter_policy(_mock_weaviate):
63
119
  retriever = WeaviateEmbeddingRetriever.from_dict(
64
120
  {
65
121
  "type": "haystack_integrations.components.retrievers.weaviate.embedding_retriever.WeaviateEmbeddingRetriever", # noqa: E501
@@ -98,6 +154,7 @@ def test_from_dict(_mock_weaviate):
98
154
  assert retriever._top_k == 10
99
155
  assert retriever._distance is None
100
156
  assert retriever._certainty is None
157
+ assert retriever._filter_policy == FilterPolicy.REPLACE # defaults to REPLACE
101
158
 
102
159
 
103
160
  @patch("haystack_integrations.components.retrievers.weaviate.bm25_retriever.WeaviateDocumentStore")
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from haystack_integrations.document_stores.weaviate._filters import _invert_condition
2
6
 
3
7