Name

sn_cmdb_int_util.CMDBIntegrationExecutionRollup

Description

No description available

Script

var CMDBIntegrationExecutionRollup = Class.create();
CMDBIntegrationExecutionRollup.prototype = {
  initialize: function() {},

  rollupStateToExecution: function(executionId) {

      var execution = new GlideRecord("sn_cmdb_int_util_cmdb_integration_execution");
      execution.get(executionId);

      var sums = new GlideAggregate('sn_cmdb_int_util_cmdb_integration_execution_import_set');
      sums.addQuery("cmdb_integration_execution", executionId);
      sums.groupBy("cmdb_integration_execution");
      sums.addAggregate("SUM", "rows");
      sums.addAggregate("SUM", "inserts");
      sums.addAggregate("SUM", "row_updates");
      sums.addAggregate("SUM", "ignored");
      sums.addAggregate("SUM", "skipped");
      sums.addAggregate("SUM", "errors");
      sums.addAggregate("SUM", "partial_payload_start");
      sums.addAggregate("SUM", "partial_payload_end");
      sums.addAggregate("SUM", "incomplete_payload_start");
      sums.addAggregate("SUM", "incomplete_payload_end");
      sums.addAggregate("MIN", "import_start_time");
      sums.addAggregate("MIN", "transform_start_time");
      sums.addAggregate("MIN", "import_end_time");
      sums.addAggregate("MAX", "import_end_time");
      sums.addAggregate("MIN", "transform_end_time");
      sums.addAggregate("MAX", "transform_end_time");
      sums.query();
      if (sums.next()) {
  		var rows = sums.getAggregate("SUM", "rows");
  		var start_time = sums.getAggregate("min", "import_start_time"); 
  		var end_time;
  		var duration = 0;
  		var rate = 0;
  		
          execution.setValue("rows", sums.getAggregate("SUM", "rows"));
          execution.setValue("inserts", sums.getAggregate("SUM", "inserts"));
          execution.setValue("row_updates", sums.getAggregate("SUM", "row_updates"));
          execution.setValue("ignored", sums.getAggregate("SUM", "ignored"));
          execution.setValue("skipped", sums.getAggregate("SUM", "skipped"));
          execution.setValue("errors", sums.getAggregate("SUM", "errors"));
          execution.setValue("partial_payload_start", sums.getAggregate("SUM", "partial_payload_start"));
          execution.setValue("partial_payload_end", sums.getAggregate("SUM", "partial_payload_end"));
          execution.setValue("incomplete_payload_start", sums.getAggregate("SUM", "incomplete_payload_start"));
          execution.setValue("incomplete_payload_end", sums.getAggregate("SUM", "incomplete_payload_end"));
          execution.setValue("import_start_time", start_time);
          execution.setValue("transform_start_time", sums.getAggregate("min", "transform_start_time"));
  		
          if (gs.nil(sums.getAggregate("min", "import_end_time"))) {
              execution.setValue("import_end_time", "NULL");
          } else {
  			// set import end time and update the duration of the import progress so far
  			var import_end_time = sums.getAggregate("max", "import_end_time");
              execution.setValue("import_end_time", import_end_time);
  			
              duration = this._getDuration(start_time, import_end_time);
              execution.setValue('duration', duration);
          }
          if (gs.nil(sums.getAggregate("min", "transform_end_time"))) {
              execution.setValue("transform_end_time", "NULL");
          } else {
              end_time = sums.getAggregate("max", "transform_end_time");
              execution.setValue("transform_end_time", end_time);
              execution.setValue("end_time", end_time);
  			// set a final duration and rate
              duration = this._getDuration(start_time, end_time);
              execution.setValue('duration', duration);

              rate = this._getImportRate(rows, duration);
              execution.setValue("insert_rate", rate);
          }
      }

      var state = this._getExecutionState(executionId);
  	var mostRecentError = this.getMostRecentError(executionId);
  	
  	execution.setValue("most_recent_error",mostRecentError);
      execution.setValue("state", state);
      execution.update();
  },
  
  getMostRecentError: function(executionId){
  	var gr = new GlideRecord('sn_cmdb_int_util_cmdb_integration_execution_import_set');
  	gr.addQuery("cmdb_integration_execution", executionId);
  	gr.addNotNullQuery("most_recent_error");
  	gr.orderByDesc("sys_created_on");
  	gr.setLimit(1);
  	gr.query();
  	var mostRecentError = "";
  	if (gr.next()){
  		mostRecentError = gr.getValue("most_recent_error");
  	}
  	return mostRecentError;
  },
  
  updateIRECountsFromAudit: function(executionId){
  	var execution = new GlideRecord("sn_cmdb_int_util_cmdb_integration_execution");
      execution.get(executionId);
  	
  	execution.setValue("ire_unchanged", 0);
      execution.setValue("ire_partial", 0);
      execution.setValue("ire_inserted", 0);
      execution.setValue("ire_updated", 0);
  	
  	var sums = new GlideAggregate('sn_cmdb_int_util_cmdb_integration_execution_audit');
      sums.addQuery("cmdb_integration_execution_import_set.cmdb_integration_execution", executionId);
      sums.addAggregate("SUM", "count");
      sums.groupBy("operation");
      sums.query();
      while (sums.next()) {
          if ("unchanged" == sums.getValue("operation")) {
              execution.setValue("ire_unchanged", sums.getAggregate("SUM", "count"));
          } else if ("partial" == sums.getValue("operation")) {
              execution.setValue("ire_partial", sums.getAggregate("SUM", "count"));
          } else if ("inserted" == sums.getValue("operation")) {
              execution.setValue("ire_inserted", sums.getAggregate("SUM", "count"));
          } else if ("updated" == sums.getValue("operation")) {
              execution.setValue("ire_updated", sums.getAggregate("SUM", "count"));
          }
      }
  	
  	execution.update();
  },

  _getExecutionState: function(executionId) {
      var states = [];
      gr = new GlideAggregate('sn_cmdb_int_util_cmdb_integration_execution_import_set');
      gr.addQuery("cmdb_integration_execution", executionId);
      gr.addAggregate('count', 'state');
      gr.query();
      var state = '';
      while (gr.next()) {
          state = gr.getValue("state");
          cnt = gr.getAggregate("count", "state");
          states.push(state);
      }

      var size = states.length;

      if ("error" in states) {
          state = "error";
      } else if ("transforming" in states) {
          state = "transforming";
      } else if ("loading" in states) {
          state = "loading";
      } else if ("loaded" in states && size == 1) {
          state = "loaded";
      } else if ("complete" in states && size == 1) {
          state = "complete";
      }
  	
  	return state;
  },

  _getDuration: function(start_time, end_time) {
      var start_time_dt = new GlideDateTime(start_time);
      var end_time_dt = new GlideDateTime(end_time);
      return GlideDateTime.subtract(start_time_dt, end_time_dt);
  },
  
  _getImportRate: function(rows, duration){
  	return (rows / duration.getNumericValue()) * 3600 * 1000; // rows per hour
  },

  type: 'CMDBIntegrationExecutionRollup'
};

Sys ID

5f1239e673320010011e3e2dfef6a70f

Offical Documentation

Official Docs: