From cdd23d0ca8a9ff54e0bd1d21f2b5b152cd222b46 Mon Sep 17 00:00:00 2001 From: Daniel <d.hornung@indiscale.com> Date: Tue, 15 Apr 2025 17:52:13 +0200 Subject: [PATCH] FEAT: `resolve_references` parameter In `high_level_api.convert_to_python_object()` --- CHANGELOG.md | 3 ++- src/linkahead/high_level_api.py | 28 ++++++++++++++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33142766..35b6a480 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### - convenience functions `value_matches_versionid`, `get_id_from_versionid` and `get_versionid` -- Parameter for high level API serialization to output a plain JSON. +- High level API: Parameter for serialization to output a plain JSON. +- High level API: Parameter to resolve references when converting to Python object. ### Changed ### diff --git a/src/linkahead/high_level_api.py b/src/linkahead/high_level_api.py index a0137dac..45839d9b 100644 --- a/src/linkahead/high_level_api.py +++ b/src/linkahead/high_level_api.py @@ -4,9 +4,10 @@ # # Copyright (C) 2018 Research Group Biomedical Physics, # Max-Planck-Institute for Dynamics and Self-Organization Göttingen +# Copyright (C) 2020-2022,2025 IndiScale GmbH <info@indiscale.com> # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com> -# Copyright (C) 2020-2022 IndiScale GmbH <info@indiscale.com> # Copyright (C) 2022 Alexander Schlemmer <alexander.schlemmer@ds.mpg.de> +# Copyright (C) 2025 Daniel Hornung <d.hornung@indiscale.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -21,8 +22,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. # -# ** end header -# + # type: ignore """ A high level API for accessing LinkAhead entities from within python. @@ -974,26 +974,32 @@ def convert_to_entity(python_object): def convert_to_python_object(entity: Union[db.Container, db.Entity], references: Optional[db.Container] = None, visited: Optional[Dict[int, - "CaosDBPythonEntity"]] = None): + "CaosDBPythonEntity"]] = None, + resolve_references: Optional[bool] = False, + ): """ Convert either a container of CaosDB entities or a single CaosDB entity into the high level representation. - The optional second parameter can be used + The optional ``references`` parameter can be used to resolve references that occur in the converted entities and resolve them to their correct representations. (Entities that are not found remain as - CaosDBPythonUnresolvedReferences.) + CaosDBPythonUnresolvedReferences, unless ``resolve_references`` is given and True.) """ if isinstance(entity, db.Container): # Create a list of objects: - return [convert_to_python_object(i, references, visited) for i in entity] + return [convert_to_python_object(ent, references=references, visited=visited, + resolve_references=resolve_references) for ent in entity] # TODO: recursion problems? - return _single_convert_to_python_object( + converted = _single_convert_to_python_object( high_level_type_for_standard_type(entity)(), entity, references, visited) + if resolve_references: + converted.resolve_references(True, references) + return converted def new_high_level_entity(entity: db.RecordType, @@ -1077,8 +1083,6 @@ def query(query: str, """ res = db.execute_query(query) - objects = convert_to_python_object(res) - if resolve_references: - for obj in objects: - obj.resolve_references(True, references) + objects = convert_to_python_object(res, references=references, + resolve_references=resolve_references) return objects -- GitLab