Skip to content

ST6RI-919 Update derived properties to handle implied relationships#748

Merged
seidewitz merged 2 commits intomasterfrom
ST6RI-919
Apr 2, 2026
Merged

ST6RI-919 Update derived properties to handle implied relationships#748
seidewitz merged 2 commits intomasterfrom
ST6RI-919

Conversation

@seidewitz
Copy link
Copy Markdown
Member

This PR updates the derived property computation for Feature::crossFeature to properly account for an implied cross subsetting.

Change

  • The code in Feature_crossFeature_SettingDelegate::basicGet was updated to simply call the utility method FeatureUtil::getCrossFeatureOf, which already computed the crossFeature correctly.

Note

After analysis, it was decided that the above change was the only update necessary to handle implied relationships. With this change, the consistent rules for derived properties are:

  1. Implied relationships and binding connectors implemented implicitly are not included in any derived property values. For example, getOwnedSpecializations does not include implicit specializations, and getOwnedMembers does not include implicit binding connectors.
  2. Otherwise, derived property and operation implementations take implied relationships and binding connectors into account. So, supertypes includes supertypes via implied specializations and getInheritedMemberships includes memberships inherited via implied specializations.

To include implied relationships and binding connectors in all cases, call ElementUtil.transformAll(root, true) to add them physically to the abstract syntax tree (the second argument is a boolean flag to addImplicitElements.

- The utility method FeatureUtil.getCrossFeatureOf already did the
correct computation and only needed to be called from the delegate.
@seidewitz seidewitz self-assigned this Mar 28, 2026
@seidewitz seidewitz added the bug Something isn't working label Mar 28, 2026
@seidewitz seidewitz requested a review from himi March 28, 2026 20:58
@seidewitz seidewitz added this to the 2026-02 milestone Mar 28, 2026
@himi
Copy link
Copy Markdown
Member

himi commented Apr 2, 2026

I tested it with

package ProjectTask {
 	item def Project;
 	part def Member {
 		item skills : Skill[1..*];
 	}
 	item def Skill;

   connection def ProjectMemberConnection {
        end [1] ref project : Project;
        end [1..*] ref member : Member;
    }
    
    connection def TaskC {
        end [1] ref project : Project;
        end [1..*] ref member : Member;
        end ref skill : Skill crosses member.skills;
    }
    
    connection def TaskI {
        end [1] ref project : Project;
        end [1..*] ref member : Member;
        end [1..*] ref skill : Skill;
    }
}

And them I could get:

ConnectionDefinition ProjectMemberConnection (a4dcb0f1-8221-4cd7-87a1-29a5bb56bace)
  [Subclassification (implicit)] ConnectionDefinition BinaryConnection (05897e11-dd8e-51a1-80a2-c16d5da71912)
  [FeatureMembership] ReferenceUsage project (aca26d6d-587d-4fbf-91d0-def81102ddc2)
    [Redefinition (implicit)] ReferenceUsage source (acd2e375-f12d-5cec-b81d-c7c24bf06d5c)
    [CrossSubsetting (implicit)] Feature member. (499e9fa1-0bfe-4eea-805c-302323c6f700)
    [OwningMembership] ReferenceUsage (48e82041-77a9-4a93-82cb-8219c3b3cb58)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] ItemDefinition Project (ab9972bc-3f9d-476e-a949-544df3b37217)
      [OwningMembership] MultiplicityRange (19371dd4-d90e-4c9b-8331-19557719aed3)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (e8defb4d-99c0-4c3e-a62a-495ebb12780a)
    [FeatureTyping] ItemDefinition Project (ab9972bc-3f9d-476e-a949-544df3b37217)
    [OwningMembership] Multiplicity (1b55bf81-6b05-4d24-af6a-9a58e340ef03)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)
  [FeatureMembership] ReferenceUsage member (7a89a514-3e6b-463d-ad03-99d70039ddaf)
    [Redefinition (implicit)] ReferenceUsage target (41d2ef16-9a82-5a09-a78a-ca23991c859a)
    [CrossSubsetting (implicit)] Feature project. (e2ab077e-b81d-40bd-8667-19ad566a8860)
    [OwningMembership] ReferenceUsage (9d4086cb-cfef-48be-b788-8140eef61f59)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] PartDefinition Member (0be8ca8a-21dc-49a2-9588-0b10f12e391f)
      [OwningMembership] MultiplicityRange (ead7f9dc-4e5e-4663-bf4c-599ca89e5250)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (b80e9752-53d4-4eb1-aff3-68cf5f88e6f4)
        [OwningMembership] LiteralInfinity * (062babad-a561-44d1-b6cd-d35ac940f8fb)
    [FeatureTyping] PartDefinition Member (0be8ca8a-21dc-49a2-9588-0b10f12e391f)
    [OwningMembership] Multiplicity (3183ccba-fc40-4698-9d0a-8461c83accdc)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)

,

ConnectionDefinition TaskC (2d7812ec-c7ee-4fc1-bc71-2ce31167e8bc)
  [Subclassification (implicit)] ConnectionDefinition Connection (e40bf5fe-e2e4-56c0-b7a6-0b06988f6aae)
  [FeatureMembership] ReferenceUsage project (c8e97a26-30a5-4898-85db-6dcec0ccc15e)
    [Subsetting (implicit)] Feature participant (36b3c94b-3932-5d15-8d08-ebc1c1ecf830)
    [CrossSubsetting (implicit)] Feature  (d6426d66-de54-4f9b-ac38-d03d3b1a94a8)
    [OwningMembership] ReferenceUsage (9332ac0b-cdb8-4e67-844f-ff5a457643a9)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] ItemDefinition Project (db56fe18-0ed1-46e7-8a44-d0810f780d66)
      [OwningMembership] MultiplicityRange (8a3a1e45-d0ca-4395-b211-1e0c01e17ddd)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (df549f29-904e-4baa-a95b-a2ba3e455f88)
    [FeatureTyping] ItemDefinition Project (db56fe18-0ed1-46e7-8a44-d0810f780d66)
    [OwningMembership] Multiplicity (16891760-7046-4159-bb10-b977563d801e)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)
  [FeatureMembership] ReferenceUsage member (c7e243c5-2fd6-4dcd-ad95-f96225f4c9d4)
    [Subsetting (implicit)] Feature participant (36b3c94b-3932-5d15-8d08-ebc1c1ecf830)
    [CrossSubsetting (implicit)] Feature  (3b77eecf-5a59-4bed-aa52-4d50af24c124)
    [OwningMembership] ReferenceUsage (782cc224-7011-4a1d-9847-dddcfda26d3e)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] PartDefinition Member (89648e90-9744-4402-9157-a5ff711d41ec)
      [OwningMembership] MultiplicityRange (33ea64be-0c74-4c5e-8caa-b0474a01ec4f)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (288c1064-d911-4f5d-9ab4-4a3b37dcd795)
        [OwningMembership] LiteralInfinity * (c43b1ec8-585f-4208-b395-7937dd9aedbc)
    [FeatureTyping] PartDefinition Member (89648e90-9744-4402-9157-a5ff711d41ec)
    [OwningMembership] Multiplicity (c879a4dc-b33a-4ef2-af22-2c12cf0cb4a8)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)
  [FeatureMembership] ReferenceUsage skill (f726c355-2137-4d37-b2cb-dc6a42390e92)
    [Subsetting (implicit)] Feature participant (36b3c94b-3932-5d15-8d08-ebc1c1ecf830)
    [FeatureTyping] ItemDefinition Skill (16d3d6bf-4c62-4dfb-9128-575f35795d8f)
    [CrossSubsetting] Feature member.skills (483401b1-f3eb-49cf-9439-892115bbda3e)
      [Subsetting (implicit)] Feature things (3176ab6a-8d7b-5e14-b263-57bd30f77f78)
      [FeatureChaining] ReferenceUsage member (c7e243c5-2fd6-4dcd-ad95-f96225f4c9d4)
      [FeatureChaining] ItemUsage skills (f9c89f6e-06c1-4010-82ba-958fb6b71f90)
    [OwningMembership] Multiplicity (55a27739-164f-443b-8412-5dc91a5b7d57)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)

and

ConnectionDefinition TaskI (a72274dc-77ab-4061-8e4c-fe051abf0451)
  [Subclassification (implicit)] ConnectionDefinition Connection (e40bf5fe-e2e4-56c0-b7a6-0b06988f6aae)
  [FeatureMembership] ReferenceUsage project (349e13ad-5ce3-423d-b42d-130805d05b1a)
    [Subsetting (implicit)] Feature participant (36b3c94b-3932-5d15-8d08-ebc1c1ecf830)
    [CrossSubsetting (implicit)] Feature  (225cebe2-9ef8-452d-94e9-240445483a8a)
    [OwningMembership] ReferenceUsage (47ee42fc-5f8e-4b9a-b0ae-dddb462ba519)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] ItemDefinition Project (db56fe18-0ed1-46e7-8a44-d0810f780d66)
      [OwningMembership] MultiplicityRange (9ec92880-8a48-46d7-a6cb-f66f1936412a)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (7abf8f0b-e25d-431b-be0e-d7b5cbbbb625)
    [FeatureTyping] ItemDefinition Project (db56fe18-0ed1-46e7-8a44-d0810f780d66)
    [OwningMembership] Multiplicity (f1401d60-8c40-4da7-bcf4-0c9d4679dd91)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)
  [FeatureMembership] ReferenceUsage member (e5296625-7b5e-4180-87d0-63c0b5e449d8)
    [Subsetting (implicit)] Feature participant (36b3c94b-3932-5d15-8d08-ebc1c1ecf830)
    [CrossSubsetting (implicit)] Feature  (0f9c7074-a0ec-419f-aaf4-8d361f363e1d)
    [OwningMembership] ReferenceUsage (cc08b615-7410-446c-b284-8047e799314c)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] PartDefinition Member (89648e90-9744-4402-9157-a5ff711d41ec)
      [OwningMembership] MultiplicityRange (80f527d6-1139-4ddb-b516-5baad7764681)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (6b748999-c61a-47d9-a2a3-17a7218e19e1)
        [OwningMembership] LiteralInfinity * (68e45491-3299-4e36-bc9d-6d0a1fd245bd)
    [FeatureTyping] PartDefinition Member (89648e90-9744-4402-9157-a5ff711d41ec)
    [OwningMembership] Multiplicity (22b57a45-9bd5-41ee-bff4-a168dc9063dd)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)
  [FeatureMembership] ReferenceUsage skill (f88a61db-0151-44f1-8500-a05d262087f3)
    [Subsetting (implicit)] Feature participant (36b3c94b-3932-5d15-8d08-ebc1c1ecf830)
    [CrossSubsetting (implicit)] Feature  (630c10e9-db0c-401b-9828-5ca9a9498128)
    [OwningMembership] ReferenceUsage (6576eb03-6a8a-46c0-991e-7e9a5c176d9d)
      [Subsetting (implicit)] Feature objects (33d1bd68-58e2-555e-98a3-b0b679542260)
      [FeatureTyping (implicit)] ItemDefinition Skill (16d3d6bf-4c62-4dfb-9128-575f35795d8f)
      [OwningMembership] MultiplicityRange (455eaa59-c6ca-404d-9b5c-645166664a97)
        [Subsetting (implicit)] Feature naturals (7f46a88a-4eb2-501d-ad8b-9eefbb9b38e9)
        [OwningMembership] LiteralInteger 1 (72da1767-24e2-4c15-b046-e1a7302b8c52)
        [OwningMembership] LiteralInfinity * (f395dcd0-a8d0-485c-b148-2e145136ef2f)
    [FeatureTyping] ItemDefinition Skill (16d3d6bf-4c62-4dfb-9128-575f35795d8f)
    [OwningMembership] Multiplicity (a922be2b-d3c3-4aa6-b072-7c24c39c3868)
      [Subsetting (implicit)] MultiplicityRange exactlyOne (64e18b84-0e05-5c95-a003-c0f60a269893)

I found no major issues.

@himi
Copy link
Copy Markdown
Member

himi commented Apr 2, 2026

I found only ProjectMemberConnection having two ends showed the cross substrings with feature chain names:

[CrossSubsetting (implicit)] Feature member. (499e9fa1-0bfe-4eea-805c-302323c6f700)

But in TaskC and TaskI, feature chain name is not printed:

[CrossSubsetting (implicit)] Feature  (d6426d66-de54-4f9b-ac38-d03d3b1a94a8)

I do not think it's critical but showing feature chains would be more helpful to understand.

@himi
Copy link
Copy Markdown
Member

himi commented Apr 2, 2026

I have one question on end features. We can also write ends without ReferenceUsage such as

connection def ProjectMemberConnection {
        end [1] item project : Project;
        end [1..*] part member : Member;
}

But I'm not so sure about the semantic differences. Is this model is relevant as well?

@seidewitz
Copy link
Copy Markdown
Member Author

I do not think it's critical but showing feature chains would be more helpful to understand.

For a binary connection, the first feature in the feature chains for cross subsetting is an actual end feature of the connection. That is the name being shown.

For ternary and higher connections, the first feature in the feature chains for cross subsetting is a constructed "Cartesian product" feature without a name. So, neither feature in the feature chain has a name, and there is nothing to show.

@seidewitz seidewitz merged commit f61a1df into master Apr 2, 2026
2 checks passed
@seidewitz seidewitz modified the milestones: 2026-02, 2026-03 Apr 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants