From 15ac87c5a36af5548041cffada7b7870f70d265b Mon Sep 17 00:00:00 2001 From: florian <f.spreckelsen@inidscale.com> Date: Wed, 26 Oct 2022 13:28:10 +0200 Subject: [PATCH] WIP: Add `empty_diff` function to apiutils --- src/caosdb/apiutils.py | 44 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py index bd5b0eec..b1c74a59 100644 --- a/src/caosdb/apiutils.py +++ b/src/caosdb/apiutils.py @@ -188,9 +188,8 @@ def getCommitIn(folder): return t.readline().strip() -def compare_entities(old_entity: Entity, new_entity: Entity): - """ - Compare two entites. +def compare_entities(old_entity: Entity, new_entity: Entity, compare_referenced_records: bool = False): + """Compare two entites. Return a tuple of dictionaries, the first index belongs to additional information for old entity, the second index belongs to additional information for new entity. @@ -204,6 +203,20 @@ def compare_entities(old_entity: Entity, new_entity: Entity): - ... value (not implemented yet) In case of changed information the value listed under the respective key shows the value that is stored in the respective entity. + + If `compare_referenced_records` is `True`, also referenced entities will be + compared using this function, but with `compare_referenced_records = False` + to prevent infinite recursion in case of circular references. + + Parameters + ---------- + old_entity, new_entity : Entity + Entities to be compared + compare_referenced_records : bool, optional + Whether to compare referenced records in case of both, `old_entity` and + `new_entity`, have the same reference properties and both have a Record + object as value. + """ olddiff: Dict[str, Any] = {"properties": {}, "parents": []} newdiff: Dict[str, Any] = {"properties": {}, "parents": []} @@ -300,6 +313,31 @@ def compare_entities(old_entity: Entity, new_entity: Entity): return (olddiff, newdiff) +def empty_diff(old_entity: Entity, new_entity: Entity, compare_referenced_records: bool = False): + """Check whether the `compare_entities` found any differences between + old_entity and new_entity. + + Parameters + ---------- + old_entity, new_entity : Entity + Entities to be compared + compare_referenced_records : bool, optional + Whether to compare referenced records in case of both, `old_entity` and + `new_entity`, have the same reference properties and both have a Record + object as value. + + """ + olddiff, newdiff = compare_entities( + old_entity, new_entity, compare_referenced_records) + for diff in [olddiff, newdiff]: + for key in diff: + if len(diff[key]) > 0: + # There is a difference somewhere in the diff + return False + # all elements of the two diffs were empty + return True + + def merge_entities(entity_a: Entity, entity_b: Entity): """ Merge entity_b into entity_a such that they have the same parents and properties. -- GitLab