[{"data":1,"prerenderedAt":5330},["ShallowReactive",2],{"page-\u002Fblog\u002Fsession-caching-servicenow-script-includes-before-query-business-rules":3},{"id":4,"title":5,"author":6,"authorUrl":7,"body":8,"date":5292,"dateUpdated":66,"description":5293,"dqid":5294,"excerpt":5295,"extension":5296,"faq":5297,"headline":5310,"meta":5311,"navigation":154,"path":5312,"seo":5313,"socialImage":5314,"stem":5320,"tags":5321,"__hash__":5329},"content\u002Fblog\u002Fsession-caching-servicenow-script-includes-before-query-business-rules.md","Session Caching in ServiceNow with Script Includes and Before Query Business Rules | SN-Tricks","Gabriel Fordan","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fgabrielfordan",{"type":9,"value":10,"toc":5254},"minimark",[11,15,20,23,28,31,48,60,182,186,193,220,224,227,231,234,370,373,387,398,402,405,409,412,1804,1808,1811,2017,2027,2031,2035,2038,2512,2515,2616,2620,2623,3265,3268,3418,3422,3425,3943,3947,3951,3954,3965,4095,4099,4106,4109,4123,4127,4130,4141,4144,4155,4159,4162,4329,4333,4336,4432,4436,4439,4613,4617,4620,4724,4728,4731,4735,4917,4921,5137,5140,5144,5148,5158,5164,5168,5171,5176,5180,5183,5188,5192,5195,5200,5204,5207,5224,5227,5244,5247,5250],[12,13,14],"p",{},"Performance optimization is a critical concern for any ServiceNow implementation. As your instance grows and user activity increases, you may notice slowdowns in list views, forms, and other operations. One of the most effective yet underutilized techniques for improving performance is session caching. In this comprehensive guide, I'll show you how to leverage session caching with Script Includes and Before Query Business Rules to achieve dramatic performance improvements—in some cases, up to 65% faster transaction processing.",[16,17,19],"h2",{"id":18},"understanding-session-caching-in-servicenow","Understanding Session Caching in ServiceNow",[12,21,22],{},"Session caching in ServiceNow allows you to store data in a user's session memory, making it available throughout their session without repeatedly querying the database. This is particularly powerful when you need to access the same data multiple times during a single user session.",[24,25,27],"h3",{"id":26},"the-session-cache-api","The Session Cache API",[12,29,30],{},"ServiceNow provides two primary methods for session caching:",[32,33,34,42],"ul",{},[35,36,37,41],"li",{},[38,39,40],"strong",{},"putClientData(key, value)",": Stores data in the user's session",[35,43,44,47],{},[38,45,46],{},"getClientData(key)",": Retrieves data from the user's session",[12,49,50,51,55,56,59],{},"These methods are available through the GlideSession API, accessible via ",[52,53,54],"code",{},"gs.getSession()"," on the server-side, or ",[52,57,58],{},"g_user"," on the client-side.",[61,62,67],"pre",{"className":63,"code":64,"language":65,"meta":66,"style":66},"language-javascript shiki shiki-themes github-light github-light","\u002F\u002F Server-side example\nvar session = gs.getSession();\nsession.putClientData('userRegion', 'EMEA');\nvar region = session.getClientData('userRegion');\n\n\u002F\u002F Client-side example\nvar region = g_user.getClientData('userRegion');\n","javascript","",[52,68,69,78,102,127,149,156,162],{"__ignoreMap":66},[70,71,74],"span",{"class":72,"line":73},"line",1,[70,75,77],{"class":76},"sJ8bj","\u002F\u002F Server-side example\n",[70,79,81,85,89,92,95,99],{"class":72,"line":80},2,[70,82,84],{"class":83},"sCydW","var",[70,86,88],{"class":87},"sKWpL"," session ",[70,90,91],{"class":83},"=",[70,93,94],{"class":87}," gs.",[70,96,98],{"class":97},"se37E","getSession",[70,100,101],{"class":87},"();\n",[70,103,105,108,111,114,118,121,124],{"class":72,"line":104},3,[70,106,107],{"class":87},"session.",[70,109,110],{"class":97},"putClientData",[70,112,113],{"class":87},"(",[70,115,117],{"class":116},"sOTlB","'userRegion'",[70,119,120],{"class":87},", ",[70,122,123],{"class":116},"'EMEA'",[70,125,126],{"class":87},");\n",[70,128,130,132,135,137,140,143,145,147],{"class":72,"line":129},4,[70,131,84],{"class":83},[70,133,134],{"class":87}," region ",[70,136,91],{"class":83},[70,138,139],{"class":87}," session.",[70,141,142],{"class":97},"getClientData",[70,144,113],{"class":87},[70,146,117],{"class":116},[70,148,126],{"class":87},[70,150,152],{"class":72,"line":151},5,[70,153,155],{"emptyLinePlaceholder":154},true,"\n",[70,157,159],{"class":72,"line":158},6,[70,160,161],{"class":76},"\u002F\u002F Client-side example\n",[70,163,165,167,169,171,174,176,178,180],{"class":72,"line":164},7,[70,166,84],{"class":83},[70,168,134],{"class":87},[70,170,91],{"class":83},[70,172,173],{"class":87}," g_user.",[70,175,142],{"class":97},[70,177,113],{"class":87},[70,179,117],{"class":116},[70,181,126],{"class":87},[24,183,185],{"id":184},"why-session-caching-matters","Why Session Caching Matters",[12,187,188,189,192],{},"According to ServiceNow performance studies, implementing proper caching strategies can improve transaction processing time by ",[38,190,191],{},"55-65%",". This dramatic improvement comes from:",[194,195,196,202,208,214],"ol",{},[35,197,198,201],{},[38,199,200],{},"Reduced database queries",": Each query has overhead in connection time, parsing, execution, and network latency",[35,203,204,207],{},[38,205,206],{},"Faster memory access",": Reading from memory is orders of magnitude faster than database queries",[35,209,210,213],{},[38,211,212],{},"Lower server load",": Fewer database queries mean reduced load on the database server",[35,215,216,219],{},[38,217,218],{},"Better user experience",": Faster response times lead to happier users",[16,221,223],{"id":222},"the-problem-before-query-business-rules-without-caching","The Problem: Before Query Business Rules Without Caching",[12,225,226],{},"Before Query Business Rules are powerful tools for filtering data based on custom logic. However, they come with significant performance challenges:",[24,228,230],{"id":229},"why-before-query-business-rules-are-expensive","Why Before Query Business Rules Are Expensive",[12,232,233],{},"Unlike Access Control Lists (ACLs) which have built-in application tier caching, Before Query Business Rules execute every single time a table is queried. Consider this scenario:",[61,235,237],{"className":63,"code":236,"language":65,"meta":66,"style":66},"\u002F\u002F Before Query Business Rule on incident table\n(function executeRule(current, previous \u002F*null when async*\u002F) {\n    \u002F\u002F Get user's region from the database\n    var userGR = new GlideRecord('sys_user');\n    userGR.get(gs.getUserID());\n    var userRegion = userGR.getValue('u_region');\n\n    \u002F\u002F Filter incidents to only show records from user's region\n    current.addQuery('u_region', userRegion);\n})(current, previous);\n",[52,238,239,244,271,276,299,316,338,342,348,364],{"__ignoreMap":66},[70,240,241],{"class":72,"line":73},[70,242,243],{"class":76},"\u002F\u002F Before Query Business Rule on incident table\n",[70,245,246,248,251,254,256,260,262,265,268],{"class":72,"line":80},[70,247,113],{"class":87},[70,249,250],{"class":83},"function",[70,252,253],{"class":97}," executeRule",[70,255,113],{"class":87},[70,257,259],{"class":258},"sj_tP","current",[70,261,120],{"class":87},[70,263,264],{"class":258},"previous",[70,266,267],{"class":76}," \u002F*null when async*\u002F",[70,269,270],{"class":87},") {\n",[70,272,273],{"class":72,"line":104},[70,274,275],{"class":76},"    \u002F\u002F Get user's region from the database\n",[70,277,278,281,284,286,289,292,294,297],{"class":72,"line":129},[70,279,280],{"class":83},"    var",[70,282,283],{"class":87}," userGR ",[70,285,91],{"class":83},[70,287,288],{"class":83}," new",[70,290,291],{"class":97}," GlideRecord",[70,293,113],{"class":87},[70,295,296],{"class":116},"'sys_user'",[70,298,126],{"class":87},[70,300,301,304,307,310,313],{"class":72,"line":151},[70,302,303],{"class":87},"    userGR.",[70,305,306],{"class":97},"get",[70,308,309],{"class":87},"(gs.",[70,311,312],{"class":97},"getUserID",[70,314,315],{"class":87},"());\n",[70,317,318,320,323,325,328,331,333,336],{"class":72,"line":158},[70,319,280],{"class":83},[70,321,322],{"class":87}," userRegion ",[70,324,91],{"class":83},[70,326,327],{"class":87}," userGR.",[70,329,330],{"class":97},"getValue",[70,332,113],{"class":87},[70,334,335],{"class":116},"'u_region'",[70,337,126],{"class":87},[70,339,340],{"class":72,"line":164},[70,341,155],{"emptyLinePlaceholder":154},[70,343,345],{"class":72,"line":344},8,[70,346,347],{"class":76},"    \u002F\u002F Filter incidents to only show records from user's region\n",[70,349,351,354,357,359,361],{"class":72,"line":350},9,[70,352,353],{"class":87},"    current.",[70,355,356],{"class":97},"addQuery",[70,358,113],{"class":87},[70,360,335],{"class":116},[70,362,363],{"class":87},", userRegion);\n",[70,365,367],{"class":72,"line":366},10,[70,368,369],{"class":87},"})(current, previous);\n",[12,371,372],{},"This seems reasonable, but consider what happens when:",[32,374,375,378,381,384],{},[35,376,377],{},"A user opens a list view showing 50 incidents",[35,379,380],{},"Each incident loads related lists (tasks, approvals, etc.)",[35,382,383],{},"The user refreshes the page",[35,385,386],{},"Multiple users are accessing the system simultaneously",[12,388,389,390,393,394,397],{},"That simple ",[52,391,392],{},"userGR.get()"," query could execute ",[38,395,396],{},"hundreds or thousands of times per hour"," for a single user, and each execution requires a database query. This is where session caching becomes essential.",[16,399,401],{"id":400},"solution-session-caching-with-script-includes","Solution: Session Caching with Script Includes",[12,403,404],{},"The most effective pattern for implementing session caching is to create a reusable Script Include that handles the caching logic. This centralizes your caching strategy and makes it easy to use across multiple Business Rules.",[24,406,408],{"id":407},"creating-a-session-cache-script-include","Creating a Session Cache Script Include",[12,410,411],{},"Here's a robust Script Include for managing session-cached data:",[61,413,415],{"className":63,"code":414,"language":65,"meta":66,"style":66},"var SessionCacheUtil = Class.create();\nSessionCacheUtil.prototype = {\n    initialize: function() {\n        this.session = gs.getSession();\n        this.CACHE_PREFIX = 'cache_';\n    },\n\n    \u002F**\n     * Get data from session cache or execute callback to fetch and cache it\n     * @param {string} key - Cache key\n     * @param {function} fetchCallback - Function to execute if cache miss\n     * @param {number} ttl - Time to live in seconds (optional)\n     * @returns {*} Cached or freshly fetched data\n     *\u002F\n    getOrSet: function(key, fetchCallback, ttl) {\n        var cacheKey = this.CACHE_PREFIX + key;\n        var cachedValue = this.session.getClientData(cacheKey);\n\n        \u002F\u002F Check if we have cached data\n        if (cachedValue !== null && cachedValue !== undefined && cachedValue !== '') {\n            \u002F\u002F If TTL is specified, check if cache is still valid\n            if (ttl) {\n                var cacheTimeKey = cacheKey + '_timestamp';\n                var cacheTime = this.session.getClientData(cacheTimeKey);\n\n                if (cacheTime) {\n                    var currentTime = new GlideDateTime().getNumericValue();\n                    var cachedTime = parseInt(cacheTime);\n                    var age = (currentTime - cachedTime) \u002F 1000; \u002F\u002F Convert to seconds\n\n                    if (age > ttl) {\n                        gs.debug('SessionCacheUtil: Cache expired for key: ' + key);\n                        \u002F\u002F Cache expired, fetch new data\n                        return this._fetchAndCache(key, fetchCallback, ttl);\n                    }\n                }\n            }\n\n            gs.debug('SessionCacheUtil: Cache hit for key: ' + key);\n            return cachedValue;\n        }\n\n        gs.debug('SessionCacheUtil: Cache miss for key: ' + key);\n        return this._fetchAndCache(key, fetchCallback, ttl);\n    },\n\n    \u002F**\n     * Fetch data using callback and store in cache\n     * @param {string} key - Cache key\n     * @param {function} fetchCallback - Function to execute\n     * @param {number} ttl - Time to live in seconds (optional)\n     * @returns {*} Fetched data\n     *\u002F\n    _fetchAndCache: function(key, fetchCallback, ttl) {\n        var value = fetchCallback();\n\n        \u002F\u002F Only cache strings and numbers (immutable types)\n        if (typeof value === 'string' || typeof value === 'number') {\n            var cacheKey = this.CACHE_PREFIX + key;\n            this.session.putClientData(cacheKey, value);\n\n            \u002F\u002F Store timestamp if TTL is specified\n            if (ttl) {\n                var cacheTimeKey = cacheKey + '_timestamp';\n                var currentTime = new GlideDateTime().getNumericValue();\n                this.session.putClientData(cacheTimeKey, currentTime.toString());\n            }\n\n            gs.debug('SessionCacheUtil: Cached value for key: ' + key);\n        } else {\n            gs.warn('SessionCacheUtil: Cannot cache non-primitive type for key: ' + key);\n        }\n\n        return value;\n    },\n\n    \u002F**\n     * Get data from cache\n     * @param {string} key - Cache key\n     * @returns {*} Cached data or null\n     *\u002F\n    get: function(key) {\n        var cacheKey = this.CACHE_PREFIX + key;\n        return this.session.getClientData(cacheKey);\n    },\n\n    \u002F**\n     * Set data in cache\n     * @param {string} key - Cache key\n     * @param {*} value - Value to cache (must be string or number)\n     *\u002F\n    set: function(key, value) {\n        if (typeof value === 'string' || typeof value === 'number') {\n            var cacheKey = this.CACHE_PREFIX + key;\n            this.session.putClientData(cacheKey, value);\n        } else {\n            gs.warn('SessionCacheUtil: Cannot cache non-primitive type for key: ' + key);\n        }\n    },\n\n    \u002F**\n     * Remove data from cache\n     * @param {string} key - Cache key\n     *\u002F\n    remove: function(key) {\n        var cacheKey = this.CACHE_PREFIX + key;\n        this.session.putClientData(cacheKey, null);\n\n        \u002F\u002F Also remove timestamp if it exists\n        var cacheTimeKey = cacheKey + '_timestamp';\n        this.session.putClientData(cacheTimeKey, null);\n    },\n\n    \u002F**\n     * Clear all cached data (use with caution)\n     *\u002F\n    clear: function() {\n        this.session.clearClientData();\n    },\n\n    type: 'SessionCacheUtil'\n};\n",[52,416,417,434,452,465,481,498,503,507,512,517,534,550,566,580,586,613,637,657,662,668,704,710,719,740,759,764,773,797,813,844,849,864,883,889,905,911,917,923,928,945,954,960,965,982,996,1001,1006,1011,1017,1030,1044,1057,1069,1074,1098,1112,1117,1123,1157,1177,1190,1195,1201,1208,1225,1244,1262,1267,1272,1288,1299,1316,1321,1326,1334,1339,1344,1349,1355,1368,1380,1385,1401,1420,1433,1438,1443,1448,1454,1467,1482,1487,1508,1535,1554,1565,1574,1589,1594,1599,1604,1609,1615,1628,1633,1649,1668,1685,1690,1696,1713,1729,1734,1739,1744,1750,1755,1767,1779,1784,1789,1798],{"__ignoreMap":66},[70,418,419,421,424,426,429,432],{"class":72,"line":73},[70,420,84],{"class":83},[70,422,423],{"class":87}," SessionCacheUtil ",[70,425,91],{"class":83},[70,427,428],{"class":87}," Class.",[70,430,431],{"class":97},"create",[70,433,101],{"class":87},[70,435,436,440,443,446,449],{"class":72,"line":80},[70,437,439],{"class":438},"sMN4m","SessionCacheUtil",[70,441,442],{"class":87},".",[70,444,445],{"class":438},"prototype",[70,447,448],{"class":83}," =",[70,450,451],{"class":87}," {\n",[70,453,454,457,460,462],{"class":72,"line":104},[70,455,456],{"class":97},"    initialize",[70,458,459],{"class":87},": ",[70,461,250],{"class":83},[70,463,464],{"class":87},"() {\n",[70,466,467,470,473,475,477,479],{"class":72,"line":129},[70,468,469],{"class":438},"        this",[70,471,472],{"class":87},".session ",[70,474,91],{"class":83},[70,476,94],{"class":87},[70,478,98],{"class":97},[70,480,101],{"class":87},[70,482,483,485,487,490,492,495],{"class":72,"line":151},[70,484,469],{"class":438},[70,486,442],{"class":87},[70,488,489],{"class":438},"CACHE_PREFIX",[70,491,448],{"class":83},[70,493,494],{"class":116}," 'cache_'",[70,496,497],{"class":87},";\n",[70,499,500],{"class":72,"line":158},[70,501,502],{"class":87},"    },\n",[70,504,505],{"class":72,"line":164},[70,506,155],{"emptyLinePlaceholder":154},[70,508,509],{"class":72,"line":344},[70,510,511],{"class":76},"    \u002F**\n",[70,513,514],{"class":72,"line":350},[70,515,516],{"class":76},"     * Get data from session cache or execute callback to fetch and cache it\n",[70,518,519,522,525,528,531],{"class":72,"line":366},[70,520,521],{"class":76},"     * ",[70,523,524],{"class":83},"@param",[70,526,527],{"class":97}," {string}",[70,529,530],{"class":87}," key",[70,532,533],{"class":76}," - Cache key\n",[70,535,537,539,541,544,547],{"class":72,"line":536},11,[70,538,521],{"class":76},[70,540,524],{"class":83},[70,542,543],{"class":97}," {function}",[70,545,546],{"class":87}," fetchCallback",[70,548,549],{"class":76}," - Function to execute if cache miss\n",[70,551,553,555,557,560,563],{"class":72,"line":552},12,[70,554,521],{"class":76},[70,556,524],{"class":83},[70,558,559],{"class":97}," {number}",[70,561,562],{"class":87}," ttl",[70,564,565],{"class":76}," - Time to live in seconds (optional)\n",[70,567,569,571,574,577],{"class":72,"line":568},13,[70,570,521],{"class":76},[70,572,573],{"class":83},"@returns",[70,575,576],{"class":97}," {*}",[70,578,579],{"class":76}," Cached or freshly fetched data\n",[70,581,583],{"class":72,"line":582},14,[70,584,585],{"class":76},"     *\u002F\n",[70,587,589,592,594,596,598,601,603,606,608,611],{"class":72,"line":588},15,[70,590,591],{"class":97},"    getOrSet",[70,593,459],{"class":87},[70,595,250],{"class":83},[70,597,113],{"class":87},[70,599,600],{"class":258},"key",[70,602,120],{"class":87},[70,604,605],{"class":258},"fetchCallback",[70,607,120],{"class":87},[70,609,610],{"class":258},"ttl",[70,612,270],{"class":87},[70,614,616,619,622,624,627,629,631,634],{"class":72,"line":615},16,[70,617,618],{"class":83},"        var",[70,620,621],{"class":87}," cacheKey ",[70,623,91],{"class":83},[70,625,626],{"class":438}," this",[70,628,442],{"class":87},[70,630,489],{"class":438},[70,632,633],{"class":83}," +",[70,635,636],{"class":87}," key;\n",[70,638,640,642,645,647,649,652,654],{"class":72,"line":639},17,[70,641,618],{"class":83},[70,643,644],{"class":87}," cachedValue ",[70,646,91],{"class":83},[70,648,626],{"class":438},[70,650,651],{"class":87},".session.",[70,653,142],{"class":97},[70,655,656],{"class":87},"(cacheKey);\n",[70,658,660],{"class":72,"line":659},18,[70,661,155],{"emptyLinePlaceholder":154},[70,663,665],{"class":72,"line":664},19,[70,666,667],{"class":76},"        \u002F\u002F Check if we have cached data\n",[70,669,671,674,677,680,683,686,688,690,693,695,697,699,702],{"class":72,"line":670},20,[70,672,673],{"class":83},"        if",[70,675,676],{"class":87}," (cachedValue ",[70,678,679],{"class":83},"!==",[70,681,682],{"class":438}," null",[70,684,685],{"class":83}," &&",[70,687,644],{"class":87},[70,689,679],{"class":83},[70,691,692],{"class":438}," undefined",[70,694,685],{"class":83},[70,696,644],{"class":87},[70,698,679],{"class":83},[70,700,701],{"class":116}," ''",[70,703,270],{"class":87},[70,705,707],{"class":72,"line":706},21,[70,708,709],{"class":76},"            \u002F\u002F If TTL is specified, check if cache is still valid\n",[70,711,713,716],{"class":72,"line":712},22,[70,714,715],{"class":83},"            if",[70,717,718],{"class":87}," (ttl) {\n",[70,720,722,725,728,730,732,735,738],{"class":72,"line":721},23,[70,723,724],{"class":83},"                var",[70,726,727],{"class":87}," cacheTimeKey ",[70,729,91],{"class":83},[70,731,621],{"class":87},[70,733,734],{"class":83},"+",[70,736,737],{"class":116}," '_timestamp'",[70,739,497],{"class":87},[70,741,743,745,748,750,752,754,756],{"class":72,"line":742},24,[70,744,724],{"class":83},[70,746,747],{"class":87}," cacheTime ",[70,749,91],{"class":83},[70,751,626],{"class":438},[70,753,651],{"class":87},[70,755,142],{"class":97},[70,757,758],{"class":87},"(cacheTimeKey);\n",[70,760,762],{"class":72,"line":761},25,[70,763,155],{"emptyLinePlaceholder":154},[70,765,767,770],{"class":72,"line":766},26,[70,768,769],{"class":83},"                if",[70,771,772],{"class":87}," (cacheTime) {\n",[70,774,776,779,782,784,786,789,792,795],{"class":72,"line":775},27,[70,777,778],{"class":83},"                    var",[70,780,781],{"class":87}," currentTime ",[70,783,91],{"class":83},[70,785,288],{"class":83},[70,787,788],{"class":97}," GlideDateTime",[70,790,791],{"class":87},"().",[70,793,794],{"class":97},"getNumericValue",[70,796,101],{"class":87},[70,798,800,802,805,807,810],{"class":72,"line":799},28,[70,801,778],{"class":83},[70,803,804],{"class":87}," cachedTime ",[70,806,91],{"class":83},[70,808,809],{"class":97}," parseInt",[70,811,812],{"class":87},"(cacheTime);\n",[70,814,816,818,821,823,826,829,832,835,838,841],{"class":72,"line":815},29,[70,817,778],{"class":83},[70,819,820],{"class":87}," age ",[70,822,91],{"class":83},[70,824,825],{"class":87}," (currentTime ",[70,827,828],{"class":83},"-",[70,830,831],{"class":87}," cachedTime) ",[70,833,834],{"class":83},"\u002F",[70,836,837],{"class":438}," 1000",[70,839,840],{"class":87},"; ",[70,842,843],{"class":76},"\u002F\u002F Convert to seconds\n",[70,845,847],{"class":72,"line":846},30,[70,848,155],{"emptyLinePlaceholder":154},[70,850,852,855,858,861],{"class":72,"line":851},31,[70,853,854],{"class":83},"                    if",[70,856,857],{"class":87}," (age ",[70,859,860],{"class":83},">",[70,862,863],{"class":87}," ttl) {\n",[70,865,867,870,873,875,878,880],{"class":72,"line":866},32,[70,868,869],{"class":87},"                        gs.",[70,871,872],{"class":97},"debug",[70,874,113],{"class":87},[70,876,877],{"class":116},"'SessionCacheUtil: Cache expired for key: '",[70,879,633],{"class":83},[70,881,882],{"class":87}," key);\n",[70,884,886],{"class":72,"line":885},33,[70,887,888],{"class":76},"                        \u002F\u002F Cache expired, fetch new data\n",[70,890,892,895,897,899,902],{"class":72,"line":891},34,[70,893,894],{"class":83},"                        return",[70,896,626],{"class":438},[70,898,442],{"class":87},[70,900,901],{"class":97},"_fetchAndCache",[70,903,904],{"class":87},"(key, fetchCallback, ttl);\n",[70,906,908],{"class":72,"line":907},35,[70,909,910],{"class":87},"                    }\n",[70,912,914],{"class":72,"line":913},36,[70,915,916],{"class":87},"                }\n",[70,918,920],{"class":72,"line":919},37,[70,921,922],{"class":87},"            }\n",[70,924,926],{"class":72,"line":925},38,[70,927,155],{"emptyLinePlaceholder":154},[70,929,931,934,936,938,941,943],{"class":72,"line":930},39,[70,932,933],{"class":87},"            gs.",[70,935,872],{"class":97},[70,937,113],{"class":87},[70,939,940],{"class":116},"'SessionCacheUtil: Cache hit for key: '",[70,942,633],{"class":83},[70,944,882],{"class":87},[70,946,948,951],{"class":72,"line":947},40,[70,949,950],{"class":83},"            return",[70,952,953],{"class":87}," cachedValue;\n",[70,955,957],{"class":72,"line":956},41,[70,958,959],{"class":87},"        }\n",[70,961,963],{"class":72,"line":962},42,[70,964,155],{"emptyLinePlaceholder":154},[70,966,968,971,973,975,978,980],{"class":72,"line":967},43,[70,969,970],{"class":87},"        gs.",[70,972,872],{"class":97},[70,974,113],{"class":87},[70,976,977],{"class":116},"'SessionCacheUtil: Cache miss for key: '",[70,979,633],{"class":83},[70,981,882],{"class":87},[70,983,985,988,990,992,994],{"class":72,"line":984},44,[70,986,987],{"class":83},"        return",[70,989,626],{"class":438},[70,991,442],{"class":87},[70,993,901],{"class":97},[70,995,904],{"class":87},[70,997,999],{"class":72,"line":998},45,[70,1000,502],{"class":87},[70,1002,1004],{"class":72,"line":1003},46,[70,1005,155],{"emptyLinePlaceholder":154},[70,1007,1009],{"class":72,"line":1008},47,[70,1010,511],{"class":76},[70,1012,1014],{"class":72,"line":1013},48,[70,1015,1016],{"class":76},"     * Fetch data using callback and store in cache\n",[70,1018,1020,1022,1024,1026,1028],{"class":72,"line":1019},49,[70,1021,521],{"class":76},[70,1023,524],{"class":83},[70,1025,527],{"class":97},[70,1027,530],{"class":87},[70,1029,533],{"class":76},[70,1031,1033,1035,1037,1039,1041],{"class":72,"line":1032},50,[70,1034,521],{"class":76},[70,1036,524],{"class":83},[70,1038,543],{"class":97},[70,1040,546],{"class":87},[70,1042,1043],{"class":76}," - Function to execute\n",[70,1045,1047,1049,1051,1053,1055],{"class":72,"line":1046},51,[70,1048,521],{"class":76},[70,1050,524],{"class":83},[70,1052,559],{"class":97},[70,1054,562],{"class":87},[70,1056,565],{"class":76},[70,1058,1060,1062,1064,1066],{"class":72,"line":1059},52,[70,1061,521],{"class":76},[70,1063,573],{"class":83},[70,1065,576],{"class":97},[70,1067,1068],{"class":76}," Fetched data\n",[70,1070,1072],{"class":72,"line":1071},53,[70,1073,585],{"class":76},[70,1075,1077,1080,1082,1084,1086,1088,1090,1092,1094,1096],{"class":72,"line":1076},54,[70,1078,1079],{"class":97},"    _fetchAndCache",[70,1081,459],{"class":87},[70,1083,250],{"class":83},[70,1085,113],{"class":87},[70,1087,600],{"class":258},[70,1089,120],{"class":87},[70,1091,605],{"class":258},[70,1093,120],{"class":87},[70,1095,610],{"class":258},[70,1097,270],{"class":87},[70,1099,1101,1103,1106,1108,1110],{"class":72,"line":1100},55,[70,1102,618],{"class":83},[70,1104,1105],{"class":87}," value ",[70,1107,91],{"class":83},[70,1109,546],{"class":97},[70,1111,101],{"class":87},[70,1113,1115],{"class":72,"line":1114},56,[70,1116,155],{"emptyLinePlaceholder":154},[70,1118,1120],{"class":72,"line":1119},57,[70,1121,1122],{"class":76},"        \u002F\u002F Only cache strings and numbers (immutable types)\n",[70,1124,1126,1128,1131,1134,1136,1139,1142,1145,1148,1150,1152,1155],{"class":72,"line":1125},58,[70,1127,673],{"class":83},[70,1129,1130],{"class":87}," (",[70,1132,1133],{"class":83},"typeof",[70,1135,1105],{"class":87},[70,1137,1138],{"class":83},"===",[70,1140,1141],{"class":116}," 'string'",[70,1143,1144],{"class":83}," ||",[70,1146,1147],{"class":83}," typeof",[70,1149,1105],{"class":87},[70,1151,1138],{"class":83},[70,1153,1154],{"class":116}," 'number'",[70,1156,270],{"class":87},[70,1158,1160,1163,1165,1167,1169,1171,1173,1175],{"class":72,"line":1159},59,[70,1161,1162],{"class":83},"            var",[70,1164,621],{"class":87},[70,1166,91],{"class":83},[70,1168,626],{"class":438},[70,1170,442],{"class":87},[70,1172,489],{"class":438},[70,1174,633],{"class":83},[70,1176,636],{"class":87},[70,1178,1180,1183,1185,1187],{"class":72,"line":1179},60,[70,1181,1182],{"class":438},"            this",[70,1184,651],{"class":87},[70,1186,110],{"class":97},[70,1188,1189],{"class":87},"(cacheKey, value);\n",[70,1191,1193],{"class":72,"line":1192},61,[70,1194,155],{"emptyLinePlaceholder":154},[70,1196,1198],{"class":72,"line":1197},62,[70,1199,1200],{"class":76},"            \u002F\u002F Store timestamp if TTL is specified\n",[70,1202,1204,1206],{"class":72,"line":1203},63,[70,1205,715],{"class":83},[70,1207,718],{"class":87},[70,1209,1211,1213,1215,1217,1219,1221,1223],{"class":72,"line":1210},64,[70,1212,724],{"class":83},[70,1214,727],{"class":87},[70,1216,91],{"class":83},[70,1218,621],{"class":87},[70,1220,734],{"class":83},[70,1222,737],{"class":116},[70,1224,497],{"class":87},[70,1226,1228,1230,1232,1234,1236,1238,1240,1242],{"class":72,"line":1227},65,[70,1229,724],{"class":83},[70,1231,781],{"class":87},[70,1233,91],{"class":83},[70,1235,288],{"class":83},[70,1237,788],{"class":97},[70,1239,791],{"class":87},[70,1241,794],{"class":97},[70,1243,101],{"class":87},[70,1245,1247,1250,1252,1254,1257,1260],{"class":72,"line":1246},66,[70,1248,1249],{"class":438},"                this",[70,1251,651],{"class":87},[70,1253,110],{"class":97},[70,1255,1256],{"class":87},"(cacheTimeKey, currentTime.",[70,1258,1259],{"class":97},"toString",[70,1261,315],{"class":87},[70,1263,1265],{"class":72,"line":1264},67,[70,1266,922],{"class":87},[70,1268,1270],{"class":72,"line":1269},68,[70,1271,155],{"emptyLinePlaceholder":154},[70,1273,1275,1277,1279,1281,1284,1286],{"class":72,"line":1274},69,[70,1276,933],{"class":87},[70,1278,872],{"class":97},[70,1280,113],{"class":87},[70,1282,1283],{"class":116},"'SessionCacheUtil: Cached value for key: '",[70,1285,633],{"class":83},[70,1287,882],{"class":87},[70,1289,1291,1294,1297],{"class":72,"line":1290},70,[70,1292,1293],{"class":87},"        } ",[70,1295,1296],{"class":83},"else",[70,1298,451],{"class":87},[70,1300,1302,1304,1307,1309,1312,1314],{"class":72,"line":1301},71,[70,1303,933],{"class":87},[70,1305,1306],{"class":97},"warn",[70,1308,113],{"class":87},[70,1310,1311],{"class":116},"'SessionCacheUtil: Cannot cache non-primitive type for key: '",[70,1313,633],{"class":83},[70,1315,882],{"class":87},[70,1317,1319],{"class":72,"line":1318},72,[70,1320,959],{"class":87},[70,1322,1324],{"class":72,"line":1323},73,[70,1325,155],{"emptyLinePlaceholder":154},[70,1327,1329,1331],{"class":72,"line":1328},74,[70,1330,987],{"class":83},[70,1332,1333],{"class":87}," value;\n",[70,1335,1337],{"class":72,"line":1336},75,[70,1338,502],{"class":87},[70,1340,1342],{"class":72,"line":1341},76,[70,1343,155],{"emptyLinePlaceholder":154},[70,1345,1347],{"class":72,"line":1346},77,[70,1348,511],{"class":76},[70,1350,1352],{"class":72,"line":1351},78,[70,1353,1354],{"class":76},"     * Get data from cache\n",[70,1356,1358,1360,1362,1364,1366],{"class":72,"line":1357},79,[70,1359,521],{"class":76},[70,1361,524],{"class":83},[70,1363,527],{"class":97},[70,1365,530],{"class":87},[70,1367,533],{"class":76},[70,1369,1371,1373,1375,1377],{"class":72,"line":1370},80,[70,1372,521],{"class":76},[70,1374,573],{"class":83},[70,1376,576],{"class":97},[70,1378,1379],{"class":76}," Cached data or null\n",[70,1381,1383],{"class":72,"line":1382},81,[70,1384,585],{"class":76},[70,1386,1388,1391,1393,1395,1397,1399],{"class":72,"line":1387},82,[70,1389,1390],{"class":97},"    get",[70,1392,459],{"class":87},[70,1394,250],{"class":83},[70,1396,113],{"class":87},[70,1398,600],{"class":258},[70,1400,270],{"class":87},[70,1402,1404,1406,1408,1410,1412,1414,1416,1418],{"class":72,"line":1403},83,[70,1405,618],{"class":83},[70,1407,621],{"class":87},[70,1409,91],{"class":83},[70,1411,626],{"class":438},[70,1413,442],{"class":87},[70,1415,489],{"class":438},[70,1417,633],{"class":83},[70,1419,636],{"class":87},[70,1421,1423,1425,1427,1429,1431],{"class":72,"line":1422},84,[70,1424,987],{"class":83},[70,1426,626],{"class":438},[70,1428,651],{"class":87},[70,1430,142],{"class":97},[70,1432,656],{"class":87},[70,1434,1436],{"class":72,"line":1435},85,[70,1437,502],{"class":87},[70,1439,1441],{"class":72,"line":1440},86,[70,1442,155],{"emptyLinePlaceholder":154},[70,1444,1446],{"class":72,"line":1445},87,[70,1447,511],{"class":76},[70,1449,1451],{"class":72,"line":1450},88,[70,1452,1453],{"class":76},"     * Set data in cache\n",[70,1455,1457,1459,1461,1463,1465],{"class":72,"line":1456},89,[70,1458,521],{"class":76},[70,1460,524],{"class":83},[70,1462,527],{"class":97},[70,1464,530],{"class":87},[70,1466,533],{"class":76},[70,1468,1470,1472,1474,1476,1479],{"class":72,"line":1469},90,[70,1471,521],{"class":76},[70,1473,524],{"class":83},[70,1475,576],{"class":97},[70,1477,1478],{"class":87}," value",[70,1480,1481],{"class":76}," - Value to cache (must be string or number)\n",[70,1483,1485],{"class":72,"line":1484},91,[70,1486,585],{"class":76},[70,1488,1490,1493,1495,1497,1499,1501,1503,1506],{"class":72,"line":1489},92,[70,1491,1492],{"class":97},"    set",[70,1494,459],{"class":87},[70,1496,250],{"class":83},[70,1498,113],{"class":87},[70,1500,600],{"class":258},[70,1502,120],{"class":87},[70,1504,1505],{"class":258},"value",[70,1507,270],{"class":87},[70,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533],{"class":72,"line":1510},93,[70,1512,673],{"class":83},[70,1514,1130],{"class":87},[70,1516,1133],{"class":83},[70,1518,1105],{"class":87},[70,1520,1138],{"class":83},[70,1522,1141],{"class":116},[70,1524,1144],{"class":83},[70,1526,1147],{"class":83},[70,1528,1105],{"class":87},[70,1530,1138],{"class":83},[70,1532,1154],{"class":116},[70,1534,270],{"class":87},[70,1536,1538,1540,1542,1544,1546,1548,1550,1552],{"class":72,"line":1537},94,[70,1539,1162],{"class":83},[70,1541,621],{"class":87},[70,1543,91],{"class":83},[70,1545,626],{"class":438},[70,1547,442],{"class":87},[70,1549,489],{"class":438},[70,1551,633],{"class":83},[70,1553,636],{"class":87},[70,1555,1557,1559,1561,1563],{"class":72,"line":1556},95,[70,1558,1182],{"class":438},[70,1560,651],{"class":87},[70,1562,110],{"class":97},[70,1564,1189],{"class":87},[70,1566,1568,1570,1572],{"class":72,"line":1567},96,[70,1569,1293],{"class":87},[70,1571,1296],{"class":83},[70,1573,451],{"class":87},[70,1575,1577,1579,1581,1583,1585,1587],{"class":72,"line":1576},97,[70,1578,933],{"class":87},[70,1580,1306],{"class":97},[70,1582,113],{"class":87},[70,1584,1311],{"class":116},[70,1586,633],{"class":83},[70,1588,882],{"class":87},[70,1590,1592],{"class":72,"line":1591},98,[70,1593,959],{"class":87},[70,1595,1597],{"class":72,"line":1596},99,[70,1598,502],{"class":87},[70,1600,1602],{"class":72,"line":1601},100,[70,1603,155],{"emptyLinePlaceholder":154},[70,1605,1607],{"class":72,"line":1606},101,[70,1608,511],{"class":76},[70,1610,1612],{"class":72,"line":1611},102,[70,1613,1614],{"class":76},"     * Remove data from cache\n",[70,1616,1618,1620,1622,1624,1626],{"class":72,"line":1617},103,[70,1619,521],{"class":76},[70,1621,524],{"class":83},[70,1623,527],{"class":97},[70,1625,530],{"class":87},[70,1627,533],{"class":76},[70,1629,1631],{"class":72,"line":1630},104,[70,1632,585],{"class":76},[70,1634,1636,1639,1641,1643,1645,1647],{"class":72,"line":1635},105,[70,1637,1638],{"class":97},"    remove",[70,1640,459],{"class":87},[70,1642,250],{"class":83},[70,1644,113],{"class":87},[70,1646,600],{"class":258},[70,1648,270],{"class":87},[70,1650,1652,1654,1656,1658,1660,1662,1664,1666],{"class":72,"line":1651},106,[70,1653,618],{"class":83},[70,1655,621],{"class":87},[70,1657,91],{"class":83},[70,1659,626],{"class":438},[70,1661,442],{"class":87},[70,1663,489],{"class":438},[70,1665,633],{"class":83},[70,1667,636],{"class":87},[70,1669,1671,1673,1675,1677,1680,1683],{"class":72,"line":1670},107,[70,1672,469],{"class":438},[70,1674,651],{"class":87},[70,1676,110],{"class":97},[70,1678,1679],{"class":87},"(cacheKey, ",[70,1681,1682],{"class":438},"null",[70,1684,126],{"class":87},[70,1686,1688],{"class":72,"line":1687},108,[70,1689,155],{"emptyLinePlaceholder":154},[70,1691,1693],{"class":72,"line":1692},109,[70,1694,1695],{"class":76},"        \u002F\u002F Also remove timestamp if it exists\n",[70,1697,1699,1701,1703,1705,1707,1709,1711],{"class":72,"line":1698},110,[70,1700,618],{"class":83},[70,1702,727],{"class":87},[70,1704,91],{"class":83},[70,1706,621],{"class":87},[70,1708,734],{"class":83},[70,1710,737],{"class":116},[70,1712,497],{"class":87},[70,1714,1716,1718,1720,1722,1725,1727],{"class":72,"line":1715},111,[70,1717,469],{"class":438},[70,1719,651],{"class":87},[70,1721,110],{"class":97},[70,1723,1724],{"class":87},"(cacheTimeKey, ",[70,1726,1682],{"class":438},[70,1728,126],{"class":87},[70,1730,1732],{"class":72,"line":1731},112,[70,1733,502],{"class":87},[70,1735,1737],{"class":72,"line":1736},113,[70,1738,155],{"emptyLinePlaceholder":154},[70,1740,1742],{"class":72,"line":1741},114,[70,1743,511],{"class":76},[70,1745,1747],{"class":72,"line":1746},115,[70,1748,1749],{"class":76},"     * Clear all cached data (use with caution)\n",[70,1751,1753],{"class":72,"line":1752},116,[70,1754,585],{"class":76},[70,1756,1758,1761,1763,1765],{"class":72,"line":1757},117,[70,1759,1760],{"class":97},"    clear",[70,1762,459],{"class":87},[70,1764,250],{"class":83},[70,1766,464],{"class":87},[70,1768,1770,1772,1774,1777],{"class":72,"line":1769},118,[70,1771,469],{"class":438},[70,1773,651],{"class":87},[70,1775,1776],{"class":97},"clearClientData",[70,1778,101],{"class":87},[70,1780,1782],{"class":72,"line":1781},119,[70,1783,502],{"class":87},[70,1785,1787],{"class":72,"line":1786},120,[70,1788,155],{"emptyLinePlaceholder":154},[70,1790,1792,1795],{"class":72,"line":1791},121,[70,1793,1794],{"class":87},"    type: ",[70,1796,1797],{"class":116},"'SessionCacheUtil'\n",[70,1799,1801],{"class":72,"line":1800},122,[70,1802,1803],{"class":87},"};\n",[24,1805,1807],{"id":1806},"using-the-session-cache-script-include-in-before-query-business-rules","Using the Session Cache Script Include in Before Query Business Rules",[12,1809,1810],{},"Now let's transform our earlier inefficient Before Query Business Rule:",[61,1812,1814],{"className":63,"code":1813,"language":65,"meta":66,"style":66},"\u002F\u002F Before Query Business Rule on incident table\n\u002F\u002F Name: Filter Incidents by User Region\n\u002F\u002F When: before\n\u002F\u002F Query: true\n\u002F\u002F Order: 100\n\n(function executeRule(current, previous \u002F*null when async*\u002F) {\n    var cache = new SessionCacheUtil();\n\n    \u002F\u002F Get user region from cache or database\n    var userRegion = cache.getOrSet('user_region', function() {\n        var userGR = new GlideRecord('sys_user');\n        if (userGR.get(gs.getUserID())) {\n            return userGR.getValue('u_region');\n        }\n        return '';\n    });\n\n    \u002F\u002F Filter incidents to only show records from user's region\n    if (userRegion) {\n        current.addQuery('u_region', userRegion);\n    }\n})(current, previous);\n",[52,1815,1816,1820,1825,1830,1835,1840,1844,1864,1880,1884,1889,1914,1932,1948,1962,1966,1974,1979,1983,1987,1995,2008,2013],{"__ignoreMap":66},[70,1817,1818],{"class":72,"line":73},[70,1819,243],{"class":76},[70,1821,1822],{"class":72,"line":80},[70,1823,1824],{"class":76},"\u002F\u002F Name: Filter Incidents by User Region\n",[70,1826,1827],{"class":72,"line":104},[70,1828,1829],{"class":76},"\u002F\u002F When: before\n",[70,1831,1832],{"class":72,"line":129},[70,1833,1834],{"class":76},"\u002F\u002F Query: true\n",[70,1836,1837],{"class":72,"line":151},[70,1838,1839],{"class":76},"\u002F\u002F Order: 100\n",[70,1841,1842],{"class":72,"line":158},[70,1843,155],{"emptyLinePlaceholder":154},[70,1845,1846,1848,1850,1852,1854,1856,1858,1860,1862],{"class":72,"line":164},[70,1847,113],{"class":87},[70,1849,250],{"class":83},[70,1851,253],{"class":97},[70,1853,113],{"class":87},[70,1855,259],{"class":258},[70,1857,120],{"class":87},[70,1859,264],{"class":258},[70,1861,267],{"class":76},[70,1863,270],{"class":87},[70,1865,1866,1868,1871,1873,1875,1878],{"class":72,"line":344},[70,1867,280],{"class":83},[70,1869,1870],{"class":87}," cache ",[70,1872,91],{"class":83},[70,1874,288],{"class":83},[70,1876,1877],{"class":97}," SessionCacheUtil",[70,1879,101],{"class":87},[70,1881,1882],{"class":72,"line":350},[70,1883,155],{"emptyLinePlaceholder":154},[70,1885,1886],{"class":72,"line":366},[70,1887,1888],{"class":76},"    \u002F\u002F Get user region from cache or database\n",[70,1890,1891,1893,1895,1897,1900,1903,1905,1908,1910,1912],{"class":72,"line":536},[70,1892,280],{"class":83},[70,1894,322],{"class":87},[70,1896,91],{"class":83},[70,1898,1899],{"class":87}," cache.",[70,1901,1902],{"class":97},"getOrSet",[70,1904,113],{"class":87},[70,1906,1907],{"class":116},"'user_region'",[70,1909,120],{"class":87},[70,1911,250],{"class":83},[70,1913,464],{"class":87},[70,1915,1916,1918,1920,1922,1924,1926,1928,1930],{"class":72,"line":552},[70,1917,618],{"class":83},[70,1919,283],{"class":87},[70,1921,91],{"class":83},[70,1923,288],{"class":83},[70,1925,291],{"class":97},[70,1927,113],{"class":87},[70,1929,296],{"class":116},[70,1931,126],{"class":87},[70,1933,1934,1936,1939,1941,1943,1945],{"class":72,"line":568},[70,1935,673],{"class":83},[70,1937,1938],{"class":87}," (userGR.",[70,1940,306],{"class":97},[70,1942,309],{"class":87},[70,1944,312],{"class":97},[70,1946,1947],{"class":87},"())) {\n",[70,1949,1950,1952,1954,1956,1958,1960],{"class":72,"line":582},[70,1951,950],{"class":83},[70,1953,327],{"class":87},[70,1955,330],{"class":97},[70,1957,113],{"class":87},[70,1959,335],{"class":116},[70,1961,126],{"class":87},[70,1963,1964],{"class":72,"line":588},[70,1965,959],{"class":87},[70,1967,1968,1970,1972],{"class":72,"line":615},[70,1969,987],{"class":83},[70,1971,701],{"class":116},[70,1973,497],{"class":87},[70,1975,1976],{"class":72,"line":639},[70,1977,1978],{"class":87},"    });\n",[70,1980,1981],{"class":72,"line":659},[70,1982,155],{"emptyLinePlaceholder":154},[70,1984,1985],{"class":72,"line":664},[70,1986,347],{"class":76},[70,1988,1989,1992],{"class":72,"line":670},[70,1990,1991],{"class":83},"    if",[70,1993,1994],{"class":87}," (userRegion) {\n",[70,1996,1997,2000,2002,2004,2006],{"class":72,"line":706},[70,1998,1999],{"class":87},"        current.",[70,2001,356],{"class":97},[70,2003,113],{"class":87},[70,2005,335],{"class":116},[70,2007,363],{"class":87},[70,2009,2010],{"class":72,"line":712},[70,2011,2012],{"class":87},"    }\n",[70,2014,2015],{"class":72,"line":721},[70,2016,369],{"class":87},[12,2018,2019,2022,2023,2026],{},[38,2020,2021],{},"The difference?"," The database query for the user's region now executes ",[38,2024,2025],{},"once per session"," instead of hundreds or thousands of times. After the first query, all subsequent executions read from the in-memory session cache.",[16,2028,2030],{"id":2029},"real-world-examples-and-patterns","Real-World Examples and Patterns",[24,2032,2034],{"id":2033},"example-1-caching-company-hierarchy","Example 1: Caching Company Hierarchy",[12,2036,2037],{},"A common use case is filtering records based on a company hierarchy. Users should only see records from their company and all child companies.",[61,2039,2041],{"className":63,"code":2040,"language":65,"meta":66,"style":66},"\u002F\u002F Script Include: CompanyHierarchyUtil\nvar CompanyHierarchyUtil = Class.create();\nCompanyHierarchyUtil.prototype = {\n    initialize: function() {\n        this.cache = new SessionCacheUtil();\n    },\n\n    \u002F**\n     * Get all company sys_ids in user's hierarchy (comma-separated)\n     * @returns {string} Comma-separated list of company sys_ids\n     *\u002F\n    getUserCompanyHierarchy: function() {\n        return this.cache.getOrSet('user_company_hierarchy', function() {\n            var companies = [];\n            var userCompanyId = gs.getUser().getCompanyID();\n\n            if (!userCompanyId) {\n                return '';\n            }\n\n            \u002F\u002F Add user's company\n            companies.push(userCompanyId);\n\n            \u002F\u002F Get all child companies recursively\n            this._getChildCompanies(userCompanyId, companies);\n\n            return companies.join(',');\n        }.bind(this));\n    },\n\n    \u002F**\n     * Recursively get all child companies\n     * @param {string} parentId - Parent company sys_id\n     * @param {Array} companies - Array to store company sys_ids\n     *\u002F\n    _getChildCompanies: function(parentId, companies) {\n        var companyGR = new GlideRecord('core_company');\n        companyGR.addQuery('parent', parentId);\n        companyGR.query();\n\n        while (companyGR.next()) {\n            var childId = companyGR.getValue('sys_id');\n            companies.push(childId);\n\n            \u002F\u002F Recursively get children of this company\n            this._getChildCompanies(childId, companies);\n        }\n    },\n\n    type: 'CompanyHierarchyUtil'\n};\n",[52,2042,2043,2048,2063,2076,2086,2101,2105,2109,2113,2118,2129,2133,2144,2166,2178,2199,2203,2215,2224,2228,2232,2237,2248,2252,2257,2269,2273,2290,2306,2310,2314,2318,2323,2337,2352,2356,2377,2397,2412,2421,2425,2439,2460,2469,2473,2478,2489,2493,2497,2501,2508],{"__ignoreMap":66},[70,2044,2045],{"class":72,"line":73},[70,2046,2047],{"class":76},"\u002F\u002F Script Include: CompanyHierarchyUtil\n",[70,2049,2050,2052,2055,2057,2059,2061],{"class":72,"line":80},[70,2051,84],{"class":83},[70,2053,2054],{"class":87}," CompanyHierarchyUtil ",[70,2056,91],{"class":83},[70,2058,428],{"class":87},[70,2060,431],{"class":97},[70,2062,101],{"class":87},[70,2064,2065,2068,2070,2072,2074],{"class":72,"line":104},[70,2066,2067],{"class":438},"CompanyHierarchyUtil",[70,2069,442],{"class":87},[70,2071,445],{"class":438},[70,2073,448],{"class":83},[70,2075,451],{"class":87},[70,2077,2078,2080,2082,2084],{"class":72,"line":129},[70,2079,456],{"class":97},[70,2081,459],{"class":87},[70,2083,250],{"class":83},[70,2085,464],{"class":87},[70,2087,2088,2090,2093,2095,2097,2099],{"class":72,"line":151},[70,2089,469],{"class":438},[70,2091,2092],{"class":87},".cache ",[70,2094,91],{"class":83},[70,2096,288],{"class":83},[70,2098,1877],{"class":97},[70,2100,101],{"class":87},[70,2102,2103],{"class":72,"line":158},[70,2104,502],{"class":87},[70,2106,2107],{"class":72,"line":164},[70,2108,155],{"emptyLinePlaceholder":154},[70,2110,2111],{"class":72,"line":344},[70,2112,511],{"class":76},[70,2114,2115],{"class":72,"line":350},[70,2116,2117],{"class":76},"     * Get all company sys_ids in user's hierarchy (comma-separated)\n",[70,2119,2120,2122,2124,2126],{"class":72,"line":366},[70,2121,521],{"class":76},[70,2123,573],{"class":83},[70,2125,527],{"class":97},[70,2127,2128],{"class":76}," Comma-separated list of company sys_ids\n",[70,2130,2131],{"class":72,"line":536},[70,2132,585],{"class":76},[70,2134,2135,2138,2140,2142],{"class":72,"line":552},[70,2136,2137],{"class":97},"    getUserCompanyHierarchy",[70,2139,459],{"class":87},[70,2141,250],{"class":83},[70,2143,464],{"class":87},[70,2145,2146,2148,2150,2153,2155,2157,2160,2162,2164],{"class":72,"line":568},[70,2147,987],{"class":83},[70,2149,626],{"class":438},[70,2151,2152],{"class":87},".cache.",[70,2154,1902],{"class":97},[70,2156,113],{"class":87},[70,2158,2159],{"class":116},"'user_company_hierarchy'",[70,2161,120],{"class":87},[70,2163,250],{"class":83},[70,2165,464],{"class":87},[70,2167,2168,2170,2173,2175],{"class":72,"line":582},[70,2169,1162],{"class":83},[70,2171,2172],{"class":87}," companies ",[70,2174,91],{"class":83},[70,2176,2177],{"class":87}," [];\n",[70,2179,2180,2182,2185,2187,2189,2192,2194,2197],{"class":72,"line":588},[70,2181,1162],{"class":83},[70,2183,2184],{"class":87}," userCompanyId ",[70,2186,91],{"class":83},[70,2188,94],{"class":87},[70,2190,2191],{"class":97},"getUser",[70,2193,791],{"class":87},[70,2195,2196],{"class":97},"getCompanyID",[70,2198,101],{"class":87},[70,2200,2201],{"class":72,"line":615},[70,2202,155],{"emptyLinePlaceholder":154},[70,2204,2205,2207,2209,2212],{"class":72,"line":639},[70,2206,715],{"class":83},[70,2208,1130],{"class":87},[70,2210,2211],{"class":83},"!",[70,2213,2214],{"class":87},"userCompanyId) {\n",[70,2216,2217,2220,2222],{"class":72,"line":659},[70,2218,2219],{"class":83},"                return",[70,2221,701],{"class":116},[70,2223,497],{"class":87},[70,2225,2226],{"class":72,"line":664},[70,2227,922],{"class":87},[70,2229,2230],{"class":72,"line":670},[70,2231,155],{"emptyLinePlaceholder":154},[70,2233,2234],{"class":72,"line":706},[70,2235,2236],{"class":76},"            \u002F\u002F Add user's company\n",[70,2238,2239,2242,2245],{"class":72,"line":712},[70,2240,2241],{"class":87},"            companies.",[70,2243,2244],{"class":97},"push",[70,2246,2247],{"class":87},"(userCompanyId);\n",[70,2249,2250],{"class":72,"line":721},[70,2251,155],{"emptyLinePlaceholder":154},[70,2253,2254],{"class":72,"line":742},[70,2255,2256],{"class":76},"            \u002F\u002F Get all child companies recursively\n",[70,2258,2259,2261,2263,2266],{"class":72,"line":761},[70,2260,1182],{"class":438},[70,2262,442],{"class":87},[70,2264,2265],{"class":97},"_getChildCompanies",[70,2267,2268],{"class":87},"(userCompanyId, companies);\n",[70,2270,2271],{"class":72,"line":766},[70,2272,155],{"emptyLinePlaceholder":154},[70,2274,2275,2277,2280,2283,2285,2288],{"class":72,"line":775},[70,2276,950],{"class":83},[70,2278,2279],{"class":87}," companies.",[70,2281,2282],{"class":97},"join",[70,2284,113],{"class":87},[70,2286,2287],{"class":116},"','",[70,2289,126],{"class":87},[70,2291,2292,2295,2298,2300,2303],{"class":72,"line":799},[70,2293,2294],{"class":87},"        }.",[70,2296,2297],{"class":97},"bind",[70,2299,113],{"class":87},[70,2301,2302],{"class":438},"this",[70,2304,2305],{"class":87},"));\n",[70,2307,2308],{"class":72,"line":815},[70,2309,502],{"class":87},[70,2311,2312],{"class":72,"line":846},[70,2313,155],{"emptyLinePlaceholder":154},[70,2315,2316],{"class":72,"line":851},[70,2317,511],{"class":76},[70,2319,2320],{"class":72,"line":866},[70,2321,2322],{"class":76},"     * Recursively get all child companies\n",[70,2324,2325,2327,2329,2331,2334],{"class":72,"line":885},[70,2326,521],{"class":76},[70,2328,524],{"class":83},[70,2330,527],{"class":97},[70,2332,2333],{"class":87}," parentId",[70,2335,2336],{"class":76}," - Parent company sys_id\n",[70,2338,2339,2341,2343,2346,2349],{"class":72,"line":891},[70,2340,521],{"class":76},[70,2342,524],{"class":83},[70,2344,2345],{"class":97}," {Array}",[70,2347,2348],{"class":87}," companies",[70,2350,2351],{"class":76}," - Array to store company sys_ids\n",[70,2353,2354],{"class":72,"line":907},[70,2355,585],{"class":76},[70,2357,2358,2361,2363,2365,2367,2370,2372,2375],{"class":72,"line":913},[70,2359,2360],{"class":97},"    _getChildCompanies",[70,2362,459],{"class":87},[70,2364,250],{"class":83},[70,2366,113],{"class":87},[70,2368,2369],{"class":258},"parentId",[70,2371,120],{"class":87},[70,2373,2374],{"class":258},"companies",[70,2376,270],{"class":87},[70,2378,2379,2381,2384,2386,2388,2390,2392,2395],{"class":72,"line":919},[70,2380,618],{"class":83},[70,2382,2383],{"class":87}," companyGR ",[70,2385,91],{"class":83},[70,2387,288],{"class":83},[70,2389,291],{"class":97},[70,2391,113],{"class":87},[70,2393,2394],{"class":116},"'core_company'",[70,2396,126],{"class":87},[70,2398,2399,2402,2404,2406,2409],{"class":72,"line":925},[70,2400,2401],{"class":87},"        companyGR.",[70,2403,356],{"class":97},[70,2405,113],{"class":87},[70,2407,2408],{"class":116},"'parent'",[70,2410,2411],{"class":87},", parentId);\n",[70,2413,2414,2416,2419],{"class":72,"line":930},[70,2415,2401],{"class":87},[70,2417,2418],{"class":97},"query",[70,2420,101],{"class":87},[70,2422,2423],{"class":72,"line":947},[70,2424,155],{"emptyLinePlaceholder":154},[70,2426,2427,2430,2433,2436],{"class":72,"line":956},[70,2428,2429],{"class":83},"        while",[70,2431,2432],{"class":87}," (companyGR.",[70,2434,2435],{"class":97},"next",[70,2437,2438],{"class":87},"()) {\n",[70,2440,2441,2443,2446,2448,2451,2453,2455,2458],{"class":72,"line":962},[70,2442,1162],{"class":83},[70,2444,2445],{"class":87}," childId ",[70,2447,91],{"class":83},[70,2449,2450],{"class":87}," companyGR.",[70,2452,330],{"class":97},[70,2454,113],{"class":87},[70,2456,2457],{"class":116},"'sys_id'",[70,2459,126],{"class":87},[70,2461,2462,2464,2466],{"class":72,"line":967},[70,2463,2241],{"class":87},[70,2465,2244],{"class":97},[70,2467,2468],{"class":87},"(childId);\n",[70,2470,2471],{"class":72,"line":984},[70,2472,155],{"emptyLinePlaceholder":154},[70,2474,2475],{"class":72,"line":998},[70,2476,2477],{"class":76},"            \u002F\u002F Recursively get children of this company\n",[70,2479,2480,2482,2484,2486],{"class":72,"line":1003},[70,2481,1182],{"class":438},[70,2483,442],{"class":87},[70,2485,2265],{"class":97},[70,2487,2488],{"class":87},"(childId, companies);\n",[70,2490,2491],{"class":72,"line":1008},[70,2492,959],{"class":87},[70,2494,2495],{"class":72,"line":1013},[70,2496,502],{"class":87},[70,2498,2499],{"class":72,"line":1019},[70,2500,155],{"emptyLinePlaceholder":154},[70,2502,2503,2505],{"class":72,"line":1032},[70,2504,1794],{"class":87},[70,2506,2507],{"class":116},"'CompanyHierarchyUtil'\n",[70,2509,2510],{"class":72,"line":1046},[70,2511,1803],{"class":87},[12,2513,2514],{},"Now use it in a Before Query Business Rule:",[61,2516,2518],{"className":63,"code":2517,"language":65,"meta":66,"style":66},"\u002F\u002F Before Query Business Rule on contract table\n(function executeRule(current, previous \u002F*null when async*\u002F) {\n    var hierarchyUtil = new CompanyHierarchyUtil();\n    var companyHierarchy = hierarchyUtil.getUserCompanyHierarchy();\n\n    if (companyHierarchy) {\n        current.addQuery('company', 'IN', companyHierarchy);\n    }\n})(current, previous);\n",[52,2519,2520,2525,2545,2561,2578,2582,2589,2608,2612],{"__ignoreMap":66},[70,2521,2522],{"class":72,"line":73},[70,2523,2524],{"class":76},"\u002F\u002F Before Query Business Rule on contract table\n",[70,2526,2527,2529,2531,2533,2535,2537,2539,2541,2543],{"class":72,"line":80},[70,2528,113],{"class":87},[70,2530,250],{"class":83},[70,2532,253],{"class":97},[70,2534,113],{"class":87},[70,2536,259],{"class":258},[70,2538,120],{"class":87},[70,2540,264],{"class":258},[70,2542,267],{"class":76},[70,2544,270],{"class":87},[70,2546,2547,2549,2552,2554,2556,2559],{"class":72,"line":104},[70,2548,280],{"class":83},[70,2550,2551],{"class":87}," hierarchyUtil ",[70,2553,91],{"class":83},[70,2555,288],{"class":83},[70,2557,2558],{"class":97}," CompanyHierarchyUtil",[70,2560,101],{"class":87},[70,2562,2563,2565,2568,2570,2573,2576],{"class":72,"line":129},[70,2564,280],{"class":83},[70,2566,2567],{"class":87}," companyHierarchy ",[70,2569,91],{"class":83},[70,2571,2572],{"class":87}," hierarchyUtil.",[70,2574,2575],{"class":97},"getUserCompanyHierarchy",[70,2577,101],{"class":87},[70,2579,2580],{"class":72,"line":151},[70,2581,155],{"emptyLinePlaceholder":154},[70,2583,2584,2586],{"class":72,"line":158},[70,2585,1991],{"class":83},[70,2587,2588],{"class":87}," (companyHierarchy) {\n",[70,2590,2591,2593,2595,2597,2600,2602,2605],{"class":72,"line":164},[70,2592,1999],{"class":87},[70,2594,356],{"class":97},[70,2596,113],{"class":87},[70,2598,2599],{"class":116},"'company'",[70,2601,120],{"class":87},[70,2603,2604],{"class":116},"'IN'",[70,2606,2607],{"class":87},", companyHierarchy);\n",[70,2609,2610],{"class":72,"line":344},[70,2611,2012],{"class":87},[70,2613,2614],{"class":72,"line":350},[70,2615,369],{"class":87},[24,2617,2619],{"id":2618},"example-2-caching-user-department-and-location","Example 2: Caching User Department and Location",[12,2621,2622],{},"Filter records based on multiple user attributes:",[61,2624,2626],{"className":63,"code":2625,"language":65,"meta":66,"style":66},"\u002F\u002F Script Include: UserContextCache\nvar UserContextCache = Class.create();\nUserContextCache.prototype = {\n    initialize: function() {\n        this.cache = new SessionCacheUtil();\n    },\n\n    \u002F**\n     * Get user's department sys_id\n     * @returns {string} Department sys_id\n     *\u002F\n    getUserDepartment: function() {\n        return this.cache.getOrSet('user_department', function() {\n            var user = gs.getUser();\n            return user.getDepartmentID() || '';\n        });\n    },\n\n    \u002F**\n     * Get user's location sys_id\n     * @returns {string} Location sys_id\n     *\u002F\n    getUserLocation: function() {\n        return this.cache.getOrSet('user_location', function() {\n            var userGR = new GlideRecord('sys_user');\n            if (userGR.get(gs.getUserID())) {\n                return userGR.getValue('location') || '';\n            }\n            return '';\n        });\n    },\n\n    \u002F**\n     * Get user's manager sys_id\n     * @returns {string} Manager sys_id\n     *\u002F\n    getUserManager: function() {\n        return this.cache.getOrSet('user_manager', function() {\n            var userGR = new GlideRecord('sys_user');\n            if (userGR.get(gs.getUserID())) {\n                return userGR.getValue('manager') || '';\n            }\n            return '';\n        });\n    },\n\n    \u002F**\n     * Check if user is in a specific group (cached)\n     * @param {string} groupName - Group name\n     * @returns {boolean} True if user is in group\n     *\u002F\n    isUserInGroup: function(groupName) {\n        var cacheKey = 'user_in_group_' + groupName;\n        var result = this.cache.get(cacheKey);\n\n        if (result !== null && result !== undefined) {\n            return result === 'true';\n        }\n\n        var inGroup = gs.getUser().isMemberOf(groupName);\n        this.cache.set(cacheKey, inGroup.toString());\n\n        return inGroup;\n    },\n\n    type: 'UserContextCache'\n};\n",[52,2627,2628,2633,2648,2661,2671,2685,2689,2693,2697,2702,2713,2717,2728,2749,2764,2784,2789,2793,2797,2801,2806,2817,2821,2832,2853,2871,2885,2907,2911,2919,2923,2927,2931,2935,2940,2951,2955,2966,2987,3005,3019,3040,3044,3052,3056,3060,3064,3068,3073,3087,3099,3103,3119,3135,3152,3156,3177,3190,3194,3198,3219,3235,3239,3246,3250,3254,3261],{"__ignoreMap":66},[70,2629,2630],{"class":72,"line":73},[70,2631,2632],{"class":76},"\u002F\u002F Script Include: UserContextCache\n",[70,2634,2635,2637,2640,2642,2644,2646],{"class":72,"line":80},[70,2636,84],{"class":83},[70,2638,2639],{"class":87}," UserContextCache ",[70,2641,91],{"class":83},[70,2643,428],{"class":87},[70,2645,431],{"class":97},[70,2647,101],{"class":87},[70,2649,2650,2653,2655,2657,2659],{"class":72,"line":104},[70,2651,2652],{"class":438},"UserContextCache",[70,2654,442],{"class":87},[70,2656,445],{"class":438},[70,2658,448],{"class":83},[70,2660,451],{"class":87},[70,2662,2663,2665,2667,2669],{"class":72,"line":129},[70,2664,456],{"class":97},[70,2666,459],{"class":87},[70,2668,250],{"class":83},[70,2670,464],{"class":87},[70,2672,2673,2675,2677,2679,2681,2683],{"class":72,"line":151},[70,2674,469],{"class":438},[70,2676,2092],{"class":87},[70,2678,91],{"class":83},[70,2680,288],{"class":83},[70,2682,1877],{"class":97},[70,2684,101],{"class":87},[70,2686,2687],{"class":72,"line":158},[70,2688,502],{"class":87},[70,2690,2691],{"class":72,"line":164},[70,2692,155],{"emptyLinePlaceholder":154},[70,2694,2695],{"class":72,"line":344},[70,2696,511],{"class":76},[70,2698,2699],{"class":72,"line":350},[70,2700,2701],{"class":76},"     * Get user's department sys_id\n",[70,2703,2704,2706,2708,2710],{"class":72,"line":366},[70,2705,521],{"class":76},[70,2707,573],{"class":83},[70,2709,527],{"class":97},[70,2711,2712],{"class":76}," Department sys_id\n",[70,2714,2715],{"class":72,"line":536},[70,2716,585],{"class":76},[70,2718,2719,2722,2724,2726],{"class":72,"line":552},[70,2720,2721],{"class":97},"    getUserDepartment",[70,2723,459],{"class":87},[70,2725,250],{"class":83},[70,2727,464],{"class":87},[70,2729,2730,2732,2734,2736,2738,2740,2743,2745,2747],{"class":72,"line":568},[70,2731,987],{"class":83},[70,2733,626],{"class":438},[70,2735,2152],{"class":87},[70,2737,1902],{"class":97},[70,2739,113],{"class":87},[70,2741,2742],{"class":116},"'user_department'",[70,2744,120],{"class":87},[70,2746,250],{"class":83},[70,2748,464],{"class":87},[70,2750,2751,2753,2756,2758,2760,2762],{"class":72,"line":582},[70,2752,1162],{"class":83},[70,2754,2755],{"class":87}," user ",[70,2757,91],{"class":83},[70,2759,94],{"class":87},[70,2761,2191],{"class":97},[70,2763,101],{"class":87},[70,2765,2766,2768,2771,2774,2777,2780,2782],{"class":72,"line":588},[70,2767,950],{"class":83},[70,2769,2770],{"class":87}," user.",[70,2772,2773],{"class":97},"getDepartmentID",[70,2775,2776],{"class":87},"() ",[70,2778,2779],{"class":83},"||",[70,2781,701],{"class":116},[70,2783,497],{"class":87},[70,2785,2786],{"class":72,"line":615},[70,2787,2788],{"class":87},"        });\n",[70,2790,2791],{"class":72,"line":639},[70,2792,502],{"class":87},[70,2794,2795],{"class":72,"line":659},[70,2796,155],{"emptyLinePlaceholder":154},[70,2798,2799],{"class":72,"line":664},[70,2800,511],{"class":76},[70,2802,2803],{"class":72,"line":670},[70,2804,2805],{"class":76},"     * Get user's location sys_id\n",[70,2807,2808,2810,2812,2814],{"class":72,"line":706},[70,2809,521],{"class":76},[70,2811,573],{"class":83},[70,2813,527],{"class":97},[70,2815,2816],{"class":76}," Location sys_id\n",[70,2818,2819],{"class":72,"line":712},[70,2820,585],{"class":76},[70,2822,2823,2826,2828,2830],{"class":72,"line":721},[70,2824,2825],{"class":97},"    getUserLocation",[70,2827,459],{"class":87},[70,2829,250],{"class":83},[70,2831,464],{"class":87},[70,2833,2834,2836,2838,2840,2842,2844,2847,2849,2851],{"class":72,"line":742},[70,2835,987],{"class":83},[70,2837,626],{"class":438},[70,2839,2152],{"class":87},[70,2841,1902],{"class":97},[70,2843,113],{"class":87},[70,2845,2846],{"class":116},"'user_location'",[70,2848,120],{"class":87},[70,2850,250],{"class":83},[70,2852,464],{"class":87},[70,2854,2855,2857,2859,2861,2863,2865,2867,2869],{"class":72,"line":761},[70,2856,1162],{"class":83},[70,2858,283],{"class":87},[70,2860,91],{"class":83},[70,2862,288],{"class":83},[70,2864,291],{"class":97},[70,2866,113],{"class":87},[70,2868,296],{"class":116},[70,2870,126],{"class":87},[70,2872,2873,2875,2877,2879,2881,2883],{"class":72,"line":766},[70,2874,715],{"class":83},[70,2876,1938],{"class":87},[70,2878,306],{"class":97},[70,2880,309],{"class":87},[70,2882,312],{"class":97},[70,2884,1947],{"class":87},[70,2886,2887,2889,2891,2893,2895,2898,2901,2903,2905],{"class":72,"line":775},[70,2888,2219],{"class":83},[70,2890,327],{"class":87},[70,2892,330],{"class":97},[70,2894,113],{"class":87},[70,2896,2897],{"class":116},"'location'",[70,2899,2900],{"class":87},") ",[70,2902,2779],{"class":83},[70,2904,701],{"class":116},[70,2906,497],{"class":87},[70,2908,2909],{"class":72,"line":799},[70,2910,922],{"class":87},[70,2912,2913,2915,2917],{"class":72,"line":815},[70,2914,950],{"class":83},[70,2916,701],{"class":116},[70,2918,497],{"class":87},[70,2920,2921],{"class":72,"line":846},[70,2922,2788],{"class":87},[70,2924,2925],{"class":72,"line":851},[70,2926,502],{"class":87},[70,2928,2929],{"class":72,"line":866},[70,2930,155],{"emptyLinePlaceholder":154},[70,2932,2933],{"class":72,"line":885},[70,2934,511],{"class":76},[70,2936,2937],{"class":72,"line":891},[70,2938,2939],{"class":76},"     * Get user's manager sys_id\n",[70,2941,2942,2944,2946,2948],{"class":72,"line":907},[70,2943,521],{"class":76},[70,2945,573],{"class":83},[70,2947,527],{"class":97},[70,2949,2950],{"class":76}," Manager sys_id\n",[70,2952,2953],{"class":72,"line":913},[70,2954,585],{"class":76},[70,2956,2957,2960,2962,2964],{"class":72,"line":919},[70,2958,2959],{"class":97},"    getUserManager",[70,2961,459],{"class":87},[70,2963,250],{"class":83},[70,2965,464],{"class":87},[70,2967,2968,2970,2972,2974,2976,2978,2981,2983,2985],{"class":72,"line":925},[70,2969,987],{"class":83},[70,2971,626],{"class":438},[70,2973,2152],{"class":87},[70,2975,1902],{"class":97},[70,2977,113],{"class":87},[70,2979,2980],{"class":116},"'user_manager'",[70,2982,120],{"class":87},[70,2984,250],{"class":83},[70,2986,464],{"class":87},[70,2988,2989,2991,2993,2995,2997,2999,3001,3003],{"class":72,"line":930},[70,2990,1162],{"class":83},[70,2992,283],{"class":87},[70,2994,91],{"class":83},[70,2996,288],{"class":83},[70,2998,291],{"class":97},[70,3000,113],{"class":87},[70,3002,296],{"class":116},[70,3004,126],{"class":87},[70,3006,3007,3009,3011,3013,3015,3017],{"class":72,"line":947},[70,3008,715],{"class":83},[70,3010,1938],{"class":87},[70,3012,306],{"class":97},[70,3014,309],{"class":87},[70,3016,312],{"class":97},[70,3018,1947],{"class":87},[70,3020,3021,3023,3025,3027,3029,3032,3034,3036,3038],{"class":72,"line":956},[70,3022,2219],{"class":83},[70,3024,327],{"class":87},[70,3026,330],{"class":97},[70,3028,113],{"class":87},[70,3030,3031],{"class":116},"'manager'",[70,3033,2900],{"class":87},[70,3035,2779],{"class":83},[70,3037,701],{"class":116},[70,3039,497],{"class":87},[70,3041,3042],{"class":72,"line":962},[70,3043,922],{"class":87},[70,3045,3046,3048,3050],{"class":72,"line":967},[70,3047,950],{"class":83},[70,3049,701],{"class":116},[70,3051,497],{"class":87},[70,3053,3054],{"class":72,"line":984},[70,3055,2788],{"class":87},[70,3057,3058],{"class":72,"line":998},[70,3059,502],{"class":87},[70,3061,3062],{"class":72,"line":1003},[70,3063,155],{"emptyLinePlaceholder":154},[70,3065,3066],{"class":72,"line":1008},[70,3067,511],{"class":76},[70,3069,3070],{"class":72,"line":1013},[70,3071,3072],{"class":76},"     * Check if user is in a specific group (cached)\n",[70,3074,3075,3077,3079,3081,3084],{"class":72,"line":1019},[70,3076,521],{"class":76},[70,3078,524],{"class":83},[70,3080,527],{"class":97},[70,3082,3083],{"class":87}," groupName",[70,3085,3086],{"class":76}," - Group name\n",[70,3088,3089,3091,3093,3096],{"class":72,"line":1032},[70,3090,521],{"class":76},[70,3092,573],{"class":83},[70,3094,3095],{"class":97}," {boolean}",[70,3097,3098],{"class":76}," True if user is in group\n",[70,3100,3101],{"class":72,"line":1046},[70,3102,585],{"class":76},[70,3104,3105,3108,3110,3112,3114,3117],{"class":72,"line":1059},[70,3106,3107],{"class":97},"    isUserInGroup",[70,3109,459],{"class":87},[70,3111,250],{"class":83},[70,3113,113],{"class":87},[70,3115,3116],{"class":258},"groupName",[70,3118,270],{"class":87},[70,3120,3121,3123,3125,3127,3130,3132],{"class":72,"line":1071},[70,3122,618],{"class":83},[70,3124,621],{"class":87},[70,3126,91],{"class":83},[70,3128,3129],{"class":116}," 'user_in_group_'",[70,3131,633],{"class":83},[70,3133,3134],{"class":87}," groupName;\n",[70,3136,3137,3139,3142,3144,3146,3148,3150],{"class":72,"line":1076},[70,3138,618],{"class":83},[70,3140,3141],{"class":87}," result ",[70,3143,91],{"class":83},[70,3145,626],{"class":438},[70,3147,2152],{"class":87},[70,3149,306],{"class":97},[70,3151,656],{"class":87},[70,3153,3154],{"class":72,"line":1100},[70,3155,155],{"emptyLinePlaceholder":154},[70,3157,3158,3160,3163,3165,3167,3169,3171,3173,3175],{"class":72,"line":1114},[70,3159,673],{"class":83},[70,3161,3162],{"class":87}," (result ",[70,3164,679],{"class":83},[70,3166,682],{"class":438},[70,3168,685],{"class":83},[70,3170,3141],{"class":87},[70,3172,679],{"class":83},[70,3174,692],{"class":438},[70,3176,270],{"class":87},[70,3178,3179,3181,3183,3185,3188],{"class":72,"line":1119},[70,3180,950],{"class":83},[70,3182,3141],{"class":87},[70,3184,1138],{"class":83},[70,3186,3187],{"class":116}," 'true'",[70,3189,497],{"class":87},[70,3191,3192],{"class":72,"line":1125},[70,3193,959],{"class":87},[70,3195,3196],{"class":72,"line":1159},[70,3197,155],{"emptyLinePlaceholder":154},[70,3199,3200,3202,3205,3207,3209,3211,3213,3216],{"class":72,"line":1179},[70,3201,618],{"class":83},[70,3203,3204],{"class":87}," inGroup ",[70,3206,91],{"class":83},[70,3208,94],{"class":87},[70,3210,2191],{"class":97},[70,3212,791],{"class":87},[70,3214,3215],{"class":97},"isMemberOf",[70,3217,3218],{"class":87},"(groupName);\n",[70,3220,3221,3223,3225,3228,3231,3233],{"class":72,"line":1192},[70,3222,469],{"class":438},[70,3224,2152],{"class":87},[70,3226,3227],{"class":97},"set",[70,3229,3230],{"class":87},"(cacheKey, inGroup.",[70,3232,1259],{"class":97},[70,3234,315],{"class":87},[70,3236,3237],{"class":72,"line":1197},[70,3238,155],{"emptyLinePlaceholder":154},[70,3240,3241,3243],{"class":72,"line":1203},[70,3242,987],{"class":83},[70,3244,3245],{"class":87}," inGroup;\n",[70,3247,3248],{"class":72,"line":1210},[70,3249,502],{"class":87},[70,3251,3252],{"class":72,"line":1227},[70,3253,155],{"emptyLinePlaceholder":154},[70,3255,3256,3258],{"class":72,"line":1246},[70,3257,1794],{"class":87},[70,3259,3260],{"class":116},"'UserContextCache'\n",[70,3262,3263],{"class":72,"line":1264},[70,3264,1803],{"class":87},[12,3266,3267],{},"Use in Before Query Business Rule:",[61,3269,3271],{"className":63,"code":3270,"language":65,"meta":66,"style":66},"\u002F\u002F Before Query Business Rule on kb_knowledge table\n(function executeRule(current, previous \u002F*null when async*\u002F) {\n    var userContext = new UserContextCache();\n\n    \u002F\u002F Only show knowledge articles from user's department or location\n    var dept = userContext.getUserDepartment();\n    var location = userContext.getUserLocation();\n\n    if (dept || location) {\n        var condition = current.addQuery('u_department', dept);\n        condition.addOrCondition('u_location', location);\n    }\n})(current, previous);\n",[52,3272,3273,3278,3298,3314,3318,3323,3340,3356,3360,3372,3394,3410,3414],{"__ignoreMap":66},[70,3274,3275],{"class":72,"line":73},[70,3276,3277],{"class":76},"\u002F\u002F Before Query Business Rule on kb_knowledge table\n",[70,3279,3280,3282,3284,3286,3288,3290,3292,3294,3296],{"class":72,"line":80},[70,3281,113],{"class":87},[70,3283,250],{"class":83},[70,3285,253],{"class":97},[70,3287,113],{"class":87},[70,3289,259],{"class":258},[70,3291,120],{"class":87},[70,3293,264],{"class":258},[70,3295,267],{"class":76},[70,3297,270],{"class":87},[70,3299,3300,3302,3305,3307,3309,3312],{"class":72,"line":104},[70,3301,280],{"class":83},[70,3303,3304],{"class":87}," userContext ",[70,3306,91],{"class":83},[70,3308,288],{"class":83},[70,3310,3311],{"class":97}," UserContextCache",[70,3313,101],{"class":87},[70,3315,3316],{"class":72,"line":129},[70,3317,155],{"emptyLinePlaceholder":154},[70,3319,3320],{"class":72,"line":151},[70,3321,3322],{"class":76},"    \u002F\u002F Only show knowledge articles from user's department or location\n",[70,3324,3325,3327,3330,3332,3335,3338],{"class":72,"line":158},[70,3326,280],{"class":83},[70,3328,3329],{"class":87}," dept ",[70,3331,91],{"class":83},[70,3333,3334],{"class":87}," userContext.",[70,3336,3337],{"class":97},"getUserDepartment",[70,3339,101],{"class":87},[70,3341,3342,3344,3347,3349,3351,3354],{"class":72,"line":164},[70,3343,280],{"class":83},[70,3345,3346],{"class":87}," location ",[70,3348,91],{"class":83},[70,3350,3334],{"class":87},[70,3352,3353],{"class":97},"getUserLocation",[70,3355,101],{"class":87},[70,3357,3358],{"class":72,"line":344},[70,3359,155],{"emptyLinePlaceholder":154},[70,3361,3362,3364,3367,3369],{"class":72,"line":350},[70,3363,1991],{"class":83},[70,3365,3366],{"class":87}," (dept ",[70,3368,2779],{"class":83},[70,3370,3371],{"class":87}," location) {\n",[70,3373,3374,3376,3379,3381,3384,3386,3388,3391],{"class":72,"line":366},[70,3375,618],{"class":83},[70,3377,3378],{"class":87}," condition ",[70,3380,91],{"class":83},[70,3382,3383],{"class":87}," current.",[70,3385,356],{"class":97},[70,3387,113],{"class":87},[70,3389,3390],{"class":116},"'u_department'",[70,3392,3393],{"class":87},", dept);\n",[70,3395,3396,3399,3402,3404,3407],{"class":72,"line":536},[70,3397,3398],{"class":87},"        condition.",[70,3400,3401],{"class":97},"addOrCondition",[70,3403,113],{"class":87},[70,3405,3406],{"class":116},"'u_location'",[70,3408,3409],{"class":87},", location);\n",[70,3411,3412],{"class":72,"line":552},[70,3413,2012],{"class":87},[70,3415,3416],{"class":72,"line":568},[70,3417,369],{"class":87},[24,3419,3421],{"id":3420},"example-3-caching-complex-calculations","Example 3: Caching Complex Calculations",[12,3423,3424],{},"Some Before Query Business Rules perform complex calculations that don't change during a session:",[61,3426,3428],{"className":63,"code":3427,"language":65,"meta":66,"style":66},"\u002F\u002F Script Include: TerritoryCalculator\nvar TerritoryCalculator = Class.create();\nTerritoryCalculator.prototype = {\n    initialize: function() {\n        this.cache = new SessionCacheUtil();\n    },\n\n    \u002F**\n     * Calculate user's sales territories based on complex logic\n     * @returns {string} Comma-separated list of territory sys_ids\n     *\u002F\n    getUserTerritories: function() {\n        return this.cache.getOrSet('user_territories', function() {\n            var territories = [];\n            var userId = gs.getUserID();\n\n            \u002F\u002F Complex query to determine territories\n            \u002F\u002F This might involve multiple tables, joins, or calculations\n            var territoryGR = new GlideRecord('u_territory_assignment');\n            territoryGR.addQuery('assigned_to', userId);\n            territoryGR.addActiveQuery();\n            territoryGR.query();\n\n            while (territoryGR.next()) {\n                territories.push(territoryGR.getValue('territory'));\n            }\n\n            \u002F\u002F Also check if user's manager has territories they inherit\n            var userGR = new GlideRecord('sys_user');\n            if (userGR.get(userId)) {\n                var managerId = userGR.getValue('manager');\n                if (managerId) {\n                    var managerTerritoryGR = new GlideRecord('u_territory_assignment');\n                    managerTerritoryGR.addQuery('assigned_to', managerId);\n                    managerTerritoryGR.addQuery('inheritable', true);\n                    managerTerritoryGR.addActiveQuery();\n                    managerTerritoryGR.query();\n\n                    while (managerTerritoryGR.next()) {\n                        var terrId = managerTerritoryGR.getValue('territory');\n                        if (territories.indexOf(terrId) === -1) {\n                            territories.push(terrId);\n                        }\n                    }\n                }\n            }\n\n            return territories.join(',');\n        });\n    },\n\n    type: 'TerritoryCalculator'\n};\n",[52,3429,3430,3435,3450,3463,3473,3487,3491,3495,3499,3504,3515,3519,3530,3551,3562,3577,3581,3586,3591,3611,3626,3635,3643,3647,3659,3678,3682,3686,3691,3709,3720,3739,3746,3765,3779,3797,3805,3813,3817,3829,3850,3874,3884,3889,3893,3897,3901,3905,3920,3924,3928,3932,3939],{"__ignoreMap":66},[70,3431,3432],{"class":72,"line":73},[70,3433,3434],{"class":76},"\u002F\u002F Script Include: TerritoryCalculator\n",[70,3436,3437,3439,3442,3444,3446,3448],{"class":72,"line":80},[70,3438,84],{"class":83},[70,3440,3441],{"class":87}," TerritoryCalculator ",[70,3443,91],{"class":83},[70,3445,428],{"class":87},[70,3447,431],{"class":97},[70,3449,101],{"class":87},[70,3451,3452,3455,3457,3459,3461],{"class":72,"line":104},[70,3453,3454],{"class":438},"TerritoryCalculator",[70,3456,442],{"class":87},[70,3458,445],{"class":438},[70,3460,448],{"class":83},[70,3462,451],{"class":87},[70,3464,3465,3467,3469,3471],{"class":72,"line":129},[70,3466,456],{"class":97},[70,3468,459],{"class":87},[70,3470,250],{"class":83},[70,3472,464],{"class":87},[70,3474,3475,3477,3479,3481,3483,3485],{"class":72,"line":151},[70,3476,469],{"class":438},[70,3478,2092],{"class":87},[70,3480,91],{"class":83},[70,3482,288],{"class":83},[70,3484,1877],{"class":97},[70,3486,101],{"class":87},[70,3488,3489],{"class":72,"line":158},[70,3490,502],{"class":87},[70,3492,3493],{"class":72,"line":164},[70,3494,155],{"emptyLinePlaceholder":154},[70,3496,3497],{"class":72,"line":344},[70,3498,511],{"class":76},[70,3500,3501],{"class":72,"line":350},[70,3502,3503],{"class":76},"     * Calculate user's sales territories based on complex logic\n",[70,3505,3506,3508,3510,3512],{"class":72,"line":366},[70,3507,521],{"class":76},[70,3509,573],{"class":83},[70,3511,527],{"class":97},[70,3513,3514],{"class":76}," Comma-separated list of territory sys_ids\n",[70,3516,3517],{"class":72,"line":536},[70,3518,585],{"class":76},[70,3520,3521,3524,3526,3528],{"class":72,"line":552},[70,3522,3523],{"class":97},"    getUserTerritories",[70,3525,459],{"class":87},[70,3527,250],{"class":83},[70,3529,464],{"class":87},[70,3531,3532,3534,3536,3538,3540,3542,3545,3547,3549],{"class":72,"line":568},[70,3533,987],{"class":83},[70,3535,626],{"class":438},[70,3537,2152],{"class":87},[70,3539,1902],{"class":97},[70,3541,113],{"class":87},[70,3543,3544],{"class":116},"'user_territories'",[70,3546,120],{"class":87},[70,3548,250],{"class":83},[70,3550,464],{"class":87},[70,3552,3553,3555,3558,3560],{"class":72,"line":582},[70,3554,1162],{"class":83},[70,3556,3557],{"class":87}," territories ",[70,3559,91],{"class":83},[70,3561,2177],{"class":87},[70,3563,3564,3566,3569,3571,3573,3575],{"class":72,"line":588},[70,3565,1162],{"class":83},[70,3567,3568],{"class":87}," userId ",[70,3570,91],{"class":83},[70,3572,94],{"class":87},[70,3574,312],{"class":97},[70,3576,101],{"class":87},[70,3578,3579],{"class":72,"line":615},[70,3580,155],{"emptyLinePlaceholder":154},[70,3582,3583],{"class":72,"line":639},[70,3584,3585],{"class":76},"            \u002F\u002F Complex query to determine territories\n",[70,3587,3588],{"class":72,"line":659},[70,3589,3590],{"class":76},"            \u002F\u002F This might involve multiple tables, joins, or calculations\n",[70,3592,3593,3595,3598,3600,3602,3604,3606,3609],{"class":72,"line":664},[70,3594,1162],{"class":83},[70,3596,3597],{"class":87}," territoryGR ",[70,3599,91],{"class":83},[70,3601,288],{"class":83},[70,3603,291],{"class":97},[70,3605,113],{"class":87},[70,3607,3608],{"class":116},"'u_territory_assignment'",[70,3610,126],{"class":87},[70,3612,3613,3616,3618,3620,3623],{"class":72,"line":670},[70,3614,3615],{"class":87},"            territoryGR.",[70,3617,356],{"class":97},[70,3619,113],{"class":87},[70,3621,3622],{"class":116},"'assigned_to'",[70,3624,3625],{"class":87},", userId);\n",[70,3627,3628,3630,3633],{"class":72,"line":706},[70,3629,3615],{"class":87},[70,3631,3632],{"class":97},"addActiveQuery",[70,3634,101],{"class":87},[70,3636,3637,3639,3641],{"class":72,"line":712},[70,3638,3615],{"class":87},[70,3640,2418],{"class":97},[70,3642,101],{"class":87},[70,3644,3645],{"class":72,"line":721},[70,3646,155],{"emptyLinePlaceholder":154},[70,3648,3649,3652,3655,3657],{"class":72,"line":742},[70,3650,3651],{"class":83},"            while",[70,3653,3654],{"class":87}," (territoryGR.",[70,3656,2435],{"class":97},[70,3658,2438],{"class":87},[70,3660,3661,3664,3666,3669,3671,3673,3676],{"class":72,"line":761},[70,3662,3663],{"class":87},"                territories.",[70,3665,2244],{"class":97},[70,3667,3668],{"class":87},"(territoryGR.",[70,3670,330],{"class":97},[70,3672,113],{"class":87},[70,3674,3675],{"class":116},"'territory'",[70,3677,2305],{"class":87},[70,3679,3680],{"class":72,"line":766},[70,3681,922],{"class":87},[70,3683,3684],{"class":72,"line":775},[70,3685,155],{"emptyLinePlaceholder":154},[70,3687,3688],{"class":72,"line":799},[70,3689,3690],{"class":76},"            \u002F\u002F Also check if user's manager has territories they inherit\n",[70,3692,3693,3695,3697,3699,3701,3703,3705,3707],{"class":72,"line":815},[70,3694,1162],{"class":83},[70,3696,283],{"class":87},[70,3698,91],{"class":83},[70,3700,288],{"class":83},[70,3702,291],{"class":97},[70,3704,113],{"class":87},[70,3706,296],{"class":116},[70,3708,126],{"class":87},[70,3710,3711,3713,3715,3717],{"class":72,"line":846},[70,3712,715],{"class":83},[70,3714,1938],{"class":87},[70,3716,306],{"class":97},[70,3718,3719],{"class":87},"(userId)) {\n",[70,3721,3722,3724,3727,3729,3731,3733,3735,3737],{"class":72,"line":851},[70,3723,724],{"class":83},[70,3725,3726],{"class":87}," managerId ",[70,3728,91],{"class":83},[70,3730,327],{"class":87},[70,3732,330],{"class":97},[70,3734,113],{"class":87},[70,3736,3031],{"class":116},[70,3738,126],{"class":87},[70,3740,3741,3743],{"class":72,"line":866},[70,3742,769],{"class":83},[70,3744,3745],{"class":87}," (managerId) {\n",[70,3747,3748,3750,3753,3755,3757,3759,3761,3763],{"class":72,"line":885},[70,3749,778],{"class":83},[70,3751,3752],{"class":87}," managerTerritoryGR ",[70,3754,91],{"class":83},[70,3756,288],{"class":83},[70,3758,291],{"class":97},[70,3760,113],{"class":87},[70,3762,3608],{"class":116},[70,3764,126],{"class":87},[70,3766,3767,3770,3772,3774,3776],{"class":72,"line":891},[70,3768,3769],{"class":87},"                    managerTerritoryGR.",[70,3771,356],{"class":97},[70,3773,113],{"class":87},[70,3775,3622],{"class":116},[70,3777,3778],{"class":87},", managerId);\n",[70,3780,3781,3783,3785,3787,3790,3792,3795],{"class":72,"line":907},[70,3782,3769],{"class":87},[70,3784,356],{"class":97},[70,3786,113],{"class":87},[70,3788,3789],{"class":116},"'inheritable'",[70,3791,120],{"class":87},[70,3793,3794],{"class":438},"true",[70,3796,126],{"class":87},[70,3798,3799,3801,3803],{"class":72,"line":913},[70,3800,3769],{"class":87},[70,3802,3632],{"class":97},[70,3804,101],{"class":87},[70,3806,3807,3809,3811],{"class":72,"line":919},[70,3808,3769],{"class":87},[70,3810,2418],{"class":97},[70,3812,101],{"class":87},[70,3814,3815],{"class":72,"line":925},[70,3816,155],{"emptyLinePlaceholder":154},[70,3818,3819,3822,3825,3827],{"class":72,"line":930},[70,3820,3821],{"class":83},"                    while",[70,3823,3824],{"class":87}," (managerTerritoryGR.",[70,3826,2435],{"class":97},[70,3828,2438],{"class":87},[70,3830,3831,3834,3837,3839,3842,3844,3846,3848],{"class":72,"line":947},[70,3832,3833],{"class":83},"                        var",[70,3835,3836],{"class":87}," terrId ",[70,3838,91],{"class":83},[70,3840,3841],{"class":87}," managerTerritoryGR.",[70,3843,330],{"class":97},[70,3845,113],{"class":87},[70,3847,3675],{"class":116},[70,3849,126],{"class":87},[70,3851,3852,3855,3858,3861,3864,3866,3869,3872],{"class":72,"line":956},[70,3853,3854],{"class":83},"                        if",[70,3856,3857],{"class":87}," (territories.",[70,3859,3860],{"class":97},"indexOf",[70,3862,3863],{"class":87},"(terrId) ",[70,3865,1138],{"class":83},[70,3867,3868],{"class":83}," -",[70,3870,3871],{"class":438},"1",[70,3873,270],{"class":87},[70,3875,3876,3879,3881],{"class":72,"line":962},[70,3877,3878],{"class":87},"                            territories.",[70,3880,2244],{"class":97},[70,3882,3883],{"class":87},"(terrId);\n",[70,3885,3886],{"class":72,"line":967},[70,3887,3888],{"class":87},"                        }\n",[70,3890,3891],{"class":72,"line":984},[70,3892,910],{"class":87},[70,3894,3895],{"class":72,"line":998},[70,3896,916],{"class":87},[70,3898,3899],{"class":72,"line":1003},[70,3900,922],{"class":87},[70,3902,3903],{"class":72,"line":1008},[70,3904,155],{"emptyLinePlaceholder":154},[70,3906,3907,3909,3912,3914,3916,3918],{"class":72,"line":1013},[70,3908,950],{"class":83},[70,3910,3911],{"class":87}," territories.",[70,3913,2282],{"class":97},[70,3915,113],{"class":87},[70,3917,2287],{"class":116},[70,3919,126],{"class":87},[70,3921,3922],{"class":72,"line":1019},[70,3923,2788],{"class":87},[70,3925,3926],{"class":72,"line":1032},[70,3927,502],{"class":87},[70,3929,3930],{"class":72,"line":1046},[70,3931,155],{"emptyLinePlaceholder":154},[70,3933,3934,3936],{"class":72,"line":1059},[70,3935,1794],{"class":87},[70,3937,3938],{"class":116},"'TerritoryCalculator'\n",[70,3940,3941],{"class":72,"line":1071},[70,3942,1803],{"class":87},[16,3944,3946],{"id":3945},"best-practices-and-important-considerations","Best Practices and Important Considerations",[24,3948,3950],{"id":3949},"_1-only-cache-immutable-data-types","1. Only Cache Immutable Data Types",[12,3952,3953],{},"For caching purposes, you should only use immutable data types—in JavaScript, these are strings and numbers. All other data types are internally represented by references, which can lead to:",[32,3955,3956,3959,3962],{},[35,3957,3958],{},"The cached data being changed outside the cache",[35,3960,3961],{},"Memory leaks",[35,3963,3964],{},"Unexpected behavior",[61,3966,3968],{"className":63,"code":3967,"language":65,"meta":66,"style":66},"\u002F\u002F Good: Cache strings and numbers\ncache.set('user_region', 'EMEA');\ncache.set('user_score', 100);\n\n\u002F\u002F Bad: Don't cache objects or arrays\ncache.set('user_object', {name: 'John'}); \u002F\u002F DON'T DO THIS\ncache.set('company_list', ['comp1', 'comp2']); \u002F\u002F DON'T DO THIS\n\n\u002F\u002F Good alternative: Convert to string\ncache.set('company_list', 'comp1,comp2');\n",[52,3969,3970,3975,3992,4010,4014,4019,4042,4069,4073,4078],{"__ignoreMap":66},[70,3971,3972],{"class":72,"line":73},[70,3973,3974],{"class":76},"\u002F\u002F Good: Cache strings and numbers\n",[70,3976,3977,3980,3982,3984,3986,3988,3990],{"class":72,"line":80},[70,3978,3979],{"class":87},"cache.",[70,3981,3227],{"class":97},[70,3983,113],{"class":87},[70,3985,1907],{"class":116},[70,3987,120],{"class":87},[70,3989,123],{"class":116},[70,3991,126],{"class":87},[70,3993,3994,3996,3998,4000,4003,4005,4008],{"class":72,"line":104},[70,3995,3979],{"class":87},[70,3997,3227],{"class":97},[70,3999,113],{"class":87},[70,4001,4002],{"class":116},"'user_score'",[70,4004,120],{"class":87},[70,4006,4007],{"class":438},"100",[70,4009,126],{"class":87},[70,4011,4012],{"class":72,"line":129},[70,4013,155],{"emptyLinePlaceholder":154},[70,4015,4016],{"class":72,"line":151},[70,4017,4018],{"class":76},"\u002F\u002F Bad: Don't cache objects or arrays\n",[70,4020,4021,4023,4025,4027,4030,4033,4036,4039],{"class":72,"line":158},[70,4022,3979],{"class":87},[70,4024,3227],{"class":97},[70,4026,113],{"class":87},[70,4028,4029],{"class":116},"'user_object'",[70,4031,4032],{"class":87},", {name: ",[70,4034,4035],{"class":116},"'John'",[70,4037,4038],{"class":87},"}); ",[70,4040,4041],{"class":76},"\u002F\u002F DON'T DO THIS\n",[70,4043,4044,4046,4048,4050,4053,4056,4059,4061,4064,4067],{"class":72,"line":164},[70,4045,3979],{"class":87},[70,4047,3227],{"class":97},[70,4049,113],{"class":87},[70,4051,4052],{"class":116},"'company_list'",[70,4054,4055],{"class":87},", [",[70,4057,4058],{"class":116},"'comp1'",[70,4060,120],{"class":87},[70,4062,4063],{"class":116},"'comp2'",[70,4065,4066],{"class":87},"]); ",[70,4068,4041],{"class":76},[70,4070,4071],{"class":72,"line":344},[70,4072,155],{"emptyLinePlaceholder":154},[70,4074,4075],{"class":72,"line":350},[70,4076,4077],{"class":76},"\u002F\u002F Good alternative: Convert to string\n",[70,4079,4080,4082,4084,4086,4088,4090,4093],{"class":72,"line":366},[70,4081,3979],{"class":87},[70,4083,3227],{"class":97},[70,4085,113],{"class":87},[70,4087,4052],{"class":116},[70,4089,120],{"class":87},[70,4091,4092],{"class":116},"'comp1,comp2'",[70,4094,126],{"class":87},[24,4096,4098],{"id":4097},"_2-be-mindful-of-memory-limitations","2. Be Mindful of Memory Limitations",[12,4100,4101,4102,4105],{},"User sessions run on application nodes with limited memory (2GB heap size). Total accumulated memory per node should be ",[38,4103,4104],{},"less than 1MB","—preferably much less.",[12,4107,4108],{},"Guidelines:",[32,4110,4111,4114,4117,4120],{},[35,4112,4113],{},"Only cache small pieces of data",[35,4115,4116],{},"Cache data that's accessed frequently",[35,4118,4119],{},"Don't cache large text blocks or complex data structures",[35,4121,4122],{},"Monitor your instance's memory usage",[24,4124,4126],{"id":4125},"_3-cache-data-that-doesnt-change-frequently","3. Cache Data That Doesn't Change Frequently",[12,4128,4129],{},"Session caching is ideal for data that is:",[32,4131,4132,4135,4138],{},[35,4133,4134],{},"Static during a user's session (user's department, region, company)",[35,4136,4137],{},"Expensive to calculate",[35,4139,4140],{},"Accessed multiple times",[12,4142,4143],{},"Don't cache:",[32,4145,4146,4149,4152],{},[35,4147,4148],{},"Data that changes frequently during a session",[35,4150,4151],{},"Data that's only needed once",[35,4153,4154],{},"Real-time data that must always be current",[24,4156,4158],{"id":4157},"_4-implement-cache-invalidation-when-needed","4. Implement Cache Invalidation When Needed",[12,4160,4161],{},"If cached data can change during a session, implement a strategy to clear the cache:",[61,4163,4165],{"className":63,"code":4164,"language":65,"meta":66,"style":66},"\u002F\u002F Business Rule on sys_user table (after update)\n\u002F\u002F Clear cached user data when user record is updated\n(function executeRule(current, previous) {\n    \u002F\u002F Only clear cache if relevant fields changed\n    if (current.u_region.changes() ||\n        current.department.changes() ||\n        current.location.changes()) {\n\n        \u002F\u002F Clear cache for this specific user\n        \u002F\u002F This requires the user to be the current session user\n        if (current.sys_id == gs.getUserID()) {\n            var cache = new SessionCacheUtil();\n            cache.remove('user_region');\n            cache.remove('user_department');\n            cache.remove('user_location');\n        }\n    }\n})(current, previous);\n",[52,4166,4167,4172,4177,4195,4200,4215,4226,4235,4239,4244,4249,4265,4279,4293,4305,4317,4321,4325],{"__ignoreMap":66},[70,4168,4169],{"class":72,"line":73},[70,4170,4171],{"class":76},"\u002F\u002F Business Rule on sys_user table (after update)\n",[70,4173,4174],{"class":72,"line":80},[70,4175,4176],{"class":76},"\u002F\u002F Clear cached user data when user record is updated\n",[70,4178,4179,4181,4183,4185,4187,4189,4191,4193],{"class":72,"line":104},[70,4180,113],{"class":87},[70,4182,250],{"class":83},[70,4184,253],{"class":97},[70,4186,113],{"class":87},[70,4188,259],{"class":258},[70,4190,120],{"class":87},[70,4192,264],{"class":258},[70,4194,270],{"class":87},[70,4196,4197],{"class":72,"line":129},[70,4198,4199],{"class":76},"    \u002F\u002F Only clear cache if relevant fields changed\n",[70,4201,4202,4204,4207,4210,4212],{"class":72,"line":151},[70,4203,1991],{"class":83},[70,4205,4206],{"class":87}," (current.u_region.",[70,4208,4209],{"class":97},"changes",[70,4211,2776],{"class":87},[70,4213,4214],{"class":83},"||\n",[70,4216,4217,4220,4222,4224],{"class":72,"line":158},[70,4218,4219],{"class":87},"        current.department.",[70,4221,4209],{"class":97},[70,4223,2776],{"class":87},[70,4225,4214],{"class":83},[70,4227,4228,4231,4233],{"class":72,"line":164},[70,4229,4230],{"class":87},"        current.location.",[70,4232,4209],{"class":97},[70,4234,2438],{"class":87},[70,4236,4237],{"class":72,"line":344},[70,4238,155],{"emptyLinePlaceholder":154},[70,4240,4241],{"class":72,"line":350},[70,4242,4243],{"class":76},"        \u002F\u002F Clear cache for this specific user\n",[70,4245,4246],{"class":72,"line":366},[70,4247,4248],{"class":76},"        \u002F\u002F This requires the user to be the current session user\n",[70,4250,4251,4253,4256,4259,4261,4263],{"class":72,"line":536},[70,4252,673],{"class":83},[70,4254,4255],{"class":87}," (current.sys_id ",[70,4257,4258],{"class":83},"==",[70,4260,94],{"class":87},[70,4262,312],{"class":97},[70,4264,2438],{"class":87},[70,4266,4267,4269,4271,4273,4275,4277],{"class":72,"line":552},[70,4268,1162],{"class":83},[70,4270,1870],{"class":87},[70,4272,91],{"class":83},[70,4274,288],{"class":83},[70,4276,1877],{"class":97},[70,4278,101],{"class":87},[70,4280,4281,4284,4287,4289,4291],{"class":72,"line":568},[70,4282,4283],{"class":87},"            cache.",[70,4285,4286],{"class":97},"remove",[70,4288,113],{"class":87},[70,4290,1907],{"class":116},[70,4292,126],{"class":87},[70,4294,4295,4297,4299,4301,4303],{"class":72,"line":582},[70,4296,4283],{"class":87},[70,4298,4286],{"class":97},[70,4300,113],{"class":87},[70,4302,2742],{"class":116},[70,4304,126],{"class":87},[70,4306,4307,4309,4311,4313,4315],{"class":72,"line":588},[70,4308,4283],{"class":87},[70,4310,4286],{"class":97},[70,4312,113],{"class":87},[70,4314,2846],{"class":116},[70,4316,126],{"class":87},[70,4318,4319],{"class":72,"line":615},[70,4320,959],{"class":87},[70,4322,4323],{"class":72,"line":639},[70,4324,2012],{"class":87},[70,4326,4327],{"class":72,"line":659},[70,4328,369],{"class":87},[24,4330,4332],{"id":4331},"_5-use-descriptive-cache-keys","5. Use Descriptive Cache Keys",[12,4334,4335],{},"Use clear, descriptive cache keys that indicate what's being cached:",[61,4337,4339],{"className":63,"code":4338,"language":65,"meta":66,"style":66},"\u002F\u002F Good\ncache.getOrSet('user_region', fetchFunction);\ncache.getOrSet('user_company_hierarchy', fetchFunction);\ncache.getOrSet('user_in_group_itil', fetchFunction);\n\n\u002F\u002F Bad\ncache.getOrSet('data1', fetchFunction);\ncache.getOrSet('temp', fetchFunction);\ncache.getOrSet('x', fetchFunction);\n",[52,4340,4341,4346,4359,4371,4384,4388,4393,4406,4419],{"__ignoreMap":66},[70,4342,4343],{"class":72,"line":73},[70,4344,4345],{"class":76},"\u002F\u002F Good\n",[70,4347,4348,4350,4352,4354,4356],{"class":72,"line":80},[70,4349,3979],{"class":87},[70,4351,1902],{"class":97},[70,4353,113],{"class":87},[70,4355,1907],{"class":116},[70,4357,4358],{"class":87},", fetchFunction);\n",[70,4360,4361,4363,4365,4367,4369],{"class":72,"line":104},[70,4362,3979],{"class":87},[70,4364,1902],{"class":97},[70,4366,113],{"class":87},[70,4368,2159],{"class":116},[70,4370,4358],{"class":87},[70,4372,4373,4375,4377,4379,4382],{"class":72,"line":129},[70,4374,3979],{"class":87},[70,4376,1902],{"class":97},[70,4378,113],{"class":87},[70,4380,4381],{"class":116},"'user_in_group_itil'",[70,4383,4358],{"class":87},[70,4385,4386],{"class":72,"line":151},[70,4387,155],{"emptyLinePlaceholder":154},[70,4389,4390],{"class":72,"line":158},[70,4391,4392],{"class":76},"\u002F\u002F Bad\n",[70,4394,4395,4397,4399,4401,4404],{"class":72,"line":164},[70,4396,3979],{"class":87},[70,4398,1902],{"class":97},[70,4400,113],{"class":87},[70,4402,4403],{"class":116},"'data1'",[70,4405,4358],{"class":87},[70,4407,4408,4410,4412,4414,4417],{"class":72,"line":344},[70,4409,3979],{"class":87},[70,4411,1902],{"class":97},[70,4413,113],{"class":87},[70,4415,4416],{"class":116},"'temp'",[70,4418,4358],{"class":87},[70,4420,4421,4423,4425,4427,4430],{"class":72,"line":350},[70,4422,3979],{"class":87},[70,4424,1902],{"class":97},[70,4426,113],{"class":87},[70,4428,4429],{"class":116},"'x'",[70,4431,4358],{"class":87},[24,4433,4435],{"id":4434},"_6-add-debug-logging","6. Add Debug Logging",[12,4437,4438],{},"Include debug logging in your caching logic to help troubleshoot issues:",[61,4440,4442],{"className":63,"code":4441,"language":65,"meta":66,"style":66},"getOrSet: function(key, fetchCallback, ttl) {\n    var cacheKey = this.CACHE_PREFIX + key;\n    var cachedValue = this.session.getClientData(cacheKey);\n\n    if (cachedValue !== null && cachedValue !== undefined && cachedValue !== '') {\n        gs.debug('SessionCache: HIT for key=' + key + ', value=' + cachedValue);\n        return cachedValue;\n    }\n\n    gs.debug('SessionCache: MISS for key=' + key + ', fetching data');\n    return this._fetchAndCache(key, fetchCallback, ttl);\n}\n",[52,4443,4444,4466,4484,4500,4504,4532,4558,4564,4568,4572,4595,4608],{"__ignoreMap":66},[70,4445,4446,4448,4450,4452,4454,4456,4458,4460,4462,4464],{"class":72,"line":73},[70,4447,1902],{"class":97},[70,4449,459],{"class":87},[70,4451,250],{"class":83},[70,4453,113],{"class":87},[70,4455,600],{"class":258},[70,4457,120],{"class":87},[70,4459,605],{"class":258},[70,4461,120],{"class":87},[70,4463,610],{"class":258},[70,4465,270],{"class":87},[70,4467,4468,4470,4472,4474,4476,4478,4480,4482],{"class":72,"line":80},[70,4469,280],{"class":83},[70,4471,621],{"class":87},[70,4473,91],{"class":83},[70,4475,626],{"class":438},[70,4477,442],{"class":87},[70,4479,489],{"class":438},[70,4481,633],{"class":83},[70,4483,636],{"class":87},[70,4485,4486,4488,4490,4492,4494,4496,4498],{"class":72,"line":104},[70,4487,280],{"class":83},[70,4489,644],{"class":87},[70,4491,91],{"class":83},[70,4493,626],{"class":438},[70,4495,651],{"class":87},[70,4497,142],{"class":97},[70,4499,656],{"class":87},[70,4501,4502],{"class":72,"line":129},[70,4503,155],{"emptyLinePlaceholder":154},[70,4505,4506,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4528,4530],{"class":72,"line":151},[70,4507,1991],{"class":83},[70,4509,676],{"class":87},[70,4511,679],{"class":83},[70,4513,682],{"class":438},[70,4515,685],{"class":83},[70,4517,644],{"class":87},[70,4519,679],{"class":83},[70,4521,692],{"class":438},[70,4523,685],{"class":83},[70,4525,644],{"class":87},[70,4527,679],{"class":83},[70,4529,701],{"class":116},[70,4531,270],{"class":87},[70,4533,4534,4536,4538,4540,4543,4545,4548,4550,4553,4555],{"class":72,"line":158},[70,4535,970],{"class":87},[70,4537,872],{"class":97},[70,4539,113],{"class":87},[70,4541,4542],{"class":116},"'SessionCache: HIT for key='",[70,4544,633],{"class":83},[70,4546,4547],{"class":87}," key ",[70,4549,734],{"class":83},[70,4551,4552],{"class":116}," ', value='",[70,4554,633],{"class":83},[70,4556,4557],{"class":87}," cachedValue);\n",[70,4559,4560,4562],{"class":72,"line":164},[70,4561,987],{"class":83},[70,4563,953],{"class":87},[70,4565,4566],{"class":72,"line":344},[70,4567,2012],{"class":87},[70,4569,4570],{"class":72,"line":350},[70,4571,155],{"emptyLinePlaceholder":154},[70,4573,4574,4577,4579,4581,4584,4586,4588,4590,4593],{"class":72,"line":366},[70,4575,4576],{"class":87},"    gs.",[70,4578,872],{"class":97},[70,4580,113],{"class":87},[70,4582,4583],{"class":116},"'SessionCache: MISS for key='",[70,4585,633],{"class":83},[70,4587,4547],{"class":87},[70,4589,734],{"class":83},[70,4591,4592],{"class":116}," ', fetching data'",[70,4594,126],{"class":87},[70,4596,4597,4600,4602,4604,4606],{"class":72,"line":536},[70,4598,4599],{"class":83},"    return",[70,4601,626],{"class":438},[70,4603,442],{"class":87},[70,4605,901],{"class":97},[70,4607,904],{"class":87},[70,4609,4610],{"class":72,"line":552},[70,4611,4612],{"class":87},"}\n",[24,4614,4616],{"id":4615},"_7-consider-using-ttl-for-semi-static-data","7. Consider Using TTL for Semi-Static Data",[12,4618,4619],{},"For data that changes occasionally, implement a Time-To-Live (TTL) mechanism:",[61,4621,4623],{"className":63,"code":4622,"language":65,"meta":66,"style":66},"\u002F\u002F Cache user's region for 5 minutes (300 seconds)\nvar userRegion = cache.getOrSet('user_region', function() {\n    var userGR = new GlideRecord('sys_user');\n    if (userGR.get(gs.getUserID())) {\n        return userGR.getValue('u_region');\n    }\n    return '';\n}, 300); \u002F\u002F TTL of 300 seconds\n",[52,4624,4625,4630,4652,4670,4684,4698,4702,4710],{"__ignoreMap":66},[70,4626,4627],{"class":72,"line":73},[70,4628,4629],{"class":76},"\u002F\u002F Cache user's region for 5 minutes (300 seconds)\n",[70,4631,4632,4634,4636,4638,4640,4642,4644,4646,4648,4650],{"class":72,"line":80},[70,4633,84],{"class":83},[70,4635,322],{"class":87},[70,4637,91],{"class":83},[70,4639,1899],{"class":87},[70,4641,1902],{"class":97},[70,4643,113],{"class":87},[70,4645,1907],{"class":116},[70,4647,120],{"class":87},[70,4649,250],{"class":83},[70,4651,464],{"class":87},[70,4653,4654,4656,4658,4660,4662,4664,4666,4668],{"class":72,"line":104},[70,4655,280],{"class":83},[70,4657,283],{"class":87},[70,4659,91],{"class":83},[70,4661,288],{"class":83},[70,4663,291],{"class":97},[70,4665,113],{"class":87},[70,4667,296],{"class":116},[70,4669,126],{"class":87},[70,4671,4672,4674,4676,4678,4680,4682],{"class":72,"line":129},[70,4673,1991],{"class":83},[70,4675,1938],{"class":87},[70,4677,306],{"class":97},[70,4679,309],{"class":87},[70,4681,312],{"class":97},[70,4683,1947],{"class":87},[70,4685,4686,4688,4690,4692,4694,4696],{"class":72,"line":151},[70,4687,987],{"class":83},[70,4689,327],{"class":87},[70,4691,330],{"class":97},[70,4693,113],{"class":87},[70,4695,335],{"class":116},[70,4697,126],{"class":87},[70,4699,4700],{"class":72,"line":158},[70,4701,2012],{"class":87},[70,4703,4704,4706,4708],{"class":72,"line":164},[70,4705,4599],{"class":83},[70,4707,701],{"class":116},[70,4709,497],{"class":87},[70,4711,4712,4715,4718,4721],{"class":72,"line":344},[70,4713,4714],{"class":87},"}, ",[70,4716,4717],{"class":438},"300",[70,4719,4720],{"class":87},"); ",[70,4722,4723],{"class":76},"\u002F\u002F TTL of 300 seconds\n",[16,4725,4727],{"id":4726},"measuring-performance-improvements","Measuring Performance Improvements",[12,4729,4730],{},"To measure the impact of session caching, use the following approach:",[24,4732,4734],{"id":4733},"before-implementing-caching","Before Implementing Caching",[61,4736,4738],{"className":63,"code":4737,"language":65,"meta":66,"style":66},"\u002F\u002F Add timing to your Before Query Business Rule\n(function executeRule(current, previous) {\n    var startTime = new GlideDateTime().getNumericValue();\n\n    \u002F\u002F Your existing logic without caching\n    var userGR = new GlideRecord('sys_user');\n    userGR.get(gs.getUserID());\n    var userRegion = userGR.getValue('u_region');\n    current.addQuery('u_region', userRegion);\n\n    var endTime = new GlideDateTime().getNumericValue();\n    var duration = endTime - startTime;\n    gs.info('Before Query BR execution time (no cache): ' + duration + 'ms');\n})(current, previous);\n",[52,4739,4740,4745,4763,4782,4786,4791,4809,4821,4839,4851,4855,4874,4890,4913],{"__ignoreMap":66},[70,4741,4742],{"class":72,"line":73},[70,4743,4744],{"class":76},"\u002F\u002F Add timing to your Before Query Business Rule\n",[70,4746,4747,4749,4751,4753,4755,4757,4759,4761],{"class":72,"line":80},[70,4748,113],{"class":87},[70,4750,250],{"class":83},[70,4752,253],{"class":97},[70,4754,113],{"class":87},[70,4756,259],{"class":258},[70,4758,120],{"class":87},[70,4760,264],{"class":258},[70,4762,270],{"class":87},[70,4764,4765,4767,4770,4772,4774,4776,4778,4780],{"class":72,"line":104},[70,4766,280],{"class":83},[70,4768,4769],{"class":87}," startTime ",[70,4771,91],{"class":83},[70,4773,288],{"class":83},[70,4775,788],{"class":97},[70,4777,791],{"class":87},[70,4779,794],{"class":97},[70,4781,101],{"class":87},[70,4783,4784],{"class":72,"line":129},[70,4785,155],{"emptyLinePlaceholder":154},[70,4787,4788],{"class":72,"line":151},[70,4789,4790],{"class":76},"    \u002F\u002F Your existing logic without caching\n",[70,4792,4793,4795,4797,4799,4801,4803,4805,4807],{"class":72,"line":158},[70,4794,280],{"class":83},[70,4796,283],{"class":87},[70,4798,91],{"class":83},[70,4800,288],{"class":83},[70,4802,291],{"class":97},[70,4804,113],{"class":87},[70,4806,296],{"class":116},[70,4808,126],{"class":87},[70,4810,4811,4813,4815,4817,4819],{"class":72,"line":164},[70,4812,303],{"class":87},[70,4814,306],{"class":97},[70,4816,309],{"class":87},[70,4818,312],{"class":97},[70,4820,315],{"class":87},[70,4822,4823,4825,4827,4829,4831,4833,4835,4837],{"class":72,"line":344},[70,4824,280],{"class":83},[70,4826,322],{"class":87},[70,4828,91],{"class":83},[70,4830,327],{"class":87},[70,4832,330],{"class":97},[70,4834,113],{"class":87},[70,4836,335],{"class":116},[70,4838,126],{"class":87},[70,4840,4841,4843,4845,4847,4849],{"class":72,"line":350},[70,4842,353],{"class":87},[70,4844,356],{"class":97},[70,4846,113],{"class":87},[70,4848,335],{"class":116},[70,4850,363],{"class":87},[70,4852,4853],{"class":72,"line":366},[70,4854,155],{"emptyLinePlaceholder":154},[70,4856,4857,4859,4862,4864,4866,4868,4870,4872],{"class":72,"line":536},[70,4858,280],{"class":83},[70,4860,4861],{"class":87}," endTime ",[70,4863,91],{"class":83},[70,4865,288],{"class":83},[70,4867,788],{"class":97},[70,4869,791],{"class":87},[70,4871,794],{"class":97},[70,4873,101],{"class":87},[70,4875,4876,4878,4881,4883,4885,4887],{"class":72,"line":552},[70,4877,280],{"class":83},[70,4879,4880],{"class":87}," duration ",[70,4882,91],{"class":83},[70,4884,4861],{"class":87},[70,4886,828],{"class":83},[70,4888,4889],{"class":87}," startTime;\n",[70,4891,4892,4894,4897,4899,4902,4904,4906,4908,4911],{"class":72,"line":568},[70,4893,4576],{"class":87},[70,4895,4896],{"class":97},"info",[70,4898,113],{"class":87},[70,4900,4901],{"class":116},"'Before Query BR execution time (no cache): '",[70,4903,633],{"class":83},[70,4905,4880],{"class":87},[70,4907,734],{"class":83},[70,4909,4910],{"class":116}," 'ms'",[70,4912,126],{"class":87},[70,4914,4915],{"class":72,"line":582},[70,4916,369],{"class":87},[24,4918,4920],{"id":4919},"after-implementing-caching","After Implementing Caching",[61,4922,4924],{"className":63,"code":4923,"language":65,"meta":66,"style":66},"(function executeRule(current, previous) {\n    var startTime = new GlideDateTime().getNumericValue();\n\n    var cache = new SessionCacheUtil();\n    var userRegion = cache.getOrSet('user_region', function() {\n        var userGR = new GlideRecord('sys_user');\n        if (userGR.get(gs.getUserID())) {\n            return userGR.getValue('u_region');\n        }\n        return '';\n    });\n    current.addQuery('u_region', userRegion);\n\n    var endTime = new GlideDateTime().getNumericValue();\n    var duration = endTime - startTime;\n    gs.info('Before Query BR execution time (with cache): ' + duration + 'ms');\n})(current, previous);\n",[52,4925,4926,4944,4962,4966,4980,5002,5020,5034,5048,5052,5060,5064,5076,5080,5098,5112,5133],{"__ignoreMap":66},[70,4927,4928,4930,4932,4934,4936,4938,4940,4942],{"class":72,"line":73},[70,4929,113],{"class":87},[70,4931,250],{"class":83},[70,4933,253],{"class":97},[70,4935,113],{"class":87},[70,4937,259],{"class":258},[70,4939,120],{"class":87},[70,4941,264],{"class":258},[70,4943,270],{"class":87},[70,4945,4946,4948,4950,4952,4954,4956,4958,4960],{"class":72,"line":80},[70,4947,280],{"class":83},[70,4949,4769],{"class":87},[70,4951,91],{"class":83},[70,4953,288],{"class":83},[70,4955,788],{"class":97},[70,4957,791],{"class":87},[70,4959,794],{"class":97},[70,4961,101],{"class":87},[70,4963,4964],{"class":72,"line":104},[70,4965,155],{"emptyLinePlaceholder":154},[70,4967,4968,4970,4972,4974,4976,4978],{"class":72,"line":129},[70,4969,280],{"class":83},[70,4971,1870],{"class":87},[70,4973,91],{"class":83},[70,4975,288],{"class":83},[70,4977,1877],{"class":97},[70,4979,101],{"class":87},[70,4981,4982,4984,4986,4988,4990,4992,4994,4996,4998,5000],{"class":72,"line":151},[70,4983,280],{"class":83},[70,4985,322],{"class":87},[70,4987,91],{"class":83},[70,4989,1899],{"class":87},[70,4991,1902],{"class":97},[70,4993,113],{"class":87},[70,4995,1907],{"class":116},[70,4997,120],{"class":87},[70,4999,250],{"class":83},[70,5001,464],{"class":87},[70,5003,5004,5006,5008,5010,5012,5014,5016,5018],{"class":72,"line":158},[70,5005,618],{"class":83},[70,5007,283],{"class":87},[70,5009,91],{"class":83},[70,5011,288],{"class":83},[70,5013,291],{"class":97},[70,5015,113],{"class":87},[70,5017,296],{"class":116},[70,5019,126],{"class":87},[70,5021,5022,5024,5026,5028,5030,5032],{"class":72,"line":164},[70,5023,673],{"class":83},[70,5025,1938],{"class":87},[70,5027,306],{"class":97},[70,5029,309],{"class":87},[70,5031,312],{"class":97},[70,5033,1947],{"class":87},[70,5035,5036,5038,5040,5042,5044,5046],{"class":72,"line":344},[70,5037,950],{"class":83},[70,5039,327],{"class":87},[70,5041,330],{"class":97},[70,5043,113],{"class":87},[70,5045,335],{"class":116},[70,5047,126],{"class":87},[70,5049,5050],{"class":72,"line":350},[70,5051,959],{"class":87},[70,5053,5054,5056,5058],{"class":72,"line":366},[70,5055,987],{"class":83},[70,5057,701],{"class":116},[70,5059,497],{"class":87},[70,5061,5062],{"class":72,"line":536},[70,5063,1978],{"class":87},[70,5065,5066,5068,5070,5072,5074],{"class":72,"line":552},[70,5067,353],{"class":87},[70,5069,356],{"class":97},[70,5071,113],{"class":87},[70,5073,335],{"class":116},[70,5075,363],{"class":87},[70,5077,5078],{"class":72,"line":568},[70,5079,155],{"emptyLinePlaceholder":154},[70,5081,5082,5084,5086,5088,5090,5092,5094,5096],{"class":72,"line":582},[70,5083,280],{"class":83},[70,5085,4861],{"class":87},[70,5087,91],{"class":83},[70,5089,288],{"class":83},[70,5091,788],{"class":97},[70,5093,791],{"class":87},[70,5095,794],{"class":97},[70,5097,101],{"class":87},[70,5099,5100,5102,5104,5106,5108,5110],{"class":72,"line":588},[70,5101,280],{"class":83},[70,5103,4880],{"class":87},[70,5105,91],{"class":83},[70,5107,4861],{"class":87},[70,5109,828],{"class":83},[70,5111,4889],{"class":87},[70,5113,5114,5116,5118,5120,5123,5125,5127,5129,5131],{"class":72,"line":615},[70,5115,4576],{"class":87},[70,5117,4896],{"class":97},[70,5119,113],{"class":87},[70,5121,5122],{"class":116},"'Before Query BR execution time (with cache): '",[70,5124,633],{"class":83},[70,5126,4880],{"class":87},[70,5128,734],{"class":83},[70,5130,4910],{"class":116},[70,5132,126],{"class":87},[70,5134,5135],{"class":72,"line":639},[70,5136,369],{"class":87},[12,5138,5139],{},"You should see a dramatic reduction in execution time after the first query.",[16,5141,5143],{"id":5142},"common-pitfalls-to-avoid","Common Pitfalls to Avoid",[24,5145,5147],{"id":5146},"_1-caching-across-scopes","1. Caching Across Scopes",[12,5149,5150,5151,834,5154,5157],{},"Session data can behave differently across scoped applications. When using ",[52,5152,5153],{},"putClientData()",[52,5155,5156],{},"getClientData()"," inside a scoped application, the value might not be accessible from Global scope or other scoped applications, even though the session ID is the same.",[12,5159,5160,5163],{},[38,5161,5162],{},"Solution",": Keep caching logic within the same scope or use global Script Includes for caching utilities.",[24,5165,5167],{"id":5166},"_2-over-caching","2. Over-Caching",[12,5169,5170],{},"Excessive use of session caching can cause memory issues and instance performance degradation.",[12,5172,5173,5175],{},[38,5174,5162],{},": Only cache what you need, monitor memory usage, and implement cache size limits.",[24,5177,5179],{"id":5178},"_3-caching-sensitive-data","3. Caching Sensitive Data",[12,5181,5182],{},"Be cautious about caching sensitive information in session memory.",[12,5184,5185,5187],{},[38,5186,5162],{},": Never cache passwords, tokens, or other sensitive credentials. If you must cache sensitive data, ensure it's encrypted and properly cleared.",[24,5189,5191],{"id":5190},"_4-forgetting-to-clear-cache-on-data-changes","4. Forgetting to Clear Cache on Data Changes",[12,5193,5194],{},"If underlying data changes but the cache isn't cleared, users will see stale data.",[12,5196,5197,5199],{},[38,5198,5162],{},": Implement cache invalidation logic in After Update Business Rules for related tables.",[16,5201,5203],{"id":5202},"conclusion","Conclusion",[12,5205,5206],{},"Session caching with Script Includes and Before Query Business Rules is a powerful technique for optimizing ServiceNow performance. By implementing the patterns and best practices outlined in this guide, you can:",[32,5208,5209,5212,5215,5218,5221],{},[35,5210,5211],{},"Reduce database queries by caching frequently-accessed data",[35,5213,5214],{},"Improve transaction processing time by 55-65%",[35,5216,5217],{},"Create reusable caching utilities with Script Includes",[35,5219,5220],{},"Optimize Before Query Business Rules that execute frequently",[35,5222,5223],{},"Enhance user experience with faster page loads and list views",[12,5225,5226],{},"Remember the key principles:",[32,5228,5229,5232,5235,5238,5241],{},[35,5230,5231],{},"Only cache immutable data types (strings and numbers)",[35,5233,5234],{},"Keep total cached data under 1MB per node",[35,5236,5237],{},"Cache data that's accessed frequently but changes rarely",[35,5239,5240],{},"Implement proper cache invalidation",[35,5242,5243],{},"Monitor performance improvements",[12,5245,5246],{},"Start by identifying your most frequently-executed Before Query Business Rules and the data they repeatedly query. Implement session caching using the SessionCacheUtil Script Include, measure the performance gains, and iterate. Your users—and your database server—will thank you.",[12,5248,5249],{},"Happy caching!",[5251,5252,5253],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sCydW, html code.shiki .sCydW{--shiki-default:#D73A49;--shiki-dark:#D73A49}html pre.shiki code .sKWpL, html code.shiki .sKWpL{--shiki-default:#24292E;--shiki-dark:#24292E}html pre.shiki code .se37E, html code.shiki .se37E{--shiki-default:#6F42C1;--shiki-dark:#6F42C1}html pre.shiki code .sOTlB, html code.shiki .sOTlB{--shiki-default:#032F62;--shiki-dark:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj_tP, html code.shiki .sj_tP{--shiki-default:#E36209;--shiki-dark:#E36209}html pre.shiki code .sMN4m, html code.shiki .sMN4m{--shiki-default:#005CC5;--shiki-dark:#005CC5}",{"title":66,"searchDepth":80,"depth":80,"links":5255},[5256,5260,5263,5267,5272,5281,5285,5291],{"id":18,"depth":80,"text":19,"children":5257},[5258,5259],{"id":26,"depth":104,"text":27},{"id":184,"depth":104,"text":185},{"id":222,"depth":80,"text":223,"children":5261},[5262],{"id":229,"depth":104,"text":230},{"id":400,"depth":80,"text":401,"children":5264},[5265,5266],{"id":407,"depth":104,"text":408},{"id":1806,"depth":104,"text":1807},{"id":2029,"depth":80,"text":2030,"children":5268},[5269,5270,5271],{"id":2033,"depth":104,"text":2034},{"id":2618,"depth":104,"text":2619},{"id":3420,"depth":104,"text":3421},{"id":3945,"depth":80,"text":3946,"children":5273},[5274,5275,5276,5277,5278,5279,5280],{"id":3949,"depth":104,"text":3950},{"id":4097,"depth":104,"text":4098},{"id":4125,"depth":104,"text":4126},{"id":4157,"depth":104,"text":4158},{"id":4331,"depth":104,"text":4332},{"id":4434,"depth":104,"text":4435},{"id":4615,"depth":104,"text":4616},{"id":4726,"depth":80,"text":4727,"children":5282},[5283,5284],{"id":4733,"depth":104,"text":4734},{"id":4919,"depth":104,"text":4920},{"id":5142,"depth":80,"text":5143,"children":5286},[5287,5288,5289,5290],{"id":5146,"depth":104,"text":5147},{"id":5166,"depth":104,"text":5167},{"id":5178,"depth":104,"text":5179},{"id":5190,"depth":104,"text":5191},{"id":5202,"depth":80,"text":5203},"2025-10-19T10:00:00","Learn how to dramatically improve ServiceNow performance using session caching with Script Includes and Before Query Business Rules","session-caching-servicenow-script-includes-before-query-business-rules",null,"md",[5298,5301,5304,5307],{"question":5299,"answer":5300},"What is session caching in ServiceNow?","Session caching in ServiceNow is a performance optimization technique that stores frequently accessed data in a user's session memory using the putClientData() and getClientData() methods. This avoids repeated database queries and can improve transaction processing time by 55-65%.",{"question":5302,"answer":5303},"When should I use session caching in ServiceNow?","Use session caching for small amounts of static or rarely-changing data like user regions, department hierarchies, or calculated values that are needed multiple times during a session. Ideal for Before Query Business Rules that execute frequently and need to filter data based on user-specific criteria.",{"question":5305,"answer":5306},"What are the memory limitations for session caching?","Total accumulated memory per node should be less than 1MB - preferably much less. Application nodes have 2GB heap size, and session data consumes this limited resource. Only cache small pieces of data using immutable data types (strings and numbers).",{"question":5308,"answer":5309},"How do I clear session cache data?","Use gs.getSession().clearClientData() to remove all cached data, or gs.getSession().putClientData('key', null) to remove a specific cached value. Session data is automatically cleared when a user logs out.","Session Caching in ServiceNow: Boost Performance with Script Includes and Before Query Business Rules",{},"\u002Fblog\u002Fsession-caching-servicenow-script-includes-before-query-business-rules",{"title":5,"description":5293},{"src":5315,"mime":5316,"alt":5317,"width":5318,"height":5319},"\u002Fmeta-img.webp","webp","ServiceNow session caching performance optimization",1200,630,"blog\u002Fsession-caching-servicenow-script-includes-before-query-business-rules",[5322,5323,5324,5325,5326,5327,5328],"ServiceNow","Performance","Caching","Script Include","Business Rules","Optimization","Best Practices","vWf9kXoxyTM6vniEJXVFAa_g_emlOmz322O4KVJ63rY",1788768210518]