Untitled
unknown
plain_text
10 months ago
3.5 kB
14
Indexable
(function() {
var threshold = 0.3; // Lower = more similar (0.0 = identical)
var maxResults = 10; // Number of similar groups to display
// Helper: Levenshtein Distance
function levenshtein(a, b) {
if (a.length === 0) return b.length;
if (b.length === 0) return a.length;
var matrix = [];
// Initialize the matrix
for (var i = 0; i <= b.length; i++) {
matrix[i] = [i];
}
for (var j = 0; j <= a.length; j++) {
matrix[0][j] = j;
}
// Populate the matrix
for (var i = 1; i <= b.length; i++) {
for (var j = 1; j <= a.length; j++) {
if (b.charAt(i - 1) === a.charAt(j - 1)) {
matrix[i][j] = matrix[i - 1][j - 1];
} else {
matrix[i][j] = Math.min(
matrix[i - 1][j - 1] + 1, // substitution
matrix[i][j - 1] + 1, // insertion
matrix[i - 1][j] + 1 // deletion
);
}
}
}
return matrix[b.length][a.length];
}
// Helper: Normalized similarity score
function similarity(str1, str2) {
var maxLength = Math.max(str1.length, str2.length);
if (maxLength === 0) return 1.0;
return 1.0 - (levenshtein(str1.toLowerCase(), str2.toLowerCase()) / maxLength);
}
// Get recent changes
var gr = new GlideRecord('change_request');
gr.addNotNullQuery('short_description');
gr.setLimit(50); // Adjust as needed
gr.orderByDesc('sys_created_on');
gr.query();
var changes = [];
while (gr.next()) {
changes.push({
sys_id: gr.getValue('sys_id'),
number: gr.getValue('number'),
text: (gr.getValue('short_description') + ' ' + gr.getValue('name')).trim()
});
}
// Compare and group similar changes
var similarGroups = [];
for (var i = 0; i < changes.length; i++) {
var group = [changes[i]];
for (var j = 0; j < changes.length; j++) {
if (i !== j) {
var sim = similarity(changes[i].text, changes[j].text);
if (sim >= (1 - threshold)) {
group.push(changes[j]);
}
}
}
// If 3 or more similar changes and not already included
if (group.length >= 3) {
// Avoid duplicates
var alreadyIncluded = similarGroups.some(function(g) {
return g[0].sys_id === group[0].sys_id;
});
if (!alreadyIncluded) {
similarGroups.push(group.slice(0, 3)); // Only first 3
}
}
if (similarGroups.length >= maxResults) break;
}
// Output
gs.info('Similar Change Request Groups:');
for (var g = 0; g < similarGroups.length; g++) {
gs.info('\nGroup ' + (g + 1) + ':');
for (var c = 0; c < similarGroups[g].length; c++) {
gs.info(' - ' + similarGroups[g][c].number + ': ' + similarGroups[g][c].text);
}
}
})();
Editor is loading...
Leave a Comment