Name

global.NLUMappingsUtil

Description

Utility to get VA Topic - NLU Intent mappings.

Script

var NLUMappingsUtil = Class.create();

(function() {
  var tables = NLUConstants.tables;
  var constants = NLUConstants.constants;

  NLUMappingsUtil.getSNNLUProvider = function() {
      try {
          var openNluGr = new GlideRecord(tables.OPEN_NLU_DRIVER);
          if (openNluGr.get('adapter_script_name', constants.SN_NLU_DRIVER)) {
              return openNluGr.getUniqueValue();
          }
      } catch (ex) {
          // In case, VA is not installed then this is resulting in exception!
          gs.error('Failed to get NLU Provider');
      }
      return null;
  };

  NLUMappingsUtil.getVAMappings = function() {
      var mappingUtil = new NLUMappingsUtil();
      mappingUtil.populateMappingData();
      return mappingUtil.getVAMappings();
  };

  NLUMappingsUtil.saveMappipngs = function(mappings) {
      return (new NLUMappingsProcessor()).saveMappings(mappings);
  };

  NLUMappingsUtil.prototype = {

      initialize: function() {
          this.topicModelMap = {};
          this.modelMappingsData = {};
          this.modelGroupsData = [];

          this.primaryIntents = {};
      },

      findTopicGroup: function(topic) {
          for (var i in this.modelGroupsData) {
              var eachGroup = this.modelGroupsData[i];
              if (eachGroup.topics.indexOf(topic) !== -1)
                  return eachGroup;
          }
          return null;
      },

      findModelData: function(topicGroup, modelId) {
          for (var i in topicGroup.models) {
              var eachData = topicGroup.models[i];
              if (eachData.id === modelId) {
                  return eachData;
              }
          }
          return null;
      },

      addModelToGroup: function(topic, modelId) {
          var topicGroup = this.findTopicGroup(topic);
          var modelData = topicGroup && this.findModelData(topicGroup, modelId);
          if (modelData) return modelData;

          modelData = {
              id: modelId,
              name: null,
              language: null,
              isPrimary: false,
              intents: this.modelMappingsData[modelId].intents,
              entities: this.modelMappingsData[modelId].entities
          };

          if (!topicGroup) {
              for (var i in this.modelGroupsData) {
                  var eachGroup = this.modelGroupsData[i];
                  for (var j in eachGroup.models) {
                      var eachData = eachGroup.models[j];
                      if (eachData.id === modelId) {
                          eachGroup.topics.push(topic);
                          return eachData;
                      }
                  }
              }
              this.modelGroupsData.push({
                  topics: [topic],
                  models: [modelData],
                  mappings: {
                      models: {
                          primary: null,
                          secondary: []
                      },
                      intents: [],
                      entities: []
                  }
              });
          } else {
              topicGroup.models.push(modelData);
          }
          return modelData;
      },

      populateMappingData: function() {
          var nluProviderId = NLUMappingsUtil.getSNNLUProvider();
          if (!nluProviderId) {
              gs.debug('NLU Provider is NOT active');
              return [];
          }

          // Filter only SN NLU Provider topics, having more than one model attached.
          var groupTopics = [];
          var aggr = new GlideAggregate(tables.CB_TOPIC);
          aggr.addQuery('nlu_provider', nluProviderId);
          aggr.addEncodedQuery('nlu_modelISNOTEMPTY^nlu_intentISNOTEMPTY');
          aggr.groupBy('cb_topic_id');
          aggr.addAggregate('COUNT');
          aggr.query();
          while (aggr.next()) {
              if (aggr.getAggregate('COUNT') > 1)
                  groupTopics.push(aggr.getValue('cb_topic_id'));
          }

          var gr = new GlideRecord(tables.CB_TOPIC);
          gr.addQuery('cb_topic_id', 'IN', groupTopics);
          gr.orderBy('cb_topic_id');
          gr.orderBy('nlu_model');
          gr.query();
          while (gr.next()) {
              var topic = gr.getValue('cb_topic_id');
              var modelName = gr.getValue('nlu_model');
              var intentName = gr.getValue('nlu_intent');
              var entityData = gr.getValue('nlu_entities');
              if (!modelName || !intentName)
                  continue;
              var entitiesInfo = [];
              entityData && JSON.parse(entityData).forEach(function(each) {
                  entitiesInfo.push({
                      name: each.nlu_entity,
                      topic: each.node_id
                  });
              });
              if (!this.modelMappingsData[modelName]) this.modelMappingsData[modelName] = {
                  intents: [],
                  entities: []
              };

              this.modelMappingsData[modelName].intents.push({
                  name: intentName,
                  topic: topic
              });

              if (entitiesInfo.length > 0) {
                  this.modelMappingsData[modelName].entities = this.modelMappingsData[modelName].entities.concat(entitiesInfo);
              }

              if (!this.topicModelMap[topic]) this.topicModelMap[topic] = [];
              this.topicModelMap[topic].push(modelName);
          }
      },

      checkAndAddData: function(id, name, dataArray, map, isPrimary) {
          var found = false;
          dataArray.forEach(function(data) {
              if (data.name === name) {
                  found = true;
                  data.id = id;
                  if (!map[data.topic]) map[data.topic] = {
                      primary: null,
                      secondary: []
                  };
                  if (isPrimary)
                      map[data.topic].primary = id;
                  else
                      map[data.topic].secondary.push(id);
              }
          });
          if (!found && id) {
              dataArray.push({
                  id: id,
                  name: name
              });
          }
      },

      populateUnmappedData: function(gr, dataArray, map, isPrimary) {
          while (gr.next()) {
              this.checkAndAddData(gr.getUniqueValue(), gr.getValue('name'), dataArray, map, isPrimary);
          }
      },

      getVAMappings: function() {
          var thisObj = this;

          // Create model groups:
          for (var topic in this.topicModelMap) {
              this.topicModelMap[topic].forEach(function(eachModel) {
                  thisObj.addModelToGroup(topic, eachModel);
              });
          }

          for (var grpIndex = this.modelGroupsData.length - 1; grpIndex >= 0; grpIndex--) {
              var eachGroup = this.modelGroupsData[grpIndex];
              delete eachGroup.topics;
              var intentsMapping = {};
              var entitiesMapping = {};
              var sysEntitiesMapping = {};
              var foundPrimary = false;
              for (var modelIndex = eachGroup.models.length - 1; modelIndex >= 0; modelIndex--) {
                  var eachModel = eachGroup.models[modelIndex];
                  var modelGr = NLUModel.getGRByName([eachModel.id]);
                  if (modelGr) {
                      if (!NLUSystemUtil.isMaint() && modelGr.getValue('sys_policy') === 'read') {
                          // For non maint user, filter out OOB models
                          eachGroup.models.splice(modelIndex, 1);
                      } else {
                          eachModel.id = modelGr.getUniqueValue();
                          eachModel.name = modelGr.getValue('display_name');
                          eachModel.language = NLUModel.getLanguage(modelGr);
                          if (eachModel.language === String(gs.getSession().getLanguage())) {
                              eachModel.isPrimary = true;
                              eachGroup.mappings.models.primary = eachModel.id;
                              foundPrimary = true;
                          } else {
                              eachGroup.mappings.models.secondary.push(eachModel.id);
                          }
                          var nluModel = new NLUModel(eachModel.id);
                          thisObj.populateUnmappedData(nluModel.getIntents(), eachModel.intents, intentsMapping, eachModel.isPrimary);
                          thisObj.populateUnmappedData(nluModel.getEntities(), eachModel.entities, entitiesMapping, eachModel.isPrimary);
                      }
                  } else {
                      // the model does not exists in NLU tables
                      eachGroup.models.splice(modelIndex, 1);
                  }
              }

              if (eachGroup.models.length === 0) {
                  this.modelGroupsData.splice(grpIndex, 1);
              } else {
                  if (!foundPrimary) {
                      eachGroup.mappings.models.primary = eachGroup.mappings.models.secondary[0];
                      eachGroup.mappings.models.secondary.splice(0, 1);
                  }
                  for (var iTopic in intentsMapping) {
                      if (!foundPrimary) {
                          intentsMapping[iTopic].primary = intentsMapping[iTopic].secondary[0];
                          intentsMapping[iTopic].secondary.splice(0, 1);
                      }
                      if(intentsMapping[iTopic].primary)
                          eachGroup.mappings.intents.push(intentsMapping[iTopic]);
                  }
                  for (var eTopic in entitiesMapping) {
                      if (!foundPrimary) {
                          entitiesMapping[eTopic].primary = entitiesMapping[eTopic].secondary[0];
                          entitiesMapping[eTopic].secondary.splice(0, 1);
                      }
                      eachGroup.mappings.entities.push(entitiesMapping[eTopic]);
                  }
              }
          }

          return this.modelGroupsData;
      },

      type: 'NLUMappingsUtil'
  };
})();

Sys ID

1bde57490762a01028ef0a701ad30024

Offical Documentation

Official Docs: