From 109e98aa44aff55ad8a8de9d5ea37bce9a5270d2 Mon Sep 17 00:00:00 2001 From: Stefano Fiorucci Date: Wed, 14 Aug 2024 10:56:32 +0200 Subject: [PATCH] fix: deserialize Document Stores using specific `from_dict` class methods (#8207) * use from_dict * unused import * improve logic * improve reno --- haystack/components/caching/cache_checker.py | 5 ++++- haystack/components/retrievers/filter_retriever.py | 5 ++++- .../components/retrievers/sentence_window_retriever.py | 5 ++++- haystack/components/writers/document_writer.py | 5 ++++- .../use-document-store-from-dict-db7975d0e0e5e451.yaml | 7 +++++++ 5 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 releasenotes/notes/use-document-store-from-dict-db7975d0e0e5e451.yaml diff --git a/haystack/components/caching/cache_checker.py b/haystack/components/caching/cache_checker.py index 2de3ee521..48751ee6d 100644 --- a/haystack/components/caching/cache_checker.py +++ b/haystack/components/caching/cache_checker.py @@ -82,7 +82,10 @@ class CacheChecker: doc_store_class = import_class_by_name(doc_store_data["type"]) except ImportError as e: raise DeserializationError(f"Class '{doc_store_data['type']}' not correctly imported") from e - data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) + if hasattr(doc_store_class, "from_dict"): + data["init_parameters"]["document_store"] = doc_store_class.from_dict(doc_store_data) + else: + data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) return default_from_dict(cls, data) diff --git a/haystack/components/retrievers/filter_retriever.py b/haystack/components/retrievers/filter_retriever.py index 93e0a465f..a2a612fee 100644 --- a/haystack/components/retrievers/filter_retriever.py +++ b/haystack/components/retrievers/filter_retriever.py @@ -88,7 +88,10 @@ class FilterRetriever: doc_store_class = import_class_by_name(doc_store_data["type"]) except ImportError as e: raise DeserializationError(f"Class '{doc_store_data['type']}' not correctly imported") from e - data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) + if hasattr(doc_store_class, "from_dict"): + data["init_parameters"]["document_store"] = doc_store_class.from_dict(doc_store_data) + else: + data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) return default_from_dict(cls, data) diff --git a/haystack/components/retrievers/sentence_window_retriever.py b/haystack/components/retrievers/sentence_window_retriever.py index 34af44f65..3e9a7e9ae 100644 --- a/haystack/components/retrievers/sentence_window_retriever.py +++ b/haystack/components/retrievers/sentence_window_retriever.py @@ -131,7 +131,10 @@ class SentenceWindowRetriever: except ImportError as e: raise DeserializationError(f"Class '{doc_store_data['type']}' not correctly imported") from e - data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) + if hasattr(doc_store_class, "from_dict"): + data["init_parameters"]["document_store"] = doc_store_class.from_dict(doc_store_data) + else: + data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) # deserialize the component return default_from_dict(cls, data) diff --git a/haystack/components/writers/document_writer.py b/haystack/components/writers/document_writer.py index bfd99cbde..72dd3a34e 100644 --- a/haystack/components/writers/document_writer.py +++ b/haystack/components/writers/document_writer.py @@ -84,7 +84,10 @@ class DocumentWriter: doc_store_class = import_class_by_name(doc_store_data["type"]) except ImportError as e: raise DeserializationError(f"Class '{doc_store_data['type']}' not correctly imported") from e - data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) + if hasattr(doc_store_class, "from_dict"): + data["init_parameters"]["document_store"] = doc_store_class.from_dict(doc_store_data) + else: + data["init_parameters"]["document_store"] = default_from_dict(doc_store_class, doc_store_data) data["init_parameters"]["policy"] = DuplicatePolicy[data["init_parameters"]["policy"]] return default_from_dict(cls, data) diff --git a/releasenotes/notes/use-document-store-from-dict-db7975d0e0e5e451.yaml b/releasenotes/notes/use-document-store-from-dict-db7975d0e0e5e451.yaml new file mode 100644 index 000000000..89563147f --- /dev/null +++ b/releasenotes/notes/use-document-store-from-dict-db7975d0e0e5e451.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + For components that support multiple Document Stores, prioritize using the specific `from_dict` class method + for deserialization when available. Otherwise, fall back to the generic `default_from_dict` method. + This impacts the following generic components: `CacheChecker`, `DocumentWriter`, `FilterRetriever`, and + `SentenceWindowRetriever`.