可以用程序获取元素的根节点吗



我需要检查一个元素是否包含在给定的根节点(模型(中。

我目前正在存储库中查询parent_ID为0的package类型的所有元素,然后获取根包中的元素集合,并检查该元素是否包含在那里。

function belongsToModel(element, model) {
var thequery = "SELECT * from t_object obj inner join t_package pkg on (obj.package_id = pkg.package_id) where obj.object_type = 'Package' and pkg.parent_ID=0"     
var thepackage;
var checkname;
var stereotypeElement;
var stereotypeElementsList = Repository.GetElementSet(thequery, 2);
var packageElement
var thePackageElement
var elementCollection
Session.Output("- Elements to process: " + stereotypeElementsList.Count);
for (var i = 0; i < stereotypeElementsList.Count; i++) {
stereotypeElement = stereotypeElementsList.GetAt(i);
var packageElement = Repository.GetPackageByID(stereotypeElement.PackageID);
if (packageElement.Name == model){
thePackageElement = stereotypeElement
Session.Output("DEBUG packages: " + packageElement.Name + " element to check " + element.Name)
elementCollection = thePackageElement.Elements;
Session.Output("DEBUG Element Count: " + elementCollection.Count)
checkname = elementCollection.GetByName(element.Name) 
if (checkname != undefined){
Session.Output("DEBUG element found: " + checkname.Name)
}
}
}
return checkname
}

然而,这是不起作用的,它真的感觉像是一个非常粗糙的变通方法。

有没有什么简单的方法可以检查我遗漏的内容?

谢谢!

我想知道你为什么把事情弄得这么复杂。只需遍历一个元素的packageid,直到达到零父元素为止。你来了。

类似(没有特定语言(:

ptr = element.packageId
while ptr != 0 {
root = ptr
ptr = repository.getPackageById(ptr).parentId
}

root将最终保存根包的id。

您现在要检查的是,元素是否直接存储在根节点下(它永远不会直接存储(,因为EA迫使您首先在根节点下面创建包。

您需要检查的是,元素是否在根节点启动的分支中的包中。

最简单的方法是首先获取分支的所有packageID的列表,然后检查元素的packageID是否在该列表中。

使用API获取packageID需要花费大量时间,因此如果使用SQL查询,速度会更快。

VBScript解决方案

来自Util脚本

'get the package id string of the given package tree
function getPackageTreeIDString(package)
dim allPackageTreeIDs 
set allPackageTreeIDs = CreateObject("System.Collections.ArrayList")
dim parentPackageIDs
set parentPackageIDs = CreateObject("System.Collections.ArrayList")
if not package is nothing then
parentPackageIDs.Add package.PackageID
end if
'get the actual package ids
getPackageTreeIDsFast allPackageTreeIDs, parentPackageIDs
'return
getPackageTreeIDString = Join(allPackageTreeIDs.ToArray,",")
end function
function getPackageTreeIDsFast(allPackageTreeIDs, parentPackageIDs)
if parentPackageIDs.Count = 0 then
if allPackageTreeIDs.Count = 0 then
'make sure there is at least a 0 in the allPackageTreeIDs
allPackageTreeIDs.Add "0"
end if
'then exit
exit function
end if
'add the parent package ids
allPackageTreeIDs.AddRange(parentPackageIDs)
'get the child package IDs
dim sqlGetPackageIDs
sqlGetPackageIDs = "select p.Package_ID from t_package p where p.Parent_ID in (" & Join(parentPackageIDs.ToArray, ",") & ")"
dim queryResult
set queryResult = getVerticalArrayListFromQuery(sqlGetPackageIDs)
if queryResult.Count > 0 then
dim childPackageIDs
set childPackageIDs = queryResult(0)
'call recursive function with child package id's
getPackageTreeIDsFast allPackageTreeIDs, childPackageIDs
end if
end function
function getVerticalArrayListFromQuery(sqlQuery)
dim xmlResult
xmlResult = Repository.SQLQuery(sqlQuery)
set getVerticalArrayListFromQuery = convertQueryResultToVerticalArrayList(xmlResult)
end function
Function convertQueryResultToVerticalArrayList(xmlQueryResult)
Dim result
set result = CreateObject("System.Collections.ArrayList")
Dim xDoc 
Set xDoc = CreateObject( "MSXML2.DOMDocument" )
'load the resultset in the xml document
If xDoc.LoadXML(xmlQueryResult) Then        
'select the rows
Dim rowList
Set rowList = xDoc.SelectNodes("//Row")
Dim rowNode 
Dim fieldNode
dim firstRow
firstRow = true
'loop rows and find fields
For Each rowNode In rowList
if firstRow then
For Each fieldNode In rowNode.ChildNodes
'add an arraylist for each column
result.Add CreateObject("System.Collections.ArrayList")
next
end if
'loop the field nodes
dim i
i = 0
For Each fieldNode In rowNode.ChildNodes
'add the contents to the correct column arraylist
result(i).Add fieldNode.Text
i = i + 1
Next
Next
end if
set convertQueryResultToVerticalArrayList = result
end function

C#解决方案

来自包装类

private List<string> getPackageTreeIDs(List<string> parentIDs = null)
{
List<string> allPackageIDs = new List<string>();
List<string> subPackageIDs = new List<string>();
if (parentIDs == null)
{
parentIDs = new List<string>() { this.packageID.ToString() };
}
//add the current parentID's to the list of all ID's
allPackageIDs.AddRange(parentIDs);
//get the id's from the subpackages
string parentIDString = string.Join(",", parentIDs);
string getSubpackageSQL = "select p.Package_ID from t_package p where p.Parent_ID in (" + parentIDString + ")";
var queryResult = this.EAModel.SQLQuery(getSubpackageSQL);
foreach (XmlNode packageIdNode in queryResult.SelectNodes(this.EAModel.formatXPath("//Package_ID")))
{
subPackageIDs.Add(packageIdNode.InnerText);
}
//if subpackages found then go a level deeper
if (subPackageIDs.Any())
{
allPackageIDs.AddRange(this.getPackageTreeIDs(subPackageIDs));
}
return allPackageIDs;
}

最新更新