qdrant-haystack 7.0.0__tar.gz → 8.0.0__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 (22) hide show
  1. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/CHANGELOG.md +7 -8
  2. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/PKG-INFO +2 -2
  3. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/components/retrievers/qdrant/__init__.py +1 -1
  4. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/converters.py +17 -0
  5. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_converters.py +44 -0
  6. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_filters.py +0 -6
  7. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/.gitignore +0 -0
  8. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/LICENSE.txt +0 -0
  9. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/README.md +0 -0
  10. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/examples/embedding_retrieval.py +0 -0
  11. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/pydoc/config.yml +0 -0
  12. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/pyproject.toml +0 -0
  13. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/components/retrievers/qdrant/retriever.py +0 -0
  14. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/__init__.py +0 -0
  15. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/document_store.py +0 -0
  16. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/filters.py +0 -0
  17. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/migrate_to_sparse.py +0 -0
  18. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/__init__.py +0 -0
  19. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/conftest.py +0 -0
  20. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_dict_converters.py +0 -0
  21. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_document_store.py +0 -0
  22. {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_retriever.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [integrations/qdrant-v7.0.0] - 2024-10-29
4
+
5
+ ### ⚙️ Miscellaneous Tasks
6
+
7
+ - Update ruff linting scripts and settings (#1105)
8
+ - Adopt uv as installer (#1142)
9
+
3
10
  ## [integrations/qdrant-v6.0.0] - 2024-09-13
4
11
 
5
12
  ## [integrations/qdrant-v5.1.0] - 2024-09-12
@@ -105,8 +112,6 @@
105
112
 
106
113
  - Fix haystack-ai pin (#649)
107
114
 
108
-
109
-
110
115
  ## [integrations/qdrant-v3.2.0] - 2024-03-27
111
116
 
112
117
  ### 🚀 Features
@@ -117,15 +122,11 @@
117
122
  ### 🐛 Bug Fixes
118
123
 
119
124
  - Fix linter errors (#282)
120
-
121
-
122
125
  - Fix order of API docs (#447)
123
126
 
124
127
  This PR will also push the docs to Readme
125
128
  - Fixes (#518)
126
129
 
127
-
128
-
129
130
  ### 🚜 Refactor
130
131
 
131
132
  - [**breaking**] Qdrant - update secret management (#405)
@@ -156,8 +157,6 @@ This PR will also push the docs to Readme
156
157
 
157
158
  - Fix import paths for beta5 (#237)
158
159
 
159
-
160
-
161
160
  ### 🚜 Refactor
162
161
 
163
162
  - Use `hatch_vcs` to manage integrations versioning (#103)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: qdrant-haystack
3
- Version: 7.0.0
3
+ Version: 8.0.0
4
4
  Summary: An integration of Qdrant ANN vector database backend 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/qdrant/README.md
@@ -4,4 +4,4 @@
4
4
 
5
5
  from .retriever import QdrantEmbeddingRetriever, QdrantHybridRetriever, QdrantSparseEmbeddingRetriever
6
6
 
7
- __all__ = ("QdrantEmbeddingRetriever", "QdrantSparseEmbeddingRetriever", "QdrantHybridRetriever")
7
+ __all__ = ("QdrantEmbeddingRetriever", "QdrantHybridRetriever", "QdrantSparseEmbeddingRetriever")
@@ -22,6 +22,15 @@ def convert_haystack_documents_to_qdrant_points(
22
22
  points = []
23
23
  for document in documents:
24
24
  payload = document.to_dict(flatten=False)
25
+
26
+ if payload.pop("dataframe", None):
27
+ logger.warning(
28
+ "Document %s has the `dataframe` field set,"
29
+ "QdrantDocumentStore no longer supports dataframes and this field will be ignored. "
30
+ "The `dataframe` field will soon be removed from Haystack Document.",
31
+ document.id,
32
+ )
33
+
25
34
  if use_sparse_embeddings:
26
35
  vector = {}
27
36
 
@@ -64,6 +73,14 @@ def convert_qdrant_point_to_haystack_document(point: QdrantPoint, use_sparse_emb
64
73
  payload = {**point.payload}
65
74
  payload["score"] = point.score if hasattr(point, "score") else None
66
75
 
76
+ if payload.pop("dataframe", None):
77
+ logger.warning(
78
+ "Document %s has the `dataframe` field set,"
79
+ "QdrantDocumentStore no longer supports dataframes and this field will be ignored. "
80
+ "The `dataframe` field will soon be removed from Haystack Document.",
81
+ payload["id"],
82
+ )
83
+
67
84
  if not use_sparse_embeddings:
68
85
  payload["embedding"] = point.vector if hasattr(point, "vector") else None
69
86
  elif hasattr(point, "vector") and point.vector is not None:
@@ -1,7 +1,10 @@
1
1
  import numpy as np
2
+ from haystack import Document
3
+ from pandas import DataFrame
2
4
  from qdrant_client.http import models as rest
3
5
 
4
6
  from haystack_integrations.document_stores.qdrant.converters import (
7
+ convert_haystack_documents_to_qdrant_points,
5
8
  convert_id,
6
9
  convert_qdrant_point_to_haystack_document,
7
10
  )
@@ -62,3 +65,44 @@ def test_point_to_document_reverts_proper_structure_from_record_without_sparse()
62
65
  assert document.sparse_embedding is None
63
66
  assert {"test_field": 1} == document.meta
64
67
  assert 0.0 == np.sum(np.array([1.0, 0.0, 0.0, 0.0]) - document.embedding)
68
+
69
+
70
+ def test_point_to_document_skips_dataframe():
71
+
72
+ point = rest.Record(
73
+ id="c7c62e8e-02b9-4ec6-9f88-46bd97b628b7",
74
+ payload={
75
+ "id": "my-id",
76
+ "content": "Lorem ipsum",
77
+ "content_type": "text",
78
+ "meta": {
79
+ "test_field": 1,
80
+ },
81
+ "dataframe": {"a": [1, 2, 3]},
82
+ },
83
+ vector=[1.0, 0.0, 0.0, 0.0],
84
+ )
85
+ document = convert_qdrant_point_to_haystack_document(point, use_sparse_embeddings=False)
86
+ assert "my-id" == document.id
87
+ assert "Lorem ipsum" == document.content
88
+ assert "text" == document.content_type
89
+ assert {"test_field": 1} == document.meta
90
+ assert 0.0 == np.sum(np.array([1.0, 0.0, 0.0, 0.0]) - document.embedding)
91
+ assert not hasattr(document, "dataframe") or document.dataframe is None
92
+
93
+
94
+ def test_documents_to_points_skips_dataframe():
95
+ doc = Document(
96
+ id="my-id",
97
+ content="Lorem ipsum",
98
+ embedding=[1.0, 0.0, 0.0, 0.0],
99
+ )
100
+
101
+ doc.dataframe = DataFrame([[1, 2], [3, 4]])
102
+
103
+ points = convert_haystack_documents_to_qdrant_points([doc], use_sparse_embeddings=False)
104
+ assert len(points) == 1
105
+
106
+ assert points[0].payload["content"] == "Lorem ipsum"
107
+ assert points[0].vector == [1.0, 0.0, 0.0, 0.0]
108
+ assert "dataframe" not in points[0].payload
@@ -208,11 +208,5 @@ class TestQdrantStoreBaseTests(FilterDocumentsTest):
208
208
 
209
209
  # ======== ========================== ========
210
210
 
211
- @pytest.mark.skip(reason="Qdrant doesn't support comparision with dataframe")
212
- def test_comparison_equal_with_dataframe(self, document_store, filterable_docs): ...
213
-
214
- @pytest.mark.skip(reason="Qdrant doesn't support comparision with dataframe")
215
- def test_comparison_not_equal_with_dataframe(self, document_store, filterable_docs): ...
216
-
217
211
  @pytest.mark.skip(reason="Cannot distinguish errors yet")
218
212
  def test_missing_top_level_operator_key(self, document_store, filterable_docs): ...