cds-caching 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +195 -1114
  2. package/app/dashboard/Component-dbg.js +59 -0
  3. package/app/dashboard/Component-dbg.js.map +1 -0
  4. package/app/dashboard/Component.js +2 -0
  5. package/app/dashboard/Component.js.map +1 -0
  6. package/app/dashboard/Component.ts +59 -0
  7. package/app/dashboard/controller/App-dbg.controller.js +132 -0
  8. package/app/dashboard/controller/App-dbg.controller.js.map +1 -0
  9. package/app/dashboard/controller/App.controller.js +2 -0
  10. package/app/dashboard/controller/App.controller.js.map +1 -0
  11. package/app/dashboard/controller/App.controller.ts +147 -0
  12. package/app/dashboard/controller/BaseController-dbg.js +75 -0
  13. package/app/dashboard/controller/BaseController-dbg.js.map +1 -0
  14. package/app/dashboard/controller/BaseController.js +2 -0
  15. package/app/dashboard/controller/BaseController.js.map +1 -0
  16. package/app/dashboard/controller/BaseController.ts +88 -0
  17. package/app/dashboard/controller/Cache-dbg.controller.js +421 -0
  18. package/app/dashboard/controller/Cache-dbg.controller.js.map +1 -0
  19. package/app/dashboard/controller/Cache.controller.js +2 -0
  20. package/app/dashboard/controller/Cache.controller.js.map +1 -0
  21. package/app/dashboard/controller/Cache.controller.ts +490 -0
  22. package/app/dashboard/controller/Main-dbg.controller.js +32 -0
  23. package/app/dashboard/controller/Main-dbg.controller.js.map +1 -0
  24. package/app/dashboard/controller/Main.controller.js +2 -0
  25. package/app/dashboard/controller/Main.controller.js.map +1 -0
  26. package/app/dashboard/controller/Main.controller.ts +31 -0
  27. package/app/dashboard/controller/SingleMetric-dbg.controller.js +306 -0
  28. package/app/dashboard/controller/SingleMetric-dbg.controller.js.map +1 -0
  29. package/app/dashboard/controller/SingleMetric.controller.js +2 -0
  30. package/app/dashboard/controller/SingleMetric.controller.js.map +1 -0
  31. package/app/dashboard/controller/SingleMetric.controller.ts +335 -0
  32. package/app/dashboard/i18n/i18n.properties +61 -0
  33. package/app/dashboard/i18n/i18n_de.properties +3 -0
  34. package/app/dashboard/i18n/i18n_en.properties +3 -0
  35. package/app/dashboard/index-cdn.html +28 -0
  36. package/app/dashboard/index.html +19 -0
  37. package/app/dashboard/manifest.json +145 -0
  38. package/app/dashboard/model/formatter-dbg.js +253 -0
  39. package/app/dashboard/model/formatter-dbg.js.map +1 -0
  40. package/app/dashboard/model/formatter.js +2 -0
  41. package/app/dashboard/model/formatter.js.map +1 -0
  42. package/app/dashboard/model/formatter.ts +275 -0
  43. package/app/dashboard/model/models-dbg.js +13 -0
  44. package/app/dashboard/model/models-dbg.js.map +1 -0
  45. package/app/dashboard/model/models.js +2 -0
  46. package/app/dashboard/model/models.js.map +1 -0
  47. package/app/dashboard/model/models.ts +13 -0
  48. package/app/dashboard/resources/sap-ui-custom-dbg.js +4695 -0
  49. package/app/dashboard/resources/sap-ui-custom-dbg.js.map +1 -0
  50. package/app/dashboard/resources/sap-ui-custom.js +5794 -0
  51. package/app/dashboard/resources/sap-ui-custom.js.map +1 -0
  52. package/app/dashboard/service/CacheStatisticsService-dbg.js +267 -0
  53. package/app/dashboard/service/CacheStatisticsService-dbg.js.map +1 -0
  54. package/app/dashboard/service/CacheStatisticsService.js +2 -0
  55. package/app/dashboard/service/CacheStatisticsService.js.map +1 -0
  56. package/app/dashboard/service/CacheStatisticsService.ts +397 -0
  57. package/app/dashboard/view/App.view.xml +18 -0
  58. package/app/dashboard/view/Cache.view.xml +777 -0
  59. package/app/dashboard/view/Main.view.xml +57 -0
  60. package/app/dashboard/view/SingleMetric.view.xml +337 -0
  61. package/cds-plugin.js +52 -0
  62. package/db/cache-store.cds +12 -0
  63. package/db/statistics.cds +128 -0
  64. package/index.cds +2 -128
  65. package/lib/CachingService.js +24 -10
  66. package/lib/add.js +17 -0
  67. package/lib/operations/AsyncOperations.js +162 -111
  68. package/lib/operations/BasicOperations.js +42 -4
  69. package/lib/operations/CapOperations.js +92 -40
  70. package/lib/support/CacheStatisticsHandler.js +35 -10
  71. package/lib/support/CacheStoreManager.js +29 -0
  72. package/lib/support/KeyManager.js +40 -2
  73. package/lib/support/KeyvCDS.js +149 -0
  74. package/lib/support/MultitenancyDetector.js +25 -0
  75. package/lib/support/RuntimeConfigurationManager.js +69 -37
  76. package/lib/support/StatisticsPersistenceManager.js +18 -2
  77. package/lib/support/Telemetry.js +137 -0
  78. package/lib/util.js +29 -11
  79. package/package.json +43 -11
  80. package/srv/caching-api-service.js +47 -2
@@ -0,0 +1,253 @@
1
+ sap.ui.define(["sap/m/library"], function (sap_m_library) {
2
+ "use strict";
3
+
4
+ const ValueColor = sap_m_library["ValueColor"];
5
+ /**
6
+ * Formatter utility for cache statistics dashboard
7
+ */
8
+ var __exports = {
9
+ formatIntegerValue(value) {
10
+ if (value === null || value === undefined || value === 0) {
11
+ return "0";
12
+ }
13
+ return `${value.toFixed(0)}`;
14
+ },
15
+ formatNumberValue(value) {
16
+ if (value === null || value === undefined || value === 0) {
17
+ return "0";
18
+ }
19
+ return `${value.toFixed(2)}`;
20
+ },
21
+ /**
22
+ * Format percentage values
23
+ */
24
+ formatPercentage(value) {
25
+ if (value === null || value === undefined) {
26
+ return "0%";
27
+ }
28
+ return `${(value * 100).toFixed(1)}%`;
29
+ },
30
+ formatPercentageValue(value) {
31
+ if (value === null || value === undefined) {
32
+ return "0";
33
+ }
34
+ return `${(value * 100).toFixed(1)}`;
35
+ },
36
+ /**
37
+ * Format latency values in milliseconds
38
+ */
39
+ formatLatency(value) {
40
+ if (value === null || value === undefined) {
41
+ return "0ms";
42
+ }
43
+ // Make sure value is a number
44
+ const numberValue = Number(value);
45
+ if (numberValue < 1) {
46
+ return `${(numberValue * 1000).toFixed(2)}μs`;
47
+ }
48
+ return `${numberValue.toFixed(2)}ms`;
49
+ },
50
+ /**
51
+ * Format memory usage in human readable format
52
+ */
53
+ formatMemoryUsage(bytes) {
54
+ if (bytes === null || bytes === undefined) {
55
+ return "0 B";
56
+ }
57
+ const sizes = ['B', 'KB', 'MB', 'GB'];
58
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
59
+ return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;
60
+ },
61
+ /**
62
+ * Format throughput (requests per second)
63
+ */
64
+ formatThroughput(value) {
65
+ if (value === null || value === undefined) {
66
+ return "0 req/s";
67
+ }
68
+ return `${value.toFixed(2)} req/s`;
69
+ },
70
+ /**
71
+ * Format cache efficiency ratio
72
+ */
73
+ formatCacheEfficiency(value) {
74
+ if (value === null || value === undefined || value === 0) {
75
+ return "N/A";
76
+ }
77
+ if (value < 1) {
78
+ return `${(value * 100).toFixed(1)}%`;
79
+ }
80
+ return `${value.toFixed(1)}x`;
81
+ },
82
+ /**
83
+ * Format uptime in human readable format
84
+ */
85
+ formatUptime(ms) {
86
+ if (ms === null || ms === undefined) {
87
+ return "0s";
88
+ }
89
+ const seconds = Math.floor(ms / 1000);
90
+ const minutes = Math.floor(seconds / 60);
91
+ const hours = Math.floor(minutes / 60);
92
+ const days = Math.floor(hours / 24);
93
+ if (days > 0) {
94
+ return `${days}d ${hours % 24}h ${minutes % 60}m`;
95
+ } else if (hours > 0) {
96
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
97
+ } else if (minutes > 0) {
98
+ return `${minutes}m ${seconds % 60}s`;
99
+ } else {
100
+ return `${seconds}s`;
101
+ }
102
+ },
103
+ /**
104
+ * Format date for display
105
+ */
106
+ formatDate(dateString) {
107
+ if (!dateString) {
108
+ return "";
109
+ }
110
+ const date = new Date(dateString);
111
+ return date.toLocaleString();
112
+ },
113
+ /**
114
+ * Format hit ratio with color indication
115
+ */
116
+ formatHitRatioWithColor(value) {
117
+ if (value === null || value === undefined) {
118
+ return ValueColor.None;
119
+ }
120
+ if (value >= 0.9) {
121
+ return ValueColor.Good;
122
+ } else if (value >= 0.7) {
123
+ return ValueColor.Critical;
124
+ } else {
125
+ return ValueColor.Error;
126
+ }
127
+ },
128
+ /**
129
+ * Format latency with color indication
130
+ */
131
+ formatLatencyWithColor(value) {
132
+ if (value === null || value === undefined) {
133
+ return ValueColor.None;
134
+ }
135
+ if (value <= 10) {
136
+ return ValueColor.Good;
137
+ } else if (value <= 50) {
138
+ return ValueColor.Critical;
139
+ } else {
140
+ return ValueColor.Error;
141
+ }
142
+ },
143
+ /**
144
+ * Format error rate with color indication
145
+ */
146
+ formatErrorRateWithColor(value) {
147
+ if (value <= 0.01) {
148
+ return ValueColor.Good;
149
+ } else if (value <= 0.05) {
150
+ return ValueColor.Critical;
151
+ } else if (value <= 0.1) {
152
+ return ValueColor.Error;
153
+ } else {
154
+ return ValueColor.Neutral;
155
+ }
156
+ },
157
+ /**
158
+ * Get total requests (hits + misses)
159
+ */
160
+ getTotalRequests(hits, misses) {
161
+ return (hits || 0) + (misses || 0);
162
+ },
163
+ /**
164
+ * Get total operations (hits + misses + sets + deletes)
165
+ */
166
+ getTotalOperations(hits, misses, sets, deletes) {
167
+ return (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);
168
+ },
169
+ /**
170
+ * Format JSON for display
171
+ */
172
+ formatJSON(value) {
173
+ if (!value) {
174
+ return "";
175
+ }
176
+ try {
177
+ if (typeof value === 'string') {
178
+ // Try to parse and format if it's a JSON string
179
+ const parsed = JSON.parse(value);
180
+ return JSON.stringify(parsed, null, 2);
181
+ } else {
182
+ // Format if it's already an object
183
+ return JSON.stringify(value, null, 2);
184
+ }
185
+ } catch (e) {
186
+ // Return as-is if it's not valid JSON
187
+ return value;
188
+ }
189
+ },
190
+ /**
191
+ * Format key name for display (truncate if too long)
192
+ */
193
+ formatKeyName(keyName, maxLength = 30) {
194
+ if (!keyName) {
195
+ return "";
196
+ }
197
+ if (keyName.length <= maxLength) {
198
+ return keyName;
199
+ }
200
+ return keyName.substring(0, maxLength - 3) + "...";
201
+ },
202
+ /**
203
+ * Get relative time since last access
204
+ */
205
+ getRelativeTime(dateString) {
206
+ if (!dateString) {
207
+ return "Never";
208
+ }
209
+ const date = new Date(dateString);
210
+ const now = new Date();
211
+ const diffMs = now.getTime() - date.getTime();
212
+ const diffSeconds = Math.floor(diffMs / 1000);
213
+ const diffMinutes = Math.floor(diffSeconds / 60);
214
+ const diffHours = Math.floor(diffMinutes / 60);
215
+ const diffDays = Math.floor(diffHours / 24);
216
+ if (diffDays > 0) {
217
+ return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
218
+ } else if (diffHours > 0) {
219
+ return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
220
+ } else if (diffMinutes > 0) {
221
+ return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;
222
+ } else {
223
+ return `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;
224
+ }
225
+ },
226
+ /**
227
+ * Format cache efficiency with color indication
228
+ */
229
+ formatCacheEfficiencyWithColor(value) {
230
+ if (value === null || value === undefined) {
231
+ return ValueColor.None;
232
+ }
233
+ if (value > 5) {
234
+ return ValueColor.Good;
235
+ } else if (value >= 3) {
236
+ return ValueColor.Critical;
237
+ } else {
238
+ return ValueColor.Error;
239
+ }
240
+ },
241
+ formatTruncatedText(value, maxLength = 50) {
242
+ if (!value) {
243
+ return "";
244
+ }
245
+ if (value.length <= maxLength) {
246
+ return value;
247
+ }
248
+ return value.substring(0, maxLength) + "...";
249
+ }
250
+ };
251
+ return __exports;
252
+ });
253
+ //# sourceMappingURL=formatter-dbg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter-dbg.js","names":["ValueColor","sap_m_library","__exports","formatIntegerValue","value","undefined","toFixed","formatNumberValue","formatPercentage","formatPercentageValue","formatLatency","numberValue","Number","formatMemoryUsage","bytes","sizes","i","Math","floor","log","pow","formatThroughput","formatCacheEfficiency","formatUptime","ms","seconds","minutes","hours","days","formatDate","dateString","date","Date","toLocaleString","formatHitRatioWithColor","None","Good","Critical","Error","formatLatencyWithColor","formatErrorRateWithColor","Neutral","getTotalRequests","hits","misses","getTotalOperations","sets","deletes","formatJSON","parsed","JSON","parse","stringify","e","formatKeyName","keyName","maxLength","length","substring","getRelativeTime","now","diffMs","getTime","diffSeconds","diffMinutes","diffHours","diffDays","formatCacheEfficiencyWithColor","formatTruncatedText"],"sources":["formatter.ts"],"sourcesContent":["import { ValueColor } from \"sap/m/library\";\n\n/**\n * Formatter utility for cache statistics dashboard\n */\nexport default {\n\n\tformatIntegerValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(0)}`;\n\t},\n\n\tformatNumberValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(2)}`;\n\t},\n\n\t/**\n\t * Format percentage values\n\t */\n\tformatPercentage(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0%\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}%`;\n\t},\n\n\tformatPercentageValue(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}`;\n\t},\n\n\t/**\n\t * Format latency values in milliseconds\n\t */\n\tformatLatency(value: string): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0ms\";\n\t\t}\n\t\t// Make sure value is a number\n\t\tconst numberValue = Number(value);\n\n\t\tif (numberValue < 1) {\n\t\t\treturn `${(numberValue * 1000).toFixed(2)}μs`;\n\t\t}\n\t\treturn `${numberValue.toFixed(2)}ms`;\n\t},\n\n\t/**\n\t * Format memory usage in human readable format\n\t */\n\tformatMemoryUsage(bytes: number): string {\n\t\tif (bytes === null || bytes === undefined) {\n\t\t\treturn \"0 B\";\n\t\t}\n\t\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(1024));\n\t\treturn `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n\t},\n\n\t/**\n\t * Format throughput (requests per second)\n\t */\n\tformatThroughput(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0 req/s\";\n\t\t}\n\t\treturn `${value.toFixed(2)} req/s`;\n\t},\n\n\t/**\n\t * Format cache efficiency ratio\n\t */\n\tformatCacheEfficiency(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"N/A\";\n\t\t}\n\t\tif (value < 1) {\n\t\t\treturn `${(value * 100).toFixed(1)}%`;\n\t\t}\n\t\treturn `${value.toFixed(1)}x`;\n\t},\n\n\t/**\n\t * Format uptime in human readable format\n\t */\n\tformatUptime(ms: number): string {\n\t\tif (ms === null || ms === undefined) {\n\t\t\treturn \"0s\";\n\t\t}\n\t\tconst seconds = Math.floor(ms / 1000);\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tconst hours = Math.floor(minutes / 60);\n\t\tconst days = Math.floor(hours / 24);\n\n\t\tif (days > 0) {\n\t\t\treturn `${days}d ${hours % 24}h ${minutes % 60}m`;\n\t\t} else if (hours > 0) {\n\t\t\treturn `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}m ${seconds % 60}s`;\n\t\t} else {\n\t\t\treturn `${seconds}s`;\n\t\t}\n\t},\n\n\t/**\n\t * Format date for display\n\t */\n\tformatDate(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleString();\n\t},\n\n\t/**\n\t * Format hit ratio with color indication\n\t */\n\tformatHitRatioWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value >= 0.9) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 0.7) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format latency with color indication\n\t */\n\tformatLatencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value <= 10) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 50) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format error rate with color indication\n\t */\n\tformatErrorRateWithColor(value: number): string {\n\t\tif (value <= 0.01) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 0.05) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else if (value <= 0.1) {\n\t\t\treturn ValueColor.Error;\n\t\t} else {\n\t\t\treturn ValueColor.Neutral;\n\t\t}\n\t},\n\n\t/**\n\t * Get total requests (hits + misses)\n\t */\n\tgetTotalRequests(hits: number, misses: number): number {\n\t\treturn (hits || 0) + (misses || 0);\n\t},\n\n\t/**\n\t * Get total operations (hits + misses + sets + deletes)\n\t */\n\tgetTotalOperations(hits: number, misses: number, sets: number, deletes: number): number {\n\t\treturn (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);\n\t},\n\n\t/**\n\t * Format JSON for display\n\t */\n\tformatJSON(value: any): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\t// Try to parse and format if it's a JSON string\n\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\treturn JSON.stringify(parsed, null, 2);\n\t\t\t} else {\n\t\t\t\t// Format if it's already an object\n\t\t\t\treturn JSON.stringify(value, null, 2);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Return as-is if it's not valid JSON\n\t\t\treturn value;\n\t\t}\n\t},\n\n\t/**\n\t * Format key name for display (truncate if too long)\n\t */\n\tformatKeyName(keyName: string, maxLength: number = 30): string {\n\t\tif (!keyName) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (keyName.length <= maxLength) {\n\t\t\treturn keyName;\n\t\t}\n\t\treturn keyName.substring(0, maxLength - 3) + \"...\";\n\t},\n\n\t/**\n\t * Get relative time since last access\n\t */\n\tgetRelativeTime(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"Never\";\n\t\t}\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffMs = now.getTime() - date.getTime();\n\t\tconst diffSeconds = Math.floor(diffMs / 1000);\n\t\tconst diffMinutes = Math.floor(diffSeconds / 60);\n\t\tconst diffHours = Math.floor(diffMinutes / 60);\n\t\tconst diffDays = Math.floor(diffHours / 24);\n\n\t\tif (diffDays > 0) {\n\t\t\treturn `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\t\t} else if (diffHours > 0) {\n\t\t\treturn `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n\t\t} else if (diffMinutes > 0) {\n\t\t\treturn `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;\n\t\t} else {\n\t\t\treturn `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;\n\t\t}\n\t},\n\n\t/**\n\t * Format cache efficiency with color indication\n\t */\n\tformatCacheEfficiencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value > 5) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 3) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\tformatTruncatedText(value: string, maxLength: number = 50): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (value.length <= maxLength) {\n\t\t\treturn value;\n\t\t}\n\t\treturn value.substring(0, maxLength) + \"...\";\n\t}\n};\n"],"mappings":";;;QAASA,UAAU,GAAAC,aAAA;EAEnB;AACA;AACA;EAFA,IAAAC,SAAA,GAGe;IAEdC,kBAAkBA,CAACC,KAAa,EAAU;MACzC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,CAAC,EAAE;QACzD,OAAO,GAAG;MACX;MACA,OAAO,GAAGA,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,EAAE;IAC7B,CAAC;IAEDC,iBAAiBA,CAACH,KAAa,EAAU;MACxC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,CAAC,EAAE;QACzD,OAAO,GAAG;MACX;MACA,OAAO,GAAGA,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,EAAE;IAC7B,CAAC;IAED;AACD;AACA;IACCE,gBAAgBA,CAACJ,KAAa,EAAU;MACvC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAO,IAAI;MACZ;MACA,OAAO,GAAG,CAACD,KAAK,GAAG,GAAG,EAAEE,OAAO,CAAC,CAAC,CAAC,GAAG;IACtC,CAAC;IAEDG,qBAAqBA,CAACL,KAAa,EAAU;MAC5C,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAO,GAAG;MACX;MACA,OAAO,GAAG,CAACD,KAAK,GAAG,GAAG,EAAEE,OAAO,CAAC,CAAC,CAAC,EAAE;IACrC,CAAC;IAED;AACD;AACA;IACCI,aAAaA,CAACN,KAAa,EAAU;MACpC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAO,KAAK;MACb;MACA;MACA,MAAMM,WAAW,GAAGC,MAAM,CAACR,KAAK,CAAC;MAEjC,IAAIO,WAAW,GAAG,CAAC,EAAE;QACpB,OAAO,GAAG,CAACA,WAAW,GAAG,IAAI,EAAEL,OAAO,CAAC,CAAC,CAAC,IAAI;MAC9C;MACA,OAAO,GAAGK,WAAW,CAACL,OAAO,CAAC,CAAC,CAAC,IAAI;IACrC,CAAC;IAED;AACD;AACA;IACCO,iBAAiBA,CAACC,KAAa,EAAU;MACxC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKT,SAAS,EAAE;QAC1C,OAAO,KAAK;MACb;MACA,MAAMU,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;MACrC,MAAMC,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,GAAG,CAACL,KAAK,CAAC,GAAGG,IAAI,CAACE,GAAG,CAAC,IAAI,CAAC,CAAC;MACtD,OAAO,GAAG,CAACL,KAAK,GAAGG,IAAI,CAACG,GAAG,CAAC,IAAI,EAAEJ,CAAC,CAAC,EAAEV,OAAO,CAAC,CAAC,CAAC,IAAIS,KAAK,CAACC,CAAC,CAAC,EAAE;IAC/D,CAAC;IAED;AACD;AACA;IACCK,gBAAgBA,CAACjB,KAAa,EAAU;MACvC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAO,SAAS;MACjB;MACA,OAAO,GAAGD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,QAAQ;IACnC,CAAC;IAED;AACD;AACA;IACCgB,qBAAqBA,CAAClB,KAAa,EAAU;MAC5C,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,CAAC,EAAE;QACzD,OAAO,KAAK;MACb;MACA,IAAIA,KAAK,GAAG,CAAC,EAAE;QACd,OAAO,GAAG,CAACA,KAAK,GAAG,GAAG,EAAEE,OAAO,CAAC,CAAC,CAAC,GAAG;MACtC;MACA,OAAO,GAAGF,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,GAAG;IAC9B,CAAC;IAED;AACD;AACA;IACCiB,YAAYA,CAACC,EAAU,EAAU;MAChC,IAAIA,EAAE,KAAK,IAAI,IAAIA,EAAE,KAAKnB,SAAS,EAAE;QACpC,OAAO,IAAI;MACZ;MACA,MAAMoB,OAAO,GAAGR,IAAI,CAACC,KAAK,CAACM,EAAE,GAAG,IAAI,CAAC;MACrC,MAAME,OAAO,GAAGT,IAAI,CAACC,KAAK,CAACO,OAAO,GAAG,EAAE,CAAC;MACxC,MAAME,KAAK,GAAGV,IAAI,CAACC,KAAK,CAACQ,OAAO,GAAG,EAAE,CAAC;MACtC,MAAME,IAAI,GAAGX,IAAI,CAACC,KAAK,CAACS,KAAK,GAAG,EAAE,CAAC;MAEnC,IAAIC,IAAI,GAAG,CAAC,EAAE;QACb,OAAO,GAAGA,IAAI,KAAKD,KAAK,GAAG,EAAE,KAAKD,OAAO,GAAG,EAAE,GAAG;MAClD,CAAC,MAAM,IAAIC,KAAK,GAAG,CAAC,EAAE;QACrB,OAAO,GAAGA,KAAK,KAAKD,OAAO,GAAG,EAAE,KAAKD,OAAO,GAAG,EAAE,GAAG;MACrD,CAAC,MAAM,IAAIC,OAAO,GAAG,CAAC,EAAE;QACvB,OAAO,GAAGA,OAAO,KAAKD,OAAO,GAAG,EAAE,GAAG;MACtC,CAAC,MAAM;QACN,OAAO,GAAGA,OAAO,GAAG;MACrB;IACD,CAAC;IAED;AACD;AACA;IACCI,UAAUA,CAACC,UAAkB,EAAU;MACtC,IAAI,CAACA,UAAU,EAAE;QAChB,OAAO,EAAE;MACV;MAEA,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAACF,UAAU,CAAC;MACjC,OAAOC,IAAI,CAACE,cAAc,CAAC,CAAC;IAC7B,CAAC;IAED;AACD;AACA;IACCC,uBAAuBA,CAAC9B,KAAa,EAAU;MAC9C,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAOL,UAAU,CAACmC,IAAI;MACvB;MAEA,IAAI/B,KAAK,IAAI,GAAG,EAAE;QACjB,OAAOJ,UAAU,CAACoC,IAAI;MACvB,CAAC,MAAM,IAAIhC,KAAK,IAAI,GAAG,EAAE;QACxB,OAAOJ,UAAU,CAACqC,QAAQ;MAC3B,CAAC,MAAM;QACN,OAAOrC,UAAU,CAACsC,KAAK;MACxB;IACD,CAAC;IAED;AACD;AACA;IACCC,sBAAsBA,CAACnC,KAAa,EAAU;MAC7C,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAOL,UAAU,CAACmC,IAAI;MACvB;MAEA,IAAI/B,KAAK,IAAI,EAAE,EAAE;QAChB,OAAOJ,UAAU,CAACoC,IAAI;MACvB,CAAC,MAAM,IAAIhC,KAAK,IAAI,EAAE,EAAE;QACvB,OAAOJ,UAAU,CAACqC,QAAQ;MAC3B,CAAC,MAAM;QACN,OAAOrC,UAAU,CAACsC,KAAK;MACxB;IACD,CAAC;IAED;AACD;AACA;IACCE,wBAAwBA,CAACpC,KAAa,EAAU;MAC/C,IAAIA,KAAK,IAAI,IAAI,EAAE;QAClB,OAAOJ,UAAU,CAACoC,IAAI;MACvB,CAAC,MAAM,IAAIhC,KAAK,IAAI,IAAI,EAAE;QACzB,OAAOJ,UAAU,CAACqC,QAAQ;MAC3B,CAAC,MAAM,IAAIjC,KAAK,IAAI,GAAG,EAAE;QACxB,OAAOJ,UAAU,CAACsC,KAAK;MACxB,CAAC,MAAM;QACN,OAAOtC,UAAU,CAACyC,OAAO;MAC1B;IACD,CAAC;IAED;AACD;AACA;IACCC,gBAAgBA,CAACC,IAAY,EAAEC,MAAc,EAAU;MACtD,OAAO,CAACD,IAAI,IAAI,CAAC,KAAKC,MAAM,IAAI,CAAC,CAAC;IACnC,CAAC;IAED;AACD;AACA;IACCC,kBAAkBA,CAACF,IAAY,EAAEC,MAAc,EAAEE,IAAY,EAAEC,OAAe,EAAU;MACvF,OAAO,CAACJ,IAAI,IAAI,CAAC,KAAKC,MAAM,IAAI,CAAC,CAAC,IAAIE,IAAI,IAAI,CAAC,CAAC,IAAIC,OAAO,IAAI,CAAC,CAAC;IAClE,CAAC;IAED;AACD;AACA;IACCC,UAAUA,CAAC5C,KAAU,EAAU;MAC9B,IAAI,CAACA,KAAK,EAAE;QACX,OAAO,EAAE;MACV;MACA,IAAI;QACH,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;UAC9B;UACA,MAAM6C,MAAM,GAAGC,IAAI,CAACC,KAAK,CAAC/C,KAAK,CAAC;UAChC,OAAO8C,IAAI,CAACE,SAAS,CAACH,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,MAAM;UACN;UACA,OAAOC,IAAI,CAACE,SAAS,CAAChD,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC;MACD,CAAC,CAAC,OAAOiD,CAAC,EAAE;QACX;QACA,OAAOjD,KAAK;MACb;IACD,CAAC;IAED;AACD;AACA;IACCkD,aAAaA,CAACC,OAAe,EAAEC,SAAiB,GAAG,EAAE,EAAU;MAC9D,IAAI,CAACD,OAAO,EAAE;QACb,OAAO,EAAE;MACV;MACA,IAAIA,OAAO,CAACE,MAAM,IAAID,SAAS,EAAE;QAChC,OAAOD,OAAO;MACf;MACA,OAAOA,OAAO,CAACG,SAAS,CAAC,CAAC,EAAEF,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK;IACnD,CAAC;IAED;AACD;AACA;IACCG,eAAeA,CAAC7B,UAAkB,EAAU;MAC3C,IAAI,CAACA,UAAU,EAAE;QAChB,OAAO,OAAO;MACf;MACA,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAACF,UAAU,CAAC;MACjC,MAAM8B,GAAG,GAAG,IAAI5B,IAAI,CAAC,CAAC;MACtB,MAAM6B,MAAM,GAAGD,GAAG,CAACE,OAAO,CAAC,CAAC,GAAG/B,IAAI,CAAC+B,OAAO,CAAC,CAAC;MAC7C,MAAMC,WAAW,GAAG9C,IAAI,CAACC,KAAK,CAAC2C,MAAM,GAAG,IAAI,CAAC;MAC7C,MAAMG,WAAW,GAAG/C,IAAI,CAACC,KAAK,CAAC6C,WAAW,GAAG,EAAE,CAAC;MAChD,MAAME,SAAS,GAAGhD,IAAI,CAACC,KAAK,CAAC8C,WAAW,GAAG,EAAE,CAAC;MAC9C,MAAME,QAAQ,GAAGjD,IAAI,CAACC,KAAK,CAAC+C,SAAS,GAAG,EAAE,CAAC;MAE3C,IAAIC,QAAQ,GAAG,CAAC,EAAE;QACjB,OAAO,GAAGA,QAAQ,OAAOA,QAAQ,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,MAAM;MACvD,CAAC,MAAM,IAAID,SAAS,GAAG,CAAC,EAAE;QACzB,OAAO,GAAGA,SAAS,QAAQA,SAAS,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,MAAM;MAC1D,CAAC,MAAM,IAAID,WAAW,GAAG,CAAC,EAAE;QAC3B,OAAO,GAAGA,WAAW,UAAUA,WAAW,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,MAAM;MAChE,CAAC,MAAM;QACN,OAAO,GAAGD,WAAW,UAAUA,WAAW,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,MAAM;MAChE;IACD,CAAC;IAED;AACD;AACA;IACCI,8BAA8BA,CAAC/D,KAAa,EAAU;MACrD,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;QAC1C,OAAOL,UAAU,CAACmC,IAAI;MACvB;MAEA,IAAI/B,KAAK,GAAG,CAAC,EAAE;QACd,OAAOJ,UAAU,CAACoC,IAAI;MACvB,CAAC,MAAM,IAAIhC,KAAK,IAAI,CAAC,EAAE;QACtB,OAAOJ,UAAU,CAACqC,QAAQ;MAC3B,CAAC,MAAM;QACN,OAAOrC,UAAU,CAACsC,KAAK;MACxB;IACD,CAAC;IAED8B,mBAAmBA,CAAChE,KAAa,EAAEoD,SAAiB,GAAG,EAAE,EAAU;MAClE,IAAI,CAACpD,KAAK,EAAE;QACX,OAAO,EAAE;MACV;MACA,IAAIA,KAAK,CAACqD,MAAM,IAAID,SAAS,EAAE;QAC9B,OAAOpD,KAAK;MACb;MACA,OAAOA,KAAK,CAACsD,SAAS,CAAC,CAAC,EAAEF,SAAS,CAAC,GAAG,KAAK;IAC7C;EACD,CAAC;EAAA,OAAAtD,SAAA;AAAA","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ sap.ui.define(["sap/m/library"],function(e){"use strict";const r=e["ValueColor"];var t={formatIntegerValue(e){if(e===null||e===undefined||e===0){return"0"}return`${e.toFixed(0)}`},formatNumberValue(e){if(e===null||e===undefined||e===0){return"0"}return`${e.toFixed(2)}`},formatPercentage(e){if(e===null||e===undefined){return"0%"}return`${(e*100).toFixed(1)}%`},formatPercentageValue(e){if(e===null||e===undefined){return"0"}return`${(e*100).toFixed(1)}`},formatLatency(e){if(e===null||e===undefined){return"0ms"}const r=Number(e);if(r<1){return`${(r*1e3).toFixed(2)}μs`}return`${r.toFixed(2)}ms`},formatMemoryUsage(e){if(e===null||e===undefined){return"0 B"}const r=["B","KB","MB","GB"];const t=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,t)).toFixed(2)} ${r[t]}`},formatThroughput(e){if(e===null||e===undefined){return"0 req/s"}return`${e.toFixed(2)} req/s`},formatCacheEfficiency(e){if(e===null||e===undefined||e===0){return"N/A"}if(e<1){return`${(e*100).toFixed(1)}%`}return`${e.toFixed(1)}x`},formatUptime(e){if(e===null||e===undefined){return"0s"}const r=Math.floor(e/1e3);const t=Math.floor(r/60);const n=Math.floor(t/60);const o=Math.floor(n/24);if(o>0){return`${o}d ${n%24}h ${t%60}m`}else if(n>0){return`${n}h ${t%60}m ${r%60}s`}else if(t>0){return`${t}m ${r%60}s`}else{return`${r}s`}},formatDate(e){if(!e){return""}const r=new Date(e);return r.toLocaleString()},formatHitRatioWithColor(e){if(e===null||e===undefined){return r.None}if(e>=.9){return r.Good}else if(e>=.7){return r.Critical}else{return r.Error}},formatLatencyWithColor(e){if(e===null||e===undefined){return r.None}if(e<=10){return r.Good}else if(e<=50){return r.Critical}else{return r.Error}},formatErrorRateWithColor(e){if(e<=.01){return r.Good}else if(e<=.05){return r.Critical}else if(e<=.1){return r.Error}else{return r.Neutral}},getTotalRequests(e,r){return(e||0)+(r||0)},getTotalOperations(e,r,t,n){return(e||0)+(r||0)+(t||0)+(n||0)},formatJSON(e){if(!e){return""}try{if(typeof e==="string"){const r=JSON.parse(e);return JSON.stringify(r,null,2)}else{return JSON.stringify(e,null,2)}}catch(r){return e}},formatKeyName(e,r=30){if(!e){return""}if(e.length<=r){return e}return e.substring(0,r-3)+"..."},getRelativeTime(e){if(!e){return"Never"}const r=new Date(e);const t=new Date;const n=t.getTime()-r.getTime();const o=Math.floor(n/1e3);const u=Math.floor(o/60);const i=Math.floor(u/60);const f=Math.floor(i/24);if(f>0){return`${f} day${f>1?"s":""} ago`}else if(i>0){return`${i} hour${i>1?"s":""} ago`}else if(u>0){return`${u} minute${u>1?"s":""} ago`}else{return`${o} second${o>1?"s":""} ago`}},formatCacheEfficiencyWithColor(e){if(e===null||e===undefined){return r.None}if(e>5){return r.Good}else if(e>=3){return r.Critical}else{return r.Error}},formatTruncatedText(e,r=50){if(!e){return""}if(e.length<=r){return e}return e.substring(0,r)+"..."}};return t});
2
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","names":["ValueColor","sap_m_library","__exports","formatIntegerValue","value","undefined","toFixed","formatNumberValue","formatPercentage","formatPercentageValue","formatLatency","numberValue","Number","formatMemoryUsage","bytes","sizes","i","Math","floor","log","pow","formatThroughput","formatCacheEfficiency","formatUptime","ms","seconds","minutes","hours","days","formatDate","dateString","date","Date","toLocaleString","formatHitRatioWithColor","None","Good","Critical","Error","formatLatencyWithColor","formatErrorRateWithColor","Neutral","getTotalRequests","hits","misses","getTotalOperations","sets","deletes","formatJSON","parsed","JSON","parse","stringify","e","formatKeyName","keyName","maxLength","length","substring","getRelativeTime","now","diffMs","getTime","diffSeconds","diffMinutes","diffHours","diffDays","formatCacheEfficiencyWithColor","formatTruncatedText"],"sources":["formatter.ts"],"sourcesContent":["import { ValueColor } from \"sap/m/library\";\n\n/**\n * Formatter utility for cache statistics dashboard\n */\nexport default {\n\n\tformatIntegerValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(0)}`;\n\t},\n\n\tformatNumberValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(2)}`;\n\t},\n\n\t/**\n\t * Format percentage values\n\t */\n\tformatPercentage(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0%\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}%`;\n\t},\n\n\tformatPercentageValue(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}`;\n\t},\n\n\t/**\n\t * Format latency values in milliseconds\n\t */\n\tformatLatency(value: string): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0ms\";\n\t\t}\n\t\t// Make sure value is a number\n\t\tconst numberValue = Number(value);\n\n\t\tif (numberValue < 1) {\n\t\t\treturn `${(numberValue * 1000).toFixed(2)}μs`;\n\t\t}\n\t\treturn `${numberValue.toFixed(2)}ms`;\n\t},\n\n\t/**\n\t * Format memory usage in human readable format\n\t */\n\tformatMemoryUsage(bytes: number): string {\n\t\tif (bytes === null || bytes === undefined) {\n\t\t\treturn \"0 B\";\n\t\t}\n\t\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(1024));\n\t\treturn `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n\t},\n\n\t/**\n\t * Format throughput (requests per second)\n\t */\n\tformatThroughput(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0 req/s\";\n\t\t}\n\t\treturn `${value.toFixed(2)} req/s`;\n\t},\n\n\t/**\n\t * Format cache efficiency ratio\n\t */\n\tformatCacheEfficiency(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"N/A\";\n\t\t}\n\t\tif (value < 1) {\n\t\t\treturn `${(value * 100).toFixed(1)}%`;\n\t\t}\n\t\treturn `${value.toFixed(1)}x`;\n\t},\n\n\t/**\n\t * Format uptime in human readable format\n\t */\n\tformatUptime(ms: number): string {\n\t\tif (ms === null || ms === undefined) {\n\t\t\treturn \"0s\";\n\t\t}\n\t\tconst seconds = Math.floor(ms / 1000);\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tconst hours = Math.floor(minutes / 60);\n\t\tconst days = Math.floor(hours / 24);\n\n\t\tif (days > 0) {\n\t\t\treturn `${days}d ${hours % 24}h ${minutes % 60}m`;\n\t\t} else if (hours > 0) {\n\t\t\treturn `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}m ${seconds % 60}s`;\n\t\t} else {\n\t\t\treturn `${seconds}s`;\n\t\t}\n\t},\n\n\t/**\n\t * Format date for display\n\t */\n\tformatDate(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleString();\n\t},\n\n\t/**\n\t * Format hit ratio with color indication\n\t */\n\tformatHitRatioWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value >= 0.9) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 0.7) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format latency with color indication\n\t */\n\tformatLatencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value <= 10) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 50) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format error rate with color indication\n\t */\n\tformatErrorRateWithColor(value: number): string {\n\t\tif (value <= 0.01) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 0.05) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else if (value <= 0.1) {\n\t\t\treturn ValueColor.Error;\n\t\t} else {\n\t\t\treturn ValueColor.Neutral;\n\t\t}\n\t},\n\n\t/**\n\t * Get total requests (hits + misses)\n\t */\n\tgetTotalRequests(hits: number, misses: number): number {\n\t\treturn (hits || 0) + (misses || 0);\n\t},\n\n\t/**\n\t * Get total operations (hits + misses + sets + deletes)\n\t */\n\tgetTotalOperations(hits: number, misses: number, sets: number, deletes: number): number {\n\t\treturn (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);\n\t},\n\n\t/**\n\t * Format JSON for display\n\t */\n\tformatJSON(value: any): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\t// Try to parse and format if it's a JSON string\n\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\treturn JSON.stringify(parsed, null, 2);\n\t\t\t} else {\n\t\t\t\t// Format if it's already an object\n\t\t\t\treturn JSON.stringify(value, null, 2);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Return as-is if it's not valid JSON\n\t\t\treturn value;\n\t\t}\n\t},\n\n\t/**\n\t * Format key name for display (truncate if too long)\n\t */\n\tformatKeyName(keyName: string, maxLength: number = 30): string {\n\t\tif (!keyName) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (keyName.length <= maxLength) {\n\t\t\treturn keyName;\n\t\t}\n\t\treturn keyName.substring(0, maxLength - 3) + \"...\";\n\t},\n\n\t/**\n\t * Get relative time since last access\n\t */\n\tgetRelativeTime(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"Never\";\n\t\t}\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffMs = now.getTime() - date.getTime();\n\t\tconst diffSeconds = Math.floor(diffMs / 1000);\n\t\tconst diffMinutes = Math.floor(diffSeconds / 60);\n\t\tconst diffHours = Math.floor(diffMinutes / 60);\n\t\tconst diffDays = Math.floor(diffHours / 24);\n\n\t\tif (diffDays > 0) {\n\t\t\treturn `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\t\t} else if (diffHours > 0) {\n\t\t\treturn `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n\t\t} else if (diffMinutes > 0) {\n\t\t\treturn `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;\n\t\t} else {\n\t\t\treturn `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;\n\t\t}\n\t},\n\n\t/**\n\t * Format cache efficiency with color indication\n\t */\n\tformatCacheEfficiencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value > 5) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 3) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\tformatTruncatedText(value: string, maxLength: number = 50): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (value.length <= maxLength) {\n\t\t\treturn value;\n\t\t}\n\t\treturn value.substring(0, maxLength) + \"...\";\n\t}\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,275 @@
1
+ import { ValueColor } from "sap/m/library";
2
+
3
+ /**
4
+ * Formatter utility for cache statistics dashboard
5
+ */
6
+ export default {
7
+
8
+ formatIntegerValue(value: number): string {
9
+ if (value === null || value === undefined || value === 0) {
10
+ return "0";
11
+ }
12
+ return `${value.toFixed(0)}`;
13
+ },
14
+
15
+ formatNumberValue(value: number): string {
16
+ if (value === null || value === undefined || value === 0) {
17
+ return "0";
18
+ }
19
+ return `${value.toFixed(2)}`;
20
+ },
21
+
22
+ /**
23
+ * Format percentage values
24
+ */
25
+ formatPercentage(value: number): string {
26
+ if (value === null || value === undefined) {
27
+ return "0%";
28
+ }
29
+ return `${(value * 100).toFixed(1)}%`;
30
+ },
31
+
32
+ formatPercentageValue(value: number): string {
33
+ if (value === null || value === undefined) {
34
+ return "0";
35
+ }
36
+ return `${(value * 100).toFixed(1)}`;
37
+ },
38
+
39
+ /**
40
+ * Format latency values in milliseconds
41
+ */
42
+ formatLatency(value: string): string {
43
+ if (value === null || value === undefined) {
44
+ return "0ms";
45
+ }
46
+ // Make sure value is a number
47
+ const numberValue = Number(value);
48
+
49
+ if (numberValue < 1) {
50
+ return `${(numberValue * 1000).toFixed(2)}μs`;
51
+ }
52
+ return `${numberValue.toFixed(2)}ms`;
53
+ },
54
+
55
+ /**
56
+ * Format memory usage in human readable format
57
+ */
58
+ formatMemoryUsage(bytes: number): string {
59
+ if (bytes === null || bytes === undefined) {
60
+ return "0 B";
61
+ }
62
+ const sizes = ['B', 'KB', 'MB', 'GB'];
63
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
64
+ return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;
65
+ },
66
+
67
+ /**
68
+ * Format throughput (requests per second)
69
+ */
70
+ formatThroughput(value: number): string {
71
+ if (value === null || value === undefined) {
72
+ return "0 req/s";
73
+ }
74
+ return `${value.toFixed(2)} req/s`;
75
+ },
76
+
77
+ /**
78
+ * Format cache efficiency ratio
79
+ */
80
+ formatCacheEfficiency(value: number): string {
81
+ if (value === null || value === undefined || value === 0) {
82
+ return "N/A";
83
+ }
84
+ if (value < 1) {
85
+ return `${(value * 100).toFixed(1)}%`;
86
+ }
87
+ return `${value.toFixed(1)}x`;
88
+ },
89
+
90
+ /**
91
+ * Format uptime in human readable format
92
+ */
93
+ formatUptime(ms: number): string {
94
+ if (ms === null || ms === undefined) {
95
+ return "0s";
96
+ }
97
+ const seconds = Math.floor(ms / 1000);
98
+ const minutes = Math.floor(seconds / 60);
99
+ const hours = Math.floor(minutes / 60);
100
+ const days = Math.floor(hours / 24);
101
+
102
+ if (days > 0) {
103
+ return `${days}d ${hours % 24}h ${minutes % 60}m`;
104
+ } else if (hours > 0) {
105
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
106
+ } else if (minutes > 0) {
107
+ return `${minutes}m ${seconds % 60}s`;
108
+ } else {
109
+ return `${seconds}s`;
110
+ }
111
+ },
112
+
113
+ /**
114
+ * Format date for display
115
+ */
116
+ formatDate(dateString: string): string {
117
+ if (!dateString) {
118
+ return "";
119
+ }
120
+
121
+ const date = new Date(dateString);
122
+ return date.toLocaleString();
123
+ },
124
+
125
+ /**
126
+ * Format hit ratio with color indication
127
+ */
128
+ formatHitRatioWithColor(value: number): string {
129
+ if (value === null || value === undefined) {
130
+ return ValueColor.None;
131
+ }
132
+
133
+ if (value >= 0.9) {
134
+ return ValueColor.Good;
135
+ } else if (value >= 0.7) {
136
+ return ValueColor.Critical;
137
+ } else {
138
+ return ValueColor.Error;
139
+ }
140
+ },
141
+
142
+ /**
143
+ * Format latency with color indication
144
+ */
145
+ formatLatencyWithColor(value: number): string {
146
+ if (value === null || value === undefined) {
147
+ return ValueColor.None;
148
+ }
149
+
150
+ if (value <= 10) {
151
+ return ValueColor.Good;
152
+ } else if (value <= 50) {
153
+ return ValueColor.Critical;
154
+ } else {
155
+ return ValueColor.Error;
156
+ }
157
+ },
158
+
159
+ /**
160
+ * Format error rate with color indication
161
+ */
162
+ formatErrorRateWithColor(value: number): string {
163
+ if (value <= 0.01) {
164
+ return ValueColor.Good;
165
+ } else if (value <= 0.05) {
166
+ return ValueColor.Critical;
167
+ } else if (value <= 0.1) {
168
+ return ValueColor.Error;
169
+ } else {
170
+ return ValueColor.Neutral;
171
+ }
172
+ },
173
+
174
+ /**
175
+ * Get total requests (hits + misses)
176
+ */
177
+ getTotalRequests(hits: number, misses: number): number {
178
+ return (hits || 0) + (misses || 0);
179
+ },
180
+
181
+ /**
182
+ * Get total operations (hits + misses + sets + deletes)
183
+ */
184
+ getTotalOperations(hits: number, misses: number, sets: number, deletes: number): number {
185
+ return (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);
186
+ },
187
+
188
+ /**
189
+ * Format JSON for display
190
+ */
191
+ formatJSON(value: any): string {
192
+ if (!value) {
193
+ return "";
194
+ }
195
+ try {
196
+ if (typeof value === 'string') {
197
+ // Try to parse and format if it's a JSON string
198
+ const parsed = JSON.parse(value);
199
+ return JSON.stringify(parsed, null, 2);
200
+ } else {
201
+ // Format if it's already an object
202
+ return JSON.stringify(value, null, 2);
203
+ }
204
+ } catch (e) {
205
+ // Return as-is if it's not valid JSON
206
+ return value;
207
+ }
208
+ },
209
+
210
+ /**
211
+ * Format key name for display (truncate if too long)
212
+ */
213
+ formatKeyName(keyName: string, maxLength: number = 30): string {
214
+ if (!keyName) {
215
+ return "";
216
+ }
217
+ if (keyName.length <= maxLength) {
218
+ return keyName;
219
+ }
220
+ return keyName.substring(0, maxLength - 3) + "...";
221
+ },
222
+
223
+ /**
224
+ * Get relative time since last access
225
+ */
226
+ getRelativeTime(dateString: string): string {
227
+ if (!dateString) {
228
+ return "Never";
229
+ }
230
+ const date = new Date(dateString);
231
+ const now = new Date();
232
+ const diffMs = now.getTime() - date.getTime();
233
+ const diffSeconds = Math.floor(diffMs / 1000);
234
+ const diffMinutes = Math.floor(diffSeconds / 60);
235
+ const diffHours = Math.floor(diffMinutes / 60);
236
+ const diffDays = Math.floor(diffHours / 24);
237
+
238
+ if (diffDays > 0) {
239
+ return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
240
+ } else if (diffHours > 0) {
241
+ return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
242
+ } else if (diffMinutes > 0) {
243
+ return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;
244
+ } else {
245
+ return `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;
246
+ }
247
+ },
248
+
249
+ /**
250
+ * Format cache efficiency with color indication
251
+ */
252
+ formatCacheEfficiencyWithColor(value: number): string {
253
+ if (value === null || value === undefined) {
254
+ return ValueColor.None;
255
+ }
256
+
257
+ if (value > 5) {
258
+ return ValueColor.Good;
259
+ } else if (value >= 3) {
260
+ return ValueColor.Critical;
261
+ } else {
262
+ return ValueColor.Error;
263
+ }
264
+ },
265
+
266
+ formatTruncatedText(value: string, maxLength: number = 50): string {
267
+ if (!value) {
268
+ return "";
269
+ }
270
+ if (value.length <= maxLength) {
271
+ return value;
272
+ }
273
+ return value.substring(0, maxLength) + "...";
274
+ }
275
+ };
@@ -0,0 +1,13 @@
1
+ sap.ui.define(["sap/ui/model/json/JSONModel", "sap/ui/model/BindingMode", "sap/ui/Device"], function (JSONModel, BindingMode, Device) {
2
+ "use strict";
3
+
4
+ var __exports = {
5
+ createDeviceModel: () => {
6
+ const oModel = new JSONModel(Device);
7
+ oModel.setDefaultBindingMode(BindingMode.OneWay);
8
+ return oModel;
9
+ }
10
+ };
11
+ return __exports;
12
+ });
13
+ //# sourceMappingURL=models-dbg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-dbg.js","names":["createDeviceModel","oModel","JSONModel","Device","setDefaultBindingMode","BindingMode","OneWay","__exports"],"sources":["models.ts"],"sourcesContent":["import JSONModel from \"sap/ui/model/json/JSONModel\";\nimport BindingMode from \"sap/ui/model/BindingMode\";\n\nimport Device from \"sap/ui/Device\";\n\n\nexport default {\n\tcreateDeviceModel: () => {\n\t\tconst oModel = new JSONModel(Device);\n\t\toModel.setDefaultBindingMode(BindingMode.OneWay);\n\t\treturn oModel;\n\t}\n};\n"],"mappings":";;;kBAMe;IACdA,iBAAiB,EAAEA,CAAA,KAAM;MACxB,MAAMC,MAAM,GAAG,IAAIC,SAAS,CAACC,MAAM,CAAC;MACpCF,MAAM,CAACG,qBAAqB,CAACC,WAAW,CAACC,MAAM,CAAC;MAChD,OAAOL,MAAM;IACd;EACD,CAAC;EAAA,OAAAM,SAAA;AAAA","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ sap.ui.define(["sap/ui/model/json/JSONModel","sap/ui/model/BindingMode","sap/ui/Device"],function(e,i,n){"use strict";var d={createDeviceModel:()=>{const d=new e(n);d.setDefaultBindingMode(i.OneWay);return d}};return d});
2
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","names":["createDeviceModel","oModel","JSONModel","Device","setDefaultBindingMode","BindingMode","OneWay","__exports"],"sources":["models.ts"],"sourcesContent":["import JSONModel from \"sap/ui/model/json/JSONModel\";\nimport BindingMode from \"sap/ui/model/BindingMode\";\n\nimport Device from \"sap/ui/Device\";\n\n\nexport default {\n\tcreateDeviceModel: () => {\n\t\tconst oModel = new JSONModel(Device);\n\t\toModel.setDefaultBindingMode(BindingMode.OneWay);\n\t\treturn oModel;\n\t}\n};\n"],"mappings":"4HAMe,CACdA,kBAAmBA,KAClB,MAAMC,EAAS,IAAIC,EAAUC,GAC7BF,EAAOG,sBAAsBC,EAAYC,QACzC,OAAOL,IAER,OAAAM,CAAA","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ import JSONModel from "sap/ui/model/json/JSONModel";
2
+ import BindingMode from "sap/ui/model/BindingMode";
3
+
4
+ import Device from "sap/ui/Device";
5
+
6
+
7
+ export default {
8
+ createDeviceModel: () => {
9
+ const oModel = new JSONModel(Device);
10
+ oModel.setDefaultBindingMode(BindingMode.OneWay);
11
+ return oModel;
12
+ }
13
+ };