Name

global.ContentPopularityUtilSNC

Description

WARNING Customers should NOT modify this script The purpose of this script include is to provide default behaviours for the ContentPopularityUtil script include. To change the behaviour of these methods (or add new methods), Customers should override/add new methods to the ContentPopularityUtil script include.

Script

var ContentPopularityUtilSNC = Class.create();
ContentPopularityUtilSNC.prototype = {
  initialize: function() {
      this.displayColumnMap = {};
      this.contentProcessors = {};
  	this.connectedContentColumnMap = {};

      var extensions = new GlideScriptedExtensionPoint().getExtensions(TaxonomyConstants.CONTENT_SCRIPTED_EXTENSION_POINT);
      var contentConfigGr = new ContentConfigUtil().getContentConfigGr();
      while (contentConfigGr.next()) {
          var tableName = contentConfigGr.getValue("content_table");
          var displayColumn = contentConfigGr.getValue("sort_field");
          var contentColumn = contentConfigGr.getValue("content_reference_field");
          this.displayColumnMap[tableName] = displayColumn;
          this.connectedContentColumnMap[tableName] = contentColumn;
          for (var i = 0; i < extensions.length; i++) {
              var ep = extensions[i];
              var extensionTableName = ep.getTableName();
              if (extensionTableName == tableName) {
                  this.contentProcessors[tableName] = extensions[i];
                  break;
              }
          }
      }
  },

  populateOrderOfContent: function() {
      this.populateOrder();
      this.populatePopularity();
  },

  populateOrder: function() {
      var content = [];
      var gr = new GlideRecord('m2m_connected_content');
      gr.query();
      while (gr.next()) {
          var contentTable = gr.content_type.content_table;
          var contentTableColumn = gr.content_type.content_reference_field;
          var contentDisplayColumn = gr.content_type.sort_field;
          var sysId = gr.getUniqueValue();
          var displayValue = '';
          var contentRecord = gr[contentTableColumn].getRefRecord();
          if (contentRecord.isValidRecord())
              displayValue = contentRecord.getValue(contentDisplayColumn);
          if(displayValue)
              content.push([sysId, displayValue]);
      }

      // Sort alphabetically
      content.sort(function(a, b) {
          var item1 = a[1].toLowerCase();
          var item2 = b[1].toLowerCase();
          if (item1 < item2)
              return -1;
          if (item1 > item2)
              return 1;
          return 0;
      });

      var order = 1;
      content.forEach(function(item) {
          var gr = new GlideRecord('m2m_connected_content');
          gr.get(item[0]);
          gr.setValue('alphabetical_order', order++);
          gr.update();
      });
  },

  populatePopularity: function() {
      var calculatePopularity = this.getPopularityAlgorithm();
      calculatePopularity.call(this);
  },

  getPopularityAlgorithm: function() {
      return this.zScoreAlgorithm;
  },

  zScoreAlgorithm: function() {
      var content = {};
      var contentTables = TaxonomyConstants.TABLES.CONTENT_TABLES;
  	contentTables.forEach(function(type) {
          content[type] = [];
      });

      var gr = new GlideRecord('m2m_connected_content');
      gr.query();
      while (gr.next()) {
          var tableName = gr.content_type.content_table;
          var contentColumn = this.connectedContentColumnMap[tableName];
          if (content[tableName].indexOf(gr.getValue(contentColumn)) == -1)
              content[tableName].push(gr.getValue(contentColumn));
      }

      var contentPopularityList = [];
      for (var i = 0; i < contentTables.length; i++) {
          var contentType = contentTables[i];
          var items = content[contentType];
          var contentProcessor = this.contentProcessors[contentType];
          var popularityMap = contentProcessor.getPopularity(items.toString());
          var popularityOfItems = [];
          Object.keys(popularityMap).forEach(function(key) {
              popularityOfItems.push(popularityMap[key]);
          });
          var mean = this.getMean(popularityOfItems);
          var sd = this.getStandardDeviation(popularityOfItems, mean);
          for (var j = 0; j < items.length; j++) {
              var item = items[j];
              var popularity = popularityMap.hasOwnProperty(item) ? popularityMap[item] : 0;
              var contentPopularity = {};
              contentPopularity.contentType = contentType;
              contentPopularity.id = item;
              contentPopularity.popularity = this.getZScore(popularity, mean, sd);
              contentPopularityList.push(contentPopularity);
          }
      }

      for (var n = 0; n < contentPopularityList.length; n++) {
          var contentRecord = contentPopularityList[n];
          var connectedContentGr = new GlideRecord('m2m_connected_content');
          var contentReferenceColumn = this.connectedContentColumnMap[contentRecord.contentType];
          connectedContentGr.addQuery(contentReferenceColumn, contentRecord.id);
          connectedContentGr.query();
          connectedContentGr.setValue('popularity', contentRecord.popularity);
          connectedContentGr.updateMultiple();
      }
  },

  getZScore: function(value, mean, sd) {
      var score = 0;
      if (sd > 0)
          score = (value - mean) / sd;
      return score;
  },

  getMean: function(arr) {
      var sum = 0;
      arr.forEach(function(i) {
          sum += i;
      });
      return sum / arr.length;
  },

  getStandardDeviation: function(arr, mean) {
      var sd = 0;
      arr.forEach(function(i) {
          sd += Math.pow(i - mean, 2);
      });
      return Math.sqrt(sd / arr.length);
  },

  getDisplayColumn: function(type) {
      return this.displayColumnMap[type];
  },

  type: 'ContentPopularityUtilSNC'
};

Sys ID

cdc44ff353312010069addeeff7b1208

Offical Documentation

Official Docs: