pm4js
Version:
Process Mining for Javascript
122 lines (114 loc) • 4.34 kB
JavaScript
class OcelToCelonis {
static escap(stru, sep, quotechar) {
if (stru.indexOf(sep) > -1) {
return quotechar + stru + quotechar;
}
else {
return stru;
}
}
static getLogFromCollection(coll, logName, logType, objType1, objType2, sep, quotechar, newline) {
if (!(logName in coll)) {
coll[logName] = [];
if (logType == "events") {
coll[logName].push("EVID_"+objType1+sep+"CASE_"+objType1+sep+"ACT_"+objType1+sep+"TIME_"+objType1+sep+"EVID_GENERAL");
}
else if (logType == "objects") {
coll[logName].push("CASE_"+objType1);
}
else if (logType == "objrel") {
coll[logName].push("CASE_"+objType1+sep+"CASE_"+objType2);
}
else if (logType == "everel") {
coll[logName].push("SOURCE_EVID_"+objType1+sep+"TARGET_EVID_"+objType2);
}
}
return coll[logName];
}
static pushElementIntoCollection(coll, elem, logName, logType, objType1, objType2, sep, quotechar, newline) {
let log = OcelToCelonis.getLogFromCollection(coll, logName, logType, objType1, objType2, sep, quotechar, newline);
let i = 0;
while (i < elem.length) {
elem[i] = OcelToCelonis.escap(elem[i], sep, quotechar);
i++;
}
elem = elem.join(sep);
if (!(log.includes(elem))) {
log.push(elem);
}
}
static yaml1(objectTypes, transitions) {
let ret = [];
ret.push("eventLogsMetadata:");
ret.push(" eventLogs:");
for (let ot of objectTypes) {
ret.push(" - id: "+ot);
ret.push(" displayName: "+ot);
ret.push(" pql: '\""+ot+"_EVENTS\".\"ACT_"+ot+"\"'")
}
ret.push(" transitions:");
for (let trans of transitions) {
ret.push(" - id: "+trans[0]+"_"+trans[1]);
ret.push(" displayName: "+trans[0]+"_"+trans[1]);
ret.push(" firstEventLogId: "+trans[0]);
ret.push(" secondEventLogId: "+trans[1]);
ret.push(" type: INTERLEAVED");
}
return ret.join("\n");
}
static yaml2(objectTypes, transitions) {
let ret = [];
ret.push("settings:");
ret.push(" eventLogs:");
for (let ot of objectTypes) {
ret.push(" - eventLog: "+ot);
}
return ret.join("\n");
}
static apply(ocel, sep=",", quotechar="\"", newline="\r\n") {
let coll = {};
let objectTypes = {};
let transitions0 = {};
let timestampColumns = {};
for (let evId in ocel["ocel:events"]) {
let eve = ocel["ocel:events"][evId];
for (let objId of eve["ocel:omap"]) {
let objType = ocel["ocel:objects"][objId]["ocel:type"];
OcelToCelonis.pushElementIntoCollection(coll, [objId], objType+"_CASES", "objects", objType, null, sep, quotechar, newline);
OcelToCelonis.pushElementIntoCollection(coll, [evId+":"+objId, objId, eve["ocel:activity"], DateUtils.formatDateString(eve["ocel:timestamp"]), evId], objType+"_EVENTS", "events", objType, null, sep, quotechar, newline);
timestampColumns[objType+"_EVENTS"] = "TIME_"+objType;
objectTypes[objType] = 0;
for (let objId2 of eve["ocel:omap"]) {
if (objId != objId2) {
let objType2 = ocel["ocel:objects"][objId2]["ocel:type"];
if (objType <= objType2) {
if (objType < objType2) {
OcelToCelonis.pushElementIntoCollection(coll, [objId, objId2], "CONNECT_"+objType+"_CASES_"+objType2+"_CASES", "objrel", objType, objType2, sep, quotechar, newline);
transitions0[objType+"@#@#"+objType2] = 0;
}
OcelToCelonis.pushElementIntoCollection(coll, [evId+":"+objId, evId+":"+objId2], "CONNECT_"+objType+"_EVENTS_"+objType2+"_EVENTS", "everel", objType, objType2, sep, quotechar, newline);
}
}
}
}
}
for (let logName in coll) {
coll[logName] = coll[logName].join(newline);
}
objectTypes = Object.keys(objectTypes);
let transitions = [];
for (let trans0 in transitions0) {
let trans00 = trans0.split("@#@#");
transitions.push([trans00[0], trans00[1]]);
}
return {"coll": coll, "objectTypes": objectTypes, "transitions": transitions, "knowledgeYaml": OcelToCelonis.yaml1(objectTypes, transitions), "modelYaml": OcelToCelonis.yaml2(objectTypes, transitions), "timestampColumns": timestampColumns};
}
}
try {
module.exports = {OcelToCelonis: OcelToCelonis};
global.OcelToCelonis = OcelToCelonis;
}
catch (err) {
// not in node
//console.log(err);
}