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