diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py index bd5b0eeca217e1f77d1bd5d5c60e18f33dd76212..b1c74a59cc0234a6bae82c78628bfcdd90f271a6 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.