From a842562fb8d524292a0e259322ae379112c1f718 Mon Sep 17 00:00:00 2001 From: Aaron McCarty Date: Mon, 3 Feb 2025 14:31:35 -0800 Subject: [PATCH] fix handling to be unique on name AND identifier --- backend/infrahub/core/diff/enricher/labels.py | 14 +++++++++++--- .../core/diff/enricher/path_identifier.py | 4 +--- backend/infrahub/core/diff/query_parser.py | 15 ++++++++++----- .../core/diff/test_path_identifier_enricher.py | 3 ++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/backend/infrahub/core/diff/enricher/labels.py b/backend/infrahub/core/diff/enricher/labels.py index c228fb44e3..9b4ab84d84 100644 --- a/backend/infrahub/core/diff/enricher/labels.py +++ b/backend/infrahub/core/diff/enricher/labels.py @@ -154,10 +154,18 @@ def _update_relationship_labels(self, enriched_diff: EnrichedDiffRoot) -> None: for node in enriched_diff.nodes: if not node.relationships: continue - node_schema = self.db.schema.get(name=node.kind, branch=self.diff_branch_name, duplicate=False) + + node_schema = self.db.schema.get(name=node.kind, branch=enriched_diff.diff_branch_name, duplicate=False) + alternate_node_schema = None + if enriched_diff.diff_branch_name != enriched_diff.base_branch_name: + alternate_node_schema = self.db.schema.get( + name=node.kind, branch=enriched_diff.base_branch_name, duplicate=False + ) for relationship_diff in node.relationships: - relationship_schema = node_schema.get_relationship(name=relationship_diff.name) - relationship_diff.label = relationship_schema.label or "" + relationship_schema = node_schema.get_relationship_or_none(name=relationship_diff.name) + if not relationship_schema and alternate_node_schema: + relationship_schema = alternate_node_schema.get_relationship_or_none(name=relationship_diff.name) + relationship_diff.label = relationship_schema.label or "" if relationship_schema else "" async def _get_display_label_map( self, display_label_requests: set[DisplayLabelRequest] diff --git a/backend/infrahub/core/diff/enricher/path_identifier.py b/backend/infrahub/core/diff/enricher/path_identifier.py index dac3e07fe6..0d1da16475 100644 --- a/backend/infrahub/core/diff/enricher/path_identifier.py +++ b/backend/infrahub/core/diff/enricher/path_identifier.py @@ -44,12 +44,10 @@ async def enrich(self, enriched_diff_root: EnrichedDiffRoot, calculated_diffs: C attribute_property.path_identifier = property_path.get_path() if not node.relationships: continue - node_schema = self.db.schema.get(name=node.kind, branch=self.diff_branch_name, duplicate=False) for relationship in node.relationships: - relationship_schema = node_schema.get_relationship(name=relationship.name) path_type = ( PathType.RELATIONSHIP_ONE - if relationship_schema.cardinality is RelationshipCardinality.ONE + if relationship.cardinality is RelationshipCardinality.ONE else PathType.RELATIONSHIP_MANY ) relationship_path = DataPath( diff --git a/backend/infrahub/core/diff/query_parser.py b/backend/infrahub/core/diff/query_parser.py index ffd994f71f..90ea9b98e8 100644 --- a/backend/infrahub/core/diff/query_parser.py +++ b/backend/infrahub/core/diff/query_parser.py @@ -400,7 +400,8 @@ class DiffNodeIntermediate(TrackedStatusUpdates): from_time: Timestamp status: RelationshipStatus attributes_by_name: dict[str, DiffAttributeIntermediate] = field(default_factory=dict) - relationships_by_identifier: dict[str, DiffRelationshipIntermediate] = field(default_factory=dict) + # {(name, identifier): DiffRelationshipIntermediate} + relationships_by_identifier: dict[tuple[str, str], DiffRelationshipIntermediate] = field(default_factory=dict) def to_diff_node(self, from_time: Timestamp, include_unchanged: bool) -> DiffNode: attributes = [] @@ -669,7 +670,9 @@ def _get_diff_relationship( relationship_schema: RelationshipSchema, database_path: DatabasePath, ) -> DiffRelationshipIntermediate: - diff_relationship = diff_node.relationships_by_identifier.get(relationship_schema.get_identifier()) + diff_relationship = diff_node.relationships_by_identifier.get( + (relationship_schema.name, relationship_schema.get_identifier()) + ) if not diff_relationship: branch_name = database_path.deepest_branch from_time = self.from_time @@ -683,7 +686,9 @@ def _get_diff_relationship( identifier=relationship_schema.get_identifier(), from_time=from_time, ) - diff_node.relationships_by_identifier[relationship_schema.get_identifier()] = diff_relationship + diff_node.relationships_by_identifier[relationship_schema.name, relationship_schema.get_identifier()] = ( + diff_relationship + ) return diff_relationship def _apply_base_branch_previous_values(self) -> None: @@ -720,8 +725,8 @@ def _apply_attribute_previous_values( def _apply_relationship_previous_values( self, diff_node: DiffNodeIntermediate, base_diff_node: DiffNodeIntermediate ) -> None: - for relationship_identifier, diff_relationship in diff_node.relationships_by_identifier.items(): - base_diff_relationship = base_diff_node.relationships_by_identifier.get(relationship_identifier) + for relationship_key, diff_relationship in diff_node.relationships_by_identifier.items(): + base_diff_relationship = base_diff_node.relationships_by_identifier.get(relationship_key) if not base_diff_relationship: continue for db_id, property_set in diff_relationship.properties_by_db_id.items(): diff --git a/backend/tests/unit/core/diff/test_path_identifier_enricher.py b/backend/tests/unit/core/diff/test_path_identifier_enricher.py index 3a654f7f5b..853f9f831f 100644 --- a/backend/tests/unit/core/diff/test_path_identifier_enricher.py +++ b/backend/tests/unit/core/diff/test_path_identifier_enricher.py @@ -1,3 +1,4 @@ +from infrahub.core.constants import RelationshipCardinality from infrahub.core.constants.database import DatabaseEdgeType from infrahub.core.diff.enricher.path_identifier import DiffPathIdentifierEnricher from infrahub.core.diff.model.diff import ModifiedPathType @@ -28,7 +29,7 @@ async def test_path_identifiers_added(self, db: InfrahubDatabase, car_person_sch properties={diff_relationship_property, diff_relationship_value_property} ) diff_relationship = EnrichedRelationshipGroupFactory.build( - relationships={diff_relationship_element}, name="cars" + relationships={diff_relationship_element}, name="cars", cardinality=RelationshipCardinality.MANY ) diff_node = EnrichedNodeFactory.build( relationships={diff_relationship}, attributes={diff_attribute}, kind="TestPerson"