Skip to content

Commit 97a9854

Browse files
committed
ST6RI-925 Cached Type::featureMemberships to improve performance.
1 parent fe8b084 commit 97a9854

3 files changed

Lines changed: 30 additions & 18 deletions

File tree

org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.omg.sysml.lang.sysml.Element;
4747
import org.omg.sysml.lang.sysml.Expression;
4848
import org.omg.sysml.lang.sysml.Feature;
49+
import org.omg.sysml.lang.sysml.FeatureMembership;
4950
import org.omg.sysml.lang.sysml.Specialization;
5051
import org.omg.sysml.lang.sysml.Membership;
5152
import org.omg.sysml.lang.sysml.ResultExpressionMembership;
@@ -202,18 +203,38 @@ protected Collection<Feature> getFeaturesRedefinedByType() {
202203
}
203204
return redefinedFeatures;
204205
}
206+
207+
public EList<FeatureMembership> getFeatureMembership() {
208+
if (featureMembership == null) {
209+
Type target = getTarget();
210+
EList<FeatureMembership> featureMemberships = new NonNotifyingEObjectEList<FeatureMembership>(FeatureMembership.class, (InternalEObject) target, SysMLPackage.TYPE__FEATURE_MEMBERSHIP);
211+
featureMemberships.addAll(target.getOwnedFeatureMembership());
212+
// For improved performance, compute supertypes only once.
213+
List<Type> allSupertypes = target.allSupertypes();
214+
for (Membership membership: target.getInheritedMembership()) {
215+
if (membership instanceof FeatureMembership &&
216+
allSupertypes.contains(membership.getMembershipOwningNamespace())) {
217+
featureMemberships.add((FeatureMembership)membership);
218+
}
219+
}
220+
featureMembership = featureMemberships;
221+
}
222+
return featureMembership;
223+
}
205224

206225
// Caching
207226

208227
private EList<Membership> inheritedMembership = null;
209228
private EList<Membership> nonPrivateMembership = null;
210-
private Collection<Feature> redefinedFeatures = null;
229+
private Collection<Feature> redefinedFeatures = null;
230+
private EList<FeatureMembership> featureMembership = null;
211231

212232
public void clearCaches() {
213233
super.clearCaches();
214234
inheritedMembership = null;
215235
nonPrivateMembership = null;
216236
redefinedFeatures = null;
237+
featureMembership = null;
217238
}
218239

219240
// Implicit Elements
Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
33
* Copyright (c) 2022 Siemens AG
4-
* Copyright (c) 2022 Model Driven Solutions, Inc.
4+
* Copyright (c) 2022, 2026 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
77
* it under the terms of the GNU Lesser General Public License as published by
@@ -22,13 +22,11 @@
2222

2323
package org.omg.sysml.delegate.setting;
2424

25-
import java.util.List;
2625
import org.eclipse.emf.common.util.EList;
2726
import org.eclipse.emf.ecore.EStructuralFeature;
2827
import org.eclipse.emf.ecore.InternalEObject;
29-
import org.omg.sysml.lang.sysml.FeatureMembership;
3028
import org.omg.sysml.lang.sysml.Type;
31-
import org.omg.sysml.util.NonNotifyingEObjectEList;
29+
import org.omg.sysml.util.TypeUtil;
3230

3331
public class Type_featureMembership_SettingDelegate extends BasicDerivedListSettingDelegate {
3432

@@ -38,18 +36,7 @@ public Type_featureMembership_SettingDelegate(EStructuralFeature eStructuralFeat
3836

3937
@Override
4038
protected EList<?> basicGet(InternalEObject owner) {
41-
Type self = (Type)owner;
42-
43-
EList<FeatureMembership> featureMemberships = new NonNotifyingEObjectEList<>(FeatureMembership.class, owner, eStructuralFeature.getFeatureID());
44-
featureMemberships.addAll(self.getOwnedFeatureMembership());
45-
// For improved performance, compute supertypes only once.
46-
List<Type> allSupertypes = self.allSupertypes();
47-
self.getInheritedMembership().stream().
48-
filter(FeatureMembership.class::isInstance).
49-
map(FeatureMembership.class::cast).
50-
filter(membership->allSupertypes.contains(membership.getOwningType())).
51-
forEachOrdered(featureMemberships::add);
52-
return featureMemberships;
39+
return TypeUtil.getFeatureMembershipOf((Type)owner);
5340
}
5441

5542
}

org.omg.sysml/src/org/omg/sysml/util/TypeUtil.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2022, 2024-2025 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2022, 2024-2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -104,6 +104,10 @@ public static List<Feature> getFeaturesRedefinedBy(Type type, Feature skip) {
104104
flatMap(feature->FeatureUtil.getRedefinedFeaturesWithComputedOf(feature).stream()).
105105
toList();
106106
}
107+
108+
public static EList<FeatureMembership> getFeatureMembershipOf(Type type) {
109+
return getTypeAdapter(type).getFeatureMembership();
110+
}
107111

108112
// Supertypes
109113

0 commit comments

Comments
 (0)