From 5cd966b932d102ee0fc4e5155e2b4c6c2d3db292 Mon Sep 17 00:00:00 2001 From: George Panchuk Date: Wed, 15 May 2024 10:58:09 +0200 Subject: [PATCH 1/2] new: return copy of payload --- qdrant_client/local/local_collection.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/qdrant_client/local/local_collection.py b/qdrant_client/local/local_collection.py index 19f76608..99abe997 100644 --- a/qdrant_client/local/local_collection.py +++ b/qdrant_client/local/local_collection.py @@ -5,7 +5,6 @@ Any, Callable, Dict, - Iterable, List, Optional, Sequence, @@ -13,6 +12,7 @@ Union, get_args, ) +from copy import deepcopy import numpy as np from pydantic.version import VERSION as PYDANTIC_VERSION @@ -357,9 +357,11 @@ def _get_payload( self, idx: int, with_payload: Union[bool, Sequence[str], types.PayloadSelector] = True, + return_copy: bool = True, ) -> Optional[models.Payload]: payload = self.payload[idx] - return self._process_payload(payload, with_payload) + processed_payload = self._process_payload(payload, with_payload) + return deepcopy(processed_payload) if return_copy else processed_payload def _get_vectors( self, idx: int, with_vectors: Union[bool, Sequence[str]] = False @@ -1487,7 +1489,7 @@ def _persist_by_id(self, point_id: models.ExtendedPointId) -> None: idx = self.ids[point_id] point = models.PointStruct( id=point_id, - payload=self._get_payload(idx, with_payload=True), + payload=self._get_payload(idx, with_payload=True, return_copy=False), vector=self._get_vectors(idx, with_vectors=True), ) self.storage.persist(point) From c9f65433241d9f9cd4019238c3352d12982bbb9f Mon Sep 17 00:00:00 2001 From: George Date: Tue, 21 May 2024 17:02:07 +0200 Subject: [PATCH 2/2] new: deepcopy new payload (#628) --- qdrant_client/local/local_collection.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qdrant_client/local/local_collection.py b/qdrant_client/local/local_collection.py index 99abe997..bc475f93 100644 --- a/qdrant_client/local/local_collection.py +++ b/qdrant_client/local/local_collection.py @@ -1237,7 +1237,9 @@ def _scroll_by_value( def _update_point(self, point: models.PointStruct) -> None: idx = self.ids[point.id] - self.payload[idx] = to_jsonable_python(point.payload) if point.payload is not None else {} + self.payload[idx] = deepcopy( + to_jsonable_python(point.payload) if point.payload is not None else {} + ) if isinstance(point.vector, list): vectors = {DEFAULT_VECTOR_NAME: point.vector} @@ -1274,7 +1276,9 @@ def _add_point(self, point: models.PointStruct) -> None: self.ids[point.id] = idx self.ids_inv.append(point.id) - self.payload.append(to_jsonable_python(point.payload) if point.payload is not None else {}) + self.payload.append( + deepcopy(to_jsonable_python(point.payload) if point.payload is not None else {}) + ) assert len(self.payload) == len(self.ids_inv), "Payload and ids_inv must be the same size" self.deleted = np.append(self.deleted, 0) @@ -1506,7 +1510,7 @@ def set_payload( key: Optional[str] = None, ) -> None: ids = self._selector_to_ids(selector) - jsonable_payload = to_jsonable_python(payload) + jsonable_payload = deepcopy(to_jsonable_python(payload)) keys: Optional[List[JsonPathItem]] = parse_json_path(key) if key is not None else None @@ -1533,7 +1537,7 @@ def overwrite_payload( ids = self._selector_to_ids(selector) for point_id in ids: idx = self.ids[point_id] - self.payload[idx] = to_jsonable_python(payload) or {} + self.payload[idx] = deepcopy(to_jsonable_python(payload)) or {} self._persist_by_id(point_id) def delete_payload(