Skip to content

Commit bc53c31

Browse files
committed
ST6RI-815 Used hash maps for distinguishibility check for performance.
- Also moved clearing of caches to ElementUtil.transformAll.
1 parent 97bade2 commit bc53c31

2 files changed

Lines changed: 45 additions & 13 deletions

File tree

org.omg.kerml.xtext/src/org/omg/kerml/xtext/validation/KerMLValidator.xtend

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ import org.omg.sysml.util.ImplicitGeneralizationMap
9898

9999
import org.omg.sysml.expressions.util.EvaluationUtil
100100
import java.util.Collections
101+
import java.util.HashMap
102+
import java.util.Set
103+
import java.util.Map
101104

102105
/**
103106
* This class contains custom validation rules.
@@ -379,31 +382,59 @@ class KerMLValidator extends AbstractKerMLValidator {
379382
val ownedMemberships = namesp.ownedMembership
380383
val owningMemberships = ownedMemberships.filter[m | m instanceof OwningMembership]
381384
val aliasMemberships = ownedMemberships.filter[m | !(m instanceof OwningMembership)]
385+
386+
val owningMembershipMap = owningMemberships.nameMap
382387
for (mem: owningMemberships) {
383-
checkDistinguishibility(mem, owningMemberships, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG)
388+
checkDistinguishibility(mem, owningMembershipMap, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG)
384389
}
390+
391+
val aliasMembershipMap = aliasMemberships.nameMap
385392
for (mem: aliasMemberships) {
386-
checkDistinguishibility(mem, owningMemberships, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_0)
387-
checkDistinguishibility(mem, aliasMemberships, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_1)
393+
checkDistinguishibility(mem, owningMembershipMap, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_0)
394+
checkDistinguishibility(mem, aliasMembershipMap, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_1)
388395
}
389396
if (namesp instanceof Type) {
390-
ElementUtil.clearCachesOf(namesp)
391-
val inheritedMemberships = namesp.inheritedMembership
397+
val inheritedMembershipMap = namesp.inheritedMembership.nameMap
392398
for (mem: ownedMemberships) {
393-
checkDistinguishibility(mem, inheritedMemberships, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_2)
399+
checkDistinguishibility(mem, inheritedMembershipMap, INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_2)
394400
}
395401
}
396402
}
397403
}
398404

399-
def checkDistinguishibility(Membership mem, Iterable<Membership> others, String msg) {
405+
def nameMap(Iterable<Membership> memberships) {
406+
var nameMap = new HashMap<String, Set<Membership>>()
407+
for (mem: memberships) {
408+
val shortName = mem.memberShortName
409+
val name = mem.memberName
410+
if (shortName !== null) {
411+
var mems = nameMap.get(shortName)
412+
if (mems === null) {
413+
mems = newHashSet
414+
nameMap.put(shortName, mems)
415+
}
416+
mems.add(mem)
417+
}
418+
if (name !== null) {
419+
var mems = nameMap.get(name)
420+
if (mems === null) {
421+
mems = newHashSet
422+
nameMap.put(name, mems)
423+
}
424+
mems.add(mem)
425+
}
426+
}
427+
return nameMap;
428+
}
429+
430+
def checkDistinguishibility(Membership mem, Map<String, Set<Membership>> nameMap, String msg) {
400431
val memShortName = mem.memberShortName
401432
val memName = mem.memberName
402-
403-
val distinctOthers = others.filter[other | mem.memberElement !== other.memberElement]
433+
val memElement = mem.memberElement
434+
404435
if (memShortName !== null) {
405-
val dups = distinctOthers.filter[other | memShortName == other.memberShortName || memShortName == other.memberName]
406-
if (!dups.empty) {
436+
var dups = nameMap.get(memShortName)?.filter[m | m.memberElement != memElement]
437+
if (dups !== null && !dups.empty) {
407438
val msgDups = msg.identifyDuplicates(mem.membershipOwningNamespace, memShortName, dups)
408439
if (mem instanceof OwningMembership) {
409440
warning(msgDups, mem.ownedMemberElement, SysMLPackage.eINSTANCE.element_DeclaredShortName, INVALID_NAMESPACE_DISTINGUISHABILITY)
@@ -413,8 +444,8 @@ class KerMLValidator extends AbstractKerMLValidator {
413444
}
414445
}
415446
if (memName !== null) {
416-
val dups = distinctOthers.filter[other | memName == other.memberShortName || memName == other.memberName]
417-
if (!dups.empty) {
447+
val dups = nameMap.get(memName)?.filter[m | m.memberElement != memElement]
448+
if (dups !== null && !dups.empty) {
418449
val msgDups = msg.identifyDuplicates(mem.membershipOwningNamespace, memName, dups)
419450
if (mem instanceof OwningMembership) {
420451
warning(msgDups, mem.ownedMemberElement, SysMLPackage.eINSTANCE.element_DeclaredName, INVALID_NAMESPACE_DISTINGUISHABILITY)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ public static void transformAll(Element root, boolean addImplicitElements) {
328328
root.setIsImpliedIncluded(true);
329329
TypeUtil.insertImplicitBindingConnectors((Type) root);
330330
}
331+
clearCachesOf(root);
331332
transform(root);
332333
for (Relationship relationship: root.getOwnedRelationship()) {
333334
// transformAll(relationship, addImplicitElements);

0 commit comments

Comments
 (0)