Name

global.MLLabeledData

Description

Utilities related to ML Labeled Data table.

Script

var MLLabeledData = Class.create();

(function() {

  var tables = NLUConstants.tables;
  var TABLE = 'ml_labeled_data';
  var FIELDS = {
      TEXT: 'text',

      LABEL: 'label',
      LABEL_TABLE: 'label_table',
      LABEL_REFERENCE: 'label_reference',
      LABEL_TYPE: 'label_type',
      CORRECT_LABEL: 'correct_label',
      CORRECT_LABEL_REF: 'correct_label_reference',

      RECOMMENDATION: 'recommendation',
      SOURCE: 'source',
      PRODUCT: 'product',
      USAGE: 'usage',
      FREQUENCY: 'frequency',
      JOB_ID: 'job_id',
      SYS_DOMAIN: 'sys_domain'
  };

  var FEEDBACK_TYPE = {
      POSITIVE: 'positive',
      NEGATIVE: 'negative',
      IRRELEVANT: 'irrelevant',
      IGNORED: 'ignored',
      SUGGESTED_ADD: 'suggested_addition',
      SUGGESTED_REMOVE: 'suggested_removal'
  };

  var SOURCE = {
      VA: 'virtual_agent',
      NLU: 'nlu_workbench'
  };

  var PRODUCT = {
      NLU: 'nlu'
  };

  var USAGE = {
      TESTING: 'nlu_batch_test',
      MODEL_TRAIN: 'nlu_model_train'
  };

  var LABEL_PREFIX = {
      sys_nlu_model: 'model',
      sys_nlu_intent: 'intent'
  };

  // Export to other scripts: 
  MLLabeledData.TABLE = TABLE;
  MLLabeledData.FIELDS = FIELDS;
  MLLabeledData.FEEDBACK_TYPE = FEEDBACK_TYPE;
  MLLabeledData.SOURCE = SOURCE;
  MLLabeledData.PRODUCT = PRODUCT;
  MLLabeledData.USAGE = USAGE;
  MLLabeledData.LABEL_PREFIX = LABEL_PREFIX;

  var getQuery = function(labelData, filter) {
      var query = FIELDS.TEXT + '=' + labelData.text;
      if (labelData.label_reference) {
          query += '^' + FIELDS.LABEL_REFERENCE + '=' + labelData.label_reference;
          if (labelData.label_table === tables.SYS_NLU_INTENT) {
              var intentGr = NLUIntent.getGRById(labelData.label_reference);
              query += '^OR' + FIELDS.LABEL_REFERENCE + '=' + intentGr.model;
          }
      } else if (labelData.label)
          query += '^' + FIELDS.LABEL + '=' + labelData.label;
      if (filter)
          query += '^' + filter;
      return query;
  };

  MLLabeledData.recordExists = function(labelData, filter) {
      var ga = new GlideAggregate(TABLE);
      ga.addAggregate('COUNT');
      ga.addEncodedQuery(getQuery(labelData, filter));
      ga.query();
      return ga.next() && ga.getAggregate('COUNT') > 0;
  };

  MLLabeledData.getRecords = function(labelData, filter) {
      var gr = new GlideRecord(TABLE);
      gr.addEncodedQuery(getQuery(labelData, filter));
      gr.query();
      return gr;
  };

  MLLabeledData.getRecordBySysId = function(sysId) {
      var gr = new GlideRecord(TABLE);
      return gr.get(sysId) && gr;
  };

  MLLabeledData.createRecord = function(data) {
      if (!data || !data[FIELDS.TEXT]) return null; // text is mandatory
      var gr = new GlideRecord(TABLE);
      gr.newRecord();
      for (var key in FIELDS) {
          var field = FIELDS[key];
          if (data[field]) gr.setValue(field, data[field]);
      }
      return gr.insert();
  };

  MLLabeledData.deleteRecords = function(filter) {
      if (!filter) return null;
      var gr = new GlideRecord(TABLE);
      gr.addEncodedQuery(filter);
      return gr.deleteMultiple();
  };

  MLLabeledData.prototype = {

      initialize: function(sysId, gr) {
          this.sysId = sysId;
          if (!gs.nil(gr)) {
              this.gr = gr;
              this.sysId = gr.getUniqueValue();
          }
      },

      getGr: function() {
          if (!this.gr) this.gr = MLLabeledData.getRecordBySysId(this.sysId);
          return this.gr;
      },

      updateLabelType: function(labelType) {
          var data = {};
          data[FIELDS.LABEL_TYPE] = labelType;
          return this.updateData(data);
      },

      updateTarget: function(product, usage) {
          var data = {};
          data[FIELDS.PRODUCT] = product;
          data[FIELDS.USAGE] = usage;
          return this.updateData(data);
      },

      updateData: function(data) {
          var gr = this.getGr();
          for (var field in data)
              gr.setValue(field, data[field]);
          return gr.update();
      },

      deleteRecord: function() {
          var gr = this.getGr();
          return gr && gr.deleteRecord();
      },

      type: 'MLLabeledData'
  };
})();

Sys ID

ea0ed8a40739301028ef0a701ad300d5

Offical Documentation

Official Docs: