Untitled

 avatar
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