Name

sn_oe_sfs.FetchRecommendationDetails

Description

This script holds the functionality to fetch recommended topics. Following are the steps to get top 3 recommended topics 1. Generate a list of intent-topic associations. 2. Get the request ID of the latest analysis ran. 3. Get the report for the corresponding request ID. 4. The report holds the recommendations; sort the recommendations by matches in descedning fashion. 5. Iterate through that sorted list and select the top 3 that have associate topic Ids (based on intent property) from step 1

Script

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

  //This will generate a list of intent-topic associations.
  getIntentTopicAssociations: function() {
      return new sn_oe_sfs.CITopicRecommendationsUtil().getTaxonomyIntentTopics();
  },

  //This will fetch the latest analysis record ID
  getLatestRequestId: function() {
      var nluDiscoveryReport = new GlideRecord('sn_nlu_discovery_report_definition');
      nluDiscoveryReport.addEncodedQuery('statusINcompleted,solution_complete');
      nluDiscoveryReport.orderByDesc('sys_created_on');
      nluDiscoveryReport.setLimit(1);
      nluDiscoveryReport.query();
      nluDiscoveryReport.next();
      return nluDiscoveryReport.getUniqueValue();
  },

  //This will fetch the report for the corresponding request ID
  getReport: function(requestId) {
      var reports = new sn_oe_sfs.CITopicRecommendationsUtil().generateReports();
      var report = {};
      reports.forEach(function(rep) {
          if (rep.requestId === requestId)
              report = rep;
      });
      return report;
  },

  //Sorts the recommendations by matches (descending)
  sortRecommendationsBasedOnMatches: function(recommendations) {
      recommendations.sort(function(a, b) {
          return b.matches - a.matches;
      });
  },

  getTotalRequestsCount: function() {
      var requestId = this.getLatestRequestId();
      var report = this.getReport(requestId);
      return report.totalRequests;
  },

  getRequestsHandledCount: function(topThreeRecommendations) {
      var requestsHandled = 0;
      topThreeRecommendations.forEach(function(rec) {
          requestsHandled += rec.matchCount;
      });
      return requestsHandled;
  },

  getPercentageOfRequestsBotCanSolve: function(requestsHandled, totalRequests) {
      return ((requestsHandled / totalRequests) * 100).toFixed(2);
  },

  getTopThreeRecommendations: function() {
      if (!this.isAnalysisSuccessfulAtleastOnce())
          return [];
      var intentTopicAssociations = this.getIntentTopicAssociations();
      var requestId = this.getLatestRequestId();
      var report = this.getReport(requestId);
      var recommendations = report.recommendations;
      this.sortRecommendationsBasedOnMatches(recommendations);
      var topThreeRecommendations = [];
      var self = this;
      recommendations.forEach(function(recommendation) {
          Object.keys(intentTopicAssociations).forEach(function(itaKey) {
              var current = intentTopicAssociations[itaKey];
              Object.keys(current).forEach(function(currentKey) {
                  if (recommendation.intent === currentKey && topThreeRecommendations.length < 3) {
                      var finalItem = {};
                      finalItem.matchCount = recommendation.matches;
                      finalItem.topicName = current[currentKey].languages.en.topicName;
                      if (!self.isMatchingTopicAlreadyFound(topThreeRecommendations, finalItem))
                          topThreeRecommendations.push(finalItem);
                  }
              });
          });
      });
      return topThreeRecommendations;
  },

  isRecommendationsAvailable: function() {
      var recommendationsList = this.getTopThreeRecommendations();
      return recommendationsList.length ? true : false;
  },

  isMatchingTopicAlreadyFound: function(recommendationsArray, item) {
      var isElementExist = false;
      for (var i = 0; i < recommendationsArray.length; i++) {
          if (recommendationsArray[i].topicName === item.topicName) {
              isElementExist = true;
          }
      }
      return isElementExist;
  },

  isAnalysisSuccessfulAtleastOnce: function() {
      var nluDiscoveryReport = new GlideRecord('sn_nlu_discovery_report_definition');
      nluDiscoveryReport.addEncodedQuery('statusINcompleted,solution_complete');
      nluDiscoveryReport.orderByDesc('sys_created_on');
      nluDiscoveryReport.setLimit(1);
      nluDiscoveryReport.query();
      return nluDiscoveryReport.hasNext();
  },

  getDaysPastRecentAnalysis: function() {
      var nluDiscoveryReport = new GlideRecord('sn_nlu_discovery_report_definition');
      nluDiscoveryReport.addEncodedQuery('statusINcompleted,solution_complete');
      nluDiscoveryReport.orderByDesc('sys_created_on');
      nluDiscoveryReport.setLimit(1);
      nluDiscoveryReport.query();
      if (nluDiscoveryReport.next()) {
          var createdOn = nluDiscoveryReport.getValue('sys_created_on');
          return new sn_oe_sfs.CIUtil().getDaysPastDateTime(createdOn);
      }
      return -1;
  },

  type: 'FetchRecommendationDetails'
};

Sys ID

9fceb8f35357011039acddeeff7b1269

Offical Documentation

Official Docs: