Skip to content

Commit

Permalink
fix handling to be unique on name AND identifier
Browse files Browse the repository at this point in the history
  • Loading branch information
ajtmccarty committed Feb 3, 2025
1 parent dd25cb1 commit a842562
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 12 deletions.
14 changes: 11 additions & 3 deletions backend/infrahub/core/diff/enricher/labels.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
4 changes: 1 addition & 3 deletions backend/infrahub/core/diff/enricher/path_identifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
15 changes: 10 additions & 5 deletions backend/infrahub/core/diff/query_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand Down Expand Up @@ -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():
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit a842562

Please sign in to comment.