Name

global.MBModelUtils

Description

Fits a metricbase model based on input fitter params and a mb_model record. Returns a transform string for display by embedReportByParams() as well as the model string generated by the fit.

Script

var MBModelUtils = Class.create();
MBModelUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  isPublic:function(){return true;},
  
  /**
   * Converts time from UTC to ISO UTC
   * "yyyy-MM-dd HH:mm:ss.SSS" -> "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
   */
  getISOUTCfromUTC:function(timeSTR) {
  	var dateTime = timeSTR.split(" ");
  	return dateTime[0] + "T" + dateTime[1] + "Z";
  },

  computeTransformString:function() {
  	var modelParams = this.getParameter('model_string');
  	var currentRecordID = this.getParameter('current_id');
  					
  	var currentRecord = new GlideRecord('mb_model_instance');
  	var currentRecordFound = currentRecord.get(currentRecordID);
  			
  	// Query records
  	var records = new GlideRecord(currentRecord.mb_model.metric_table);
  	records.addEncodedQuery(currentRecord.mb_model.filter);
  	records.setLimit(10);
  	if (Object.keys(currentRecord.mb_model.group_by).length > 0) 
  		records.addQuery(currentRecord.mb_model.group_by, currentRecord.group_name);
  			
  	records.query();
  	
  	var model = new sn_clotho.Data.fromModelString(modelParams);
  	var paramErrors = new sn_clotho.Data.validateModelParams(model);
  	if (paramErrors.length > 0) {
  		var errorString = paramErrors[0];
  		for(var i = 1; i < paramErrors.length; i++)
  			errorString += '<BR>' + paramErrors[i];

  		gs.addErrorMessage(errorString);
  		return;
  	}
  	
  	var builder = new sn_clotho.Transformer(records);
  	builder.metric(currentRecord.mb_model.metric.element).avg()
  		.predict(model).decompose([]);
  	
  	builder.metric(currentRecord.mb_model.metric.element).label("Data").avg();
  			
  	var start = new GlideDateTime(currentRecord.mb_model.start);
  	var end = new GlideDateTime(currentRecord.mb_model.end);
  					
  	// Return transform string
  	var transformString = JSON.stringify({
  		query_condition: records.getEncodedQuery(),
  		transforms: [{
  			input: {
  				transform: "Reference",
  				name: "chart-subjects"
  			},
  			transform: JSON.parse(builder.toJson(start, end)),
  			metric: currentRecord.mb_model.metric.element.toString()
  		}],
  		group_by: "",
  		table: currentRecord.mb_model.metric_table.toString()
  	});
  					
  	// Metric Chart Data Generator requires iso utc time. 
  	startTime = this.getISOUTCfromUTC(start.getUTCValue());
  	endTime = this.getISOUTCfromUTC(end.getUTCValue());
  	
  	var params = {
  			sysparm_title: currentRecord.name.toString(),
  			sysparm_type: "line",
  			sysparm_table: currentRecord.mb_model.metric_table.toString(),
  			sysparm_source_type: "metricbase",
  			sysparm_custom_config: transformString,
  			sysparm_start_time: startTime,
  			sysparm_end_time: endTime,
  			sysparm_show_marker: false
  		};
  	
  	var result = this.newItem("result");
  	result.setAttribute("params", JSON.stringify(params));
  	result.setAttribute("newModelString", model.toModelString());
  },
  
  type: 'MBModelUtils'
});

Sys ID

2037c0b2e732330004da69d2c2f6a936

Offical Documentation

Official Docs: