diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py index e4d4df25483117e2149b607af556853d322e476a..f86ea010cf7e1e8797bce23c83c22436ebc07de3 100644 --- a/src/caosdb/apiutils.py +++ b/src/caosdb/apiutils.py @@ -712,19 +712,17 @@ def copy_entity(entity: Entity): return new -def merge_entities(entity_a: Entity, entity_b: Entity): +def merge_entities_in_place(entity_a: Entity, entity_b: Entity): """ - Create a new entity which is a copy of entity_a and merge it with entity_b such that - it compare_entities would report zero differences. + Merge entity_b into entity_a such that they have the same parents and properties. """ - new = copy_entity(entity_a) # Compare both entities: diff_r1, diff_r2 = compare_entities(entity_a, entity_b) # Go through the comparison and try to apply changes to entity_a: for key in diff_r2["parents"]: - new.add_parent(entity_b.get_parent(key)) + entity_a.add_parent(entity_b.get_parent(key)) for key in diff_r2["properties"]: if key in diff_r1["properties"]: @@ -734,24 +732,24 @@ def merge_entities(entity_a: Entity, entity_b: Entity): for attribute in ("datatype", "unit", "value"): if diff_r1["properties"][key][attribute] is None: - setattr(new.get_property(key), attribute, + setattr(entity_a.get_property(key), attribute, diff_r2["properties"][key][attribute]) else: raise RuntimeError("Merge conflict.") else: - new.add_property( + entity_a.add_property( entity_b.get_property(key), importance=entity_b.get_importance(key)) for special_attribute in ("name", "description"): - sa_new = getattr(new, special_attribute) + sa_a = getattr(entity_a, special_attribute) sa_b = getattr(entity_b, special_attribute) - if sa_new != sa_b: - if sa_new is None: - setattr(new, special_attribute, sa_b) + if sa_a != sa_b: + if sa_a is None: + setattr(entity_a, special_attribute, sa_b) else: raise RuntimeError("Merge conflict.") - return new + return entity_a def describe_diff(olddiff, newdiff, name=None, as_update=True):