Skip to content

Instantly share code, notes, and snippets.

@YMA-MDL
Created May 12, 2016 11:49
Show Gist options
  • Select an option

  • Save YMA-MDL/07e22c7b310d9796c226e6ff27c9ada7 to your computer and use it in GitHub Desktop.

Select an option

Save YMA-MDL/07e22c7b310d9796c226e6ff27c9ada7 to your computer and use it in GitHub Desktop.
System.Diagnostics.Debugger.Break();
// Example request
// <Item type="tha_Node" id="E2E7D574B0E2449DA6367CD0F8D01448" project="Proj1" fromStream="Trunk" fromVersion="1" toStream="Trunk">...
Innovator inn = this.getInnovator();
// Get the main node informations
string proj = this.getAttribute("project");
if (proj == null) return inn.newError("Project is required");
string fromStream = this.getAttribute("fromStream");
if (fromStream == null) return inn.newError("fromStream is required");
string toStream = this.getAttribute("toStream");
if (toStream == null) return inn.newError("toStream is required");
string fromVersion = this.getAttribute("fromVersion");
if (fromVersion == null) return inn.newError("fromVersion is required");
// get the existing stream
Item existingStream = inn.newItem("tha_StreamVersion","get");
existingStream.setProperty("name",fromStream);
existingStream = existingStream.apply();
string existingStreamId = existingStream.getItemByIndex(0).getID();
string newStreamVersionId ;
string newStreamId;
string editStreamId;
// create the newstream
if (fromStream != toStream){
Item newStream = inn.newItem("tha_Stream","add");
newStream.setProperty("name",toStream);
Item newStreamV = inn.newItem("tha_StreamVersion","add");
newStreamV.setProperty("version","1");
newStream.addRelationship(newStreamV);
newStream = newStream.apply();
newStreamId = newStream.getID();
newStream= newStream.fetchRelationships("tha_StreamVersion");
newStreamVersionId = newStream.getItemsByXPath("//Item[@type='tha_StreamVersion']").getItemByIndex(0).getID();
} else {
Item editStream = inn.newItem("tha_Stream","edit");
editStream.setAttribute("where","[tha_Stream].name = '"+toStream+"'");
Item newStreamV = inn.newItem("tha_StreamVersion","add");
string newVersion = Convert.ToString(Convert.ToInt16(fromVersion)+1);
newStreamV.setProperty("version",newVersion);
editStream.addRelationship(newStreamV);
editStream = editStream.apply();
editStreamId = editStream.getID();
newStreamV = inn.newItem("tha_StreamVersion","get");
newStreamV.setAttribute("where","[tha_StreamVersion].source_id='"+editStreamId+"' AND [tha_StreamVersion].version='"+newVersion+"'");
newStreamV = newStreamV.apply();
newStreamVersionId = newStreamV.getID();
}
// For each Node, check the property values against the "from" Stream Version
Item nodes = this.getItemsByXPath("//Item[@type='tha_Node']");
for (int i=0; i<nodes.getItemCount(); i++){
Item node = nodes.getItemByIndex(i);
Item nodeSource = inn.newItem("tha_NodeVersion","get");
nodeSource.setAttribute("where","[THA_NODEVERSION].source_id='" + node.getID() + "' AND [THA_NODEVERSION].id in (select nve.source_id from [THA_NODEVERSIONEFFECTIVITY] nve inner join [THA_STREAMVERSION] sv on nve.stream_version=sv.id inner join [THA_STREAM] s on sv.source_id=s.id where s.name='"+fromStream+"' and sv.version='"+fromVersion+"')");
nodeSource = nodeSource.apply();
if (nodeSource.getItemCount()<1){
// create the node
Item newNode = inn.newItem("tha_Node","add");
newNode.setProperty("name",node.getProperty("name"));
Item newNodeVersion = inn.newItem("tha_NodeVersion","add");
newNodeVersion.setProperty("tha_prop1",node.getProperty("tha_prop1"));
newNodeVersion.setProperty("tha_prop2",node.getProperty("tha_prop2"));
Item nodeEff = inn.newItem("tha_NodeVersionEffectivity","add");
nodeEff.setProperty("stream_version",newStreamVersionId);
newNodeVersion.addRelationship(nodeEff);
newNode.addRelationship(newNodeVersion);
newNode = newNode.apply();
} else {
if ((node.getProperty("tha_prop1") != nodeSource.getProperty("tha_prop1")) || (node.getProperty("tha_prop2") != nodeSource.getProperty("tha_prop2"))) {
// if any properties have changed, create a new NodeVersion item and attach a NodeVersionEffectivity item for the new Stream Version
Item editedNode = inn.newItem("tha_Node","edit");
editedNode.setID(node.getID());
Item newNodeVersion = inn.newItem("tha_NodeVersion","add");
newNodeVersion.setProperty("tha_prop1",node.getProperty("tha_prop1"));
newNodeVersion.setProperty("tha_prop2",node.getProperty("tha_prop2"));
Item nodeEff = inn.newItem("tha_NodeVersionEffectivity","add");
nodeEff.setProperty("stream_version",newStreamVersionId);
newNodeVersion.addRelationship(nodeEff);
editedNode.addRelationship(newNodeVersion);
editedNode = editedNode.apply();
} else {
// find node version to edit
// == node version where node = node and nodeversioneff.streamversion = fromstreamversion
// Retrieve the effective Node Versions for each node in the array
// if all properties match, create a new NodeVersionEffectivity item for the new Stream Version and attach it to the existing Node Version
nodeSource.setAction("edit");
Item newNodeVersionEff = inn.newItem("tha_NodeVersionEffectivity","add");
newNodeVersionEff.setProperty("stream_version",newStreamVersionId);
nodeSource.addRelationship(newNodeVersionEff);
nodeSource = nodeSource.apply();
}
}
}
Item links = this.getItemsByXPath("//Item[@type='tha_Link']");
for (int i=0; i<links.getItemCount(); i++){
Item link = links.getItemByIndex(i);
Item linkSource = inn.newItem("tha_Link","get");
linkSource.setProperty("source_id",link.getProperty("source_id"));
linkSource.setProperty("related_id",link.getProperty("related_id"));
linkSource = linkSource.apply();
if (linkSource.getItemCount()>0) {
// if one exists, create a new LinkEffectivity item for the new Stream Version and attach it to the existing Link item
linkSource.setAction("edit");
Item linkEff = inn.newItem("tha_LinkEffectivity","add");
linkEff.setProperty("stream_version",newStreamVersionId);
linkSource.addRelationship(linkEff);
linkSource = linkSource.apply();
} else {
// if none exist, create a new Link item and attach a LinkEffectivity item for the new Stream Version
Item newLink = inn.newItem("tha_Link","add");
newLink.setProperty("source_id",link.getProperty("source_id"));
Item relatedItem = link.getProperty("related_id");
if (link.getProperty("related_id")== null){
Item newNode = ("tha_Node","get");
newNode.setAttribut("where","[tha_Node].name='"++"'");
} else {
}
newLink.setProperty("related_id",relatedItem);
Item linkEff = inn.newItem("tha_LinkEffectivity","add");
linkEff.setProperty("stream_version",newStreamVersionId);
newLink.addRelationship(linkEff);
newLink = newLink.apply();
}
}
return this;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment