Added include_children parameter to _merge_columns.

We need to recursively merge the columns of children entities if a child
entity isn't a leaf node.
This commit is contained in:
Fabio Manganiello 2023-04-17 02:05:53 +02:00
parent b43017ef01
commit e7f64843a5
Signed by: blacklight
GPG key ID: D90FBA7F76362774

View file

@ -131,7 +131,7 @@ class EntitiesMerger:
else: else:
# Otherwise, merge the columns of the existing entity with those of # Otherwise, merge the columns of the existing entity with those of
# the new entity and use the existing entity # the new entity and use the existing entity
entity = cls._merge_columns(entity, existing_entity) entity = cls._merge_columns(entity, existing_entity, include_children=True)
# Refresh the existing collection of children with the new/updated # Refresh the existing collection of children with the new/updated
# entity # entity
@ -165,8 +165,10 @@ class EntitiesMerger:
if entity.id: if entity.id:
child.parent_id = entity.id child.parent_id = entity.id
@staticmethod @classmethod
def _merge_columns(entity: Entity, existing_entity: Entity) -> Entity: def _merge_columns(
cls, entity: Entity, existing_entity: Entity, include_children: bool = False
) -> Entity:
""" """
Merge two versions of an entity column by column. Merge two versions of an entity column by column.
""" """
@ -180,4 +182,20 @@ class EntitiesMerger:
elif col not in ('id', 'created_at'): elif col not in ('id', 'created_at'):
setattr(existing_entity, col, getattr(entity, col)) setattr(existing_entity, col, getattr(entity, col))
# Recursive call to merge the columns of the children too
if include_children:
existing_children = {e.entity_key: e for e in existing_entity.children}
new_children = {e.entity_key: e for e in entity.children}
updated_children = {}
for key, child in new_children.items():
existing_child = existing_children.get(key)
updated_children[key] = (
cls._merge_columns(child, existing_child, include_children=True)
if existing_child
else child
)
cls._append_children(existing_entity, *updated_children.values())
return existing_entity return existing_entity