UNPKG

pm4js

Version:

Process Mining for Javascript

338 lines (323 loc) 15.8 kB
class Celonis1DWrapper { constructor(celonisMapper) { this.celonisMapper = celonisMapper; } getProcessConfiguration(dataModel, processConfigurationId=null) { if (processConfigurationId == null) { let ret = dataModel.processConfigurations[0]; return ret; } else { let i = 0; while (i < dataModel.processConfigurations.length) { if (dataModel.processConfigurations[i].id == processConfigurationId) { return dataModel.processConfigurations[i]; } i++; } } } downloadBaseEventLog(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("\""+activityTable+"\".\""+processConfiguration.caseIdColumn+"\" AS \"case:concept:name\", "); query.push("\""+activityTable+"\".\""+processConfiguration.activityColumn+"\" AS \"concept:name\", "); query.push("\""+activityTable+"\".\""+processConfiguration.timestampColumn+"\" AS \"time:timestamp\") NOLIMIT;"); query = query.join(""); return CsvImporter.apply(this.celonisMapper.performQueryAnalysis(analysisId, query)); } downloadStartActivities(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("ACTIVITY_LAG ( \""+activityTable+"\".\""+processConfiguration.activityColumn+"\", 1) AS \"PREV_ACTIVITY\", "); query.push("\""+activityTable+"\".\""+processConfiguration.activityColumn+"\" AS \"CURR_ACTIVITY\","); query.push("COUNT(\""+activityTable+"\".\""+processConfiguration.caseIdColumn+"\") AS \"COUNT\") NOLIMIT;"); query = query.join(""); let ret = CsvImporter.parseCSV(this.celonisMapper.performQueryAnalysis(analysisId, query)); let sa_dict = {}; for (let el of ret) { if (el[0].length == 0) { sa_dict[el[1]] = parseInt(el[2]); } } return sa_dict; } downloadEndActivities(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("ACTIVITY_LEAD ( \""+activityTable+"\".\""+processConfiguration.activityColumn+"\", 1) AS \"NEXT_ACTIVITY\", "); query.push("\""+activityTable+"\".\""+processConfiguration.activityColumn+"\" AS \"CURR_ACTIVITY\","); query.push("COUNT(\""+activityTable+"\".\""+processConfiguration.caseIdColumn+"\") AS \"COUNT\") NOLIMIT;"); query = query.join(""); let ret = CsvImporter.parseCSV(this.celonisMapper.performQueryAnalysis(analysisId, query)); let ea_dict = {}; for (let el of ret) { if (el[0].length == 0) { ea_dict[el[1]] = parseInt(el[2]); } } return ea_dict; } downloadActivities(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("\""+activityTable+"\".\""+processConfiguration.activityColumn+"\", "); query.push("COUNT(\""+activityTable+"\".\""+processConfiguration.caseIdColumn+"\") AS \"ACTIVITY\") NOLIMIT;"); query = query.join(""); let ret = CsvImporter.parseCSV(this.celonisMapper.performQueryAnalysis(analysisId, query)); let activities = {}; let i = 1; while (i < ret.length) { activities[ret[i][0]] = parseInt(ret[i][1]); i++; } return activities; } downloadPathsFrequency(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("ACTIVITY_LEAD ( \""+activityTable+"\".\""+processConfiguration.activityColumn+"\", 1) AS \"NEXT_ACTIVITY\", "); query.push("\""+activityTable+"\".\""+processConfiguration.activityColumn+"\" AS \"CURR_ACTIVITY\", "); query.push("COUNT(\""+activityTable+"\".\""+processConfiguration.caseIdColumn+"\") AS \"COUNT\") NOLIMIT;") query = query.join(""); let res = this.celonisMapper.performQueryAnalysis(analysisId, query); let ret = CsvImporter.parseCSV(res); let i = 1; let pathsFrequency = {}; while (i < ret.length) { if (ret[i][0].length > 0) { pathsFrequency[[ret[i][1], ret[i][0]]] = parseInt(ret[i][2]); } i++; } return pathsFrequency; } downloadVariants(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("VARIANT(\""+activityTable+"\".\""+processConfiguration.activityColumn+"\")"); query.push(", COUNT(VARIANT(\""+activityTable+"\".\""+processConfiguration.activityColumn+"\"))"); query.push(") NOLIMIT;"); query = query.join(""); let res = this.celonisMapper.performQueryAnalysis(analysisId, query); let ret = CsvImporter.parseCSV(res); let variants = {}; let i = 1; while (i < ret.length) { variants[ret[i][0]] = parseInt(ret[i][1]); i++; } return variants; } downloadPathsPerformance(analysisId, processConfigurationId=null, relationship="ANY_OCCURRENCE [ ] TO ANY_OCCURRENCE [ ]") { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("SOURCE ( \""+activityTable+"\".\""+processConfiguration.activityColumn+"\", "+relationship+" ), "); query.push("TARGET ( \""+activityTable+"\".\""+processConfiguration.activityColumn+"\" ), "); query.push("AVG ( SECONDS_BETWEEN ( SOURCE ( \""+activityTable+"\".\""+processConfiguration.timestampColumn+"\" ) , TARGET ( \""+activityTable+"\".\""+processConfiguration.timestampColumn+"\" ) ) )"); query.push(") NOLIMIT;"); query = query.join(""); let res = this.celonisMapper.performQueryAnalysis(analysisId, query); let ret = CsvImporter.parseCSV(res); let pathsPerformance = {}; let i = 1; while (i < ret.length) { pathsPerformance[[ret[i][0], ret[i][1]]] = parseFloat(ret[i][2]); i++; } return pathsPerformance; } downloadSojournTimes(analysisId, processConfigurationId=null, timestampColumn=null, startTimestampColumn=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; if (timestampColumn == null) { timestampColumn = processConfiguration.timestampColumn; } if (startTimestampColumn == null) { startTimestampColumn = processConfiguration.timestampColumn; } timestampColumn = "\""+activityTable+"\".\""+timestampColumn+"\""; startTimestampColumn = "\""+activityTable+"\".\""+startTimestampColumn+"\""; query.push("TABLE("); query.push("\""+activityTable+"\".\""+processConfiguration.activityColumn+"\", "); query.push("AVG(SECONDS_BETWEEN("+startTimestampColumn+", "+timestampColumn+")) "); query.push(") NOLIMIT;"); query = query.join(""); let res = this.celonisMapper.performQueryAnalysis(analysisId, query); let ret = CsvImporter.parseCSV(res); let sojournTime = {}; let i = 1; while (i < ret.length) { sojournTime[ret[i][0]] = parseFloat(ret[i][1]); i++; } return sojournTime; } downloadAllCaseDurations(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let dataModel = this.celonisMapper.dataModels[this.celonisMapper.analysisDataModel[analysisId]]; let dataModelTables = this.celonisMapper.dataModelsTables[dataModel["id"]]; let processConfiguration = this.getProcessConfiguration(dataModel, processConfigurationId); let activityTable = dataModelTables[processConfiguration["activityTableId"]]; let query = []; query.push("TABLE("); query.push("\""+activityTable+"\".\""+processConfiguration.caseIdColumn+"\", "); query.push("MAX ( CALC_THROUGHPUT ( CASE_START TO CASE_END, REMAP_TIMESTAMPS ( \""+activityTable+"\".\""+processConfiguration.timestampColumn+"\" , SECONDS ) ) )"); query.push(") NOLIMIT;"); query = query.join(""); let res = this.celonisMapper.performQueryAnalysis(analysisId, query); let ret = CsvImporter.parseCSV(res); let caseDurations = []; let i = 1; while (i < ret.length) { if (ret[i][1].length > 0) { caseDurations.push(parseFloat(ret[i][1])); } else { caseDurations.push(0); } i++; } return caseDurations; } downloadFrequencyDfg(analysisId, processConfigurationId=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let activities = this.downloadActivities(analysisId, processConfigurationId); let startActivities = this.downloadStartActivities(analysisId, processConfigurationId); let endActivities = this.downloadEndActivities(analysisId, processConfigurationId); let pathsFrequency = this.downloadPathsFrequency(analysisId, processConfigurationId); return new FrequencyDfg(activities, startActivities, endActivities, pathsFrequency); } downloadPerformanceDfg(analysisId, processConfigurationId=null, timestampColumn=null, startTimestampColumn=null) { if (analysisId == null) { analysisId = this.celonisMapper.getFirstAnalysis(); } let activities = this.downloadActivities(analysisId, processConfigurationId); let startActivities = this.downloadStartActivities(analysisId, processConfigurationId); let endActivities = this.downloadEndActivities(analysisId, processConfigurationId); let pathsFrequency = this.downloadPathsFrequency(analysisId, processConfigurationId); let pathsPerformance = this.downloadPathsPerformance(analysisId, processConfigurationId); let sojournTimes = this.downloadSojournTimes(analysisId, processConfigurationId); return new PerformanceDfg(activities, startActivities, endActivities, pathsFrequency, pathsPerformance, sojournTimes); } uploadEventLogToCelonis(eventLog, baseName, dummy=false, caseIdKey="concept:name", activityKey="concept:name", timestampKey="time:timestamp", sep=",", quotechar="\"", newline="\r\n", casePrefix="case:") { let dataPoolId = null; let dataModelId = null; let workspaceId = null; let analysisId = null; let cases = {}; for (let trace of eventLog.traces) { let caseId = trace.attributes[caseIdKey].value; if (caseId.indexOf(sep) > -1) { caseId = quotechar+caseId+quotechar; } cases[caseId] = 0; } cases = Object.keys(cases); caseIdKey = casePrefix+caseIdKey; cases.unshift(caseIdKey); cases = cases.join(newline); let csvExport = CsvExporter.apply(eventLog, sep, quotechar, casePrefix, newline); if (!(dummy)) { dataPoolId = this.celonisMapper.createDataPool(baseName+"_POOL", false); this.celonisMapper.getDataPools(); dataModelId = this.celonisMapper.createDataModel(dataPoolId, baseName+"_DMODEL"); this.celonisMapper.getDataModels(); console.log("created data pool"); this.celonisMapper.pushCSV(dataPoolId, csvExport, baseName+"_ACTIVITIES", false, "time:timestamp", sep, quotechar, newline); this.celonisMapper.getDataPools(); console.log("created activity table"); this.celonisMapper.addTableFromPool(dataModelId, baseName+"_ACTIVITIES", false); console.log("created data model for activities"); this.celonisMapper.pushCSV(dataPoolId, cases, baseName+"_CASES", false, null, sep, quotechar, newline); this.celonisMapper.getDataPools(); console.log("created cases table"); this.celonisMapper.addTableFromPool(dataModelId, baseName+"_CASES", false); console.log("created data model for cases"); this.celonisMapper.getDataModels(); this.celonisMapper.addForeignKey(dataModelId, baseName+"_ACTIVITIES", caseIdKey, baseName+"_CASES", caseIdKey, false); console.log("added foreign key"); this.celonisMapper.addProcessConfiguration(dataModelId, baseName+"_ACTIVITIES", baseName+"_CASES", caseIdKey, activityKey, timestampKey, null, false); console.log("added process configuration"); this.celonisMapper.reloadDataModel(dataModelId); console.log("reloaded data model"); workspaceId = this.celonisMapper.createWorkspace(dataModelId, baseName+"_WORKSPACE"); console.log("created workspace"); analysisId = this.celonisMapper.createAnalysis(workspaceId, baseName+"_ANALYSIS", false); console.log("created analysis"); this.celonisMapper.getDataPools(); console.log("reloading data pools"); this.celonisMapper.getDataModels(); console.log("reloading data models"); this.celonisMapper.getAnalyses(); console.log("reloading analyses"); } return {"dataPoolId": dataPoolId, "dataModelId": dataModelId, "workspaceId": workspaceId, "analysisId": analysisId}; } } try { global.Celonis1DWrapper = Celonis1DWrapper; module.exports = {Celonis1DWrapper: Celonis1DWrapper}; } catch (err) { // not in Node }