sfdx-hardis 6.11.1 → 6.11.2
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.
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
Note: Can be used with `sfdx plugins:install sfdx-hardis@beta` and docker image `hardisgroupcom/sfdx-hardis@beta`
|
|
6
6
|
|
|
7
|
+
## [6.11.2] 2025-11-03
|
|
8
|
+
|
|
9
|
+
- Enhances storage stats with breakdown and filtering
|
|
10
|
+
|
|
7
11
|
## [6.11.1] 2025-11-02
|
|
8
12
|
|
|
9
13
|
- Fix manual checkbox display in PR comments
|
|
@@ -11,8 +11,12 @@ export default class StorageStats extends SfCommand<any> {
|
|
|
11
11
|
protected tableStorageInfos: any[];
|
|
12
12
|
protected outputFile: any;
|
|
13
13
|
protected outputFilesRes: any;
|
|
14
|
+
protected dateGranularity: 'year' | 'month' | 'day';
|
|
15
|
+
protected whereCondition: string;
|
|
14
16
|
run(): Promise<AnyJson>;
|
|
15
17
|
private getEmptyObjectsCache;
|
|
16
18
|
private setEmptyObjectsCache;
|
|
19
|
+
private checkFieldExistenceAndType;
|
|
20
|
+
private checkRelatedFieldPath;
|
|
17
21
|
private calculateObjectStorageStats;
|
|
18
22
|
}
|
|
@@ -15,7 +15,7 @@ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
|
15
15
|
const messages = Messages.loadMessages('sfdx-hardis', 'org');
|
|
16
16
|
export default class StorageStats extends SfCommand {
|
|
17
17
|
static title = 'Extract Data Storage stats';
|
|
18
|
-
static description = `**Extracts and analyzes Data Storage usage for a Salesforce org, providing detailed per-object breakdowns with
|
|
18
|
+
static description = `**Extracts and analyzes Data Storage usage for a Salesforce org, providing detailed per-object breakdowns with flexible grouping options.**
|
|
19
19
|
|
|
20
20
|
This command provides a comprehensive overview of your Salesforce data storage consumption. It's particularly useful for:
|
|
21
21
|
|
|
@@ -28,10 +28,19 @@ Key functionalities:
|
|
|
28
28
|
|
|
29
29
|
- **Storage Limits Analysis:** Retrieves and displays org data storage limits, including total capacity, used storage, remaining storage, and percentage used. Detects and alerts on over-usage scenarios.
|
|
30
30
|
- **SObject Discovery & Filtering:** Automatically discovers all SObjects in the org and filters them to focus on production/custom objects (excludes metadata types, platform-only objects, and cached empty objects).
|
|
31
|
-
- **Interactive Selection:** Prompts the user to select which SObjects to analyze and choose
|
|
32
|
-
- **
|
|
31
|
+
- **Interactive Selection:** Prompts the user to select which SObjects to analyze and choose breakdown fields (date fields, RecordType, custom fields, or relationship fields).
|
|
32
|
+
- **Flexible Breakdown Field:** Supports grouping by any field including:
|
|
33
|
+
- Date/DateTime fields (\`CreatedDate\`, \`LastModifiedDate\`, custom date fields)
|
|
34
|
+
- RecordType (\`RecordType.Name\`)
|
|
35
|
+
- Custom fields (\`Status__c\`, picklists, text fields)
|
|
36
|
+
- Nested relationship fields (\`SBQQ__Quote__r.RecordType.Name\`)
|
|
37
|
+
- **Date Granularity Options:** For date/datetime fields, choose between:
|
|
38
|
+
- Year-based grouping (\`CALENDAR_YEAR\`)
|
|
39
|
+
- Month-based grouping (\`CALENDAR_MONTH\`)
|
|
40
|
+
- Day-based grouping (exact date)
|
|
41
|
+
- **WHERE Clause Filtering:** Apply SOQL WHERE conditions to filter records before calculating storage (e.g., only active records, records from the last year).
|
|
33
42
|
- **Storage Estimation:** Estimates storage usage for each object using an average record size heuristic (2 KB per record) and calculates the percentage of org quota consumed.
|
|
34
|
-
- **Dual CSV Reports:** Generates two CSV files: a detailed by
|
|
43
|
+
- **Dual CSV Reports:** Generates two CSV files: a detailed breakdown by selected field and a totals-per-object summary, both suitable for spreadsheet analysis and reporting.
|
|
35
44
|
- **Empty Objects Cache:** Maintains a per-user cache of objects detected with zero records to optimize subsequent runs by skipping empty tables.
|
|
36
45
|
- **Progress Tracking:** Sends WebSocket progress messages for integration with external UIs and monitoring dashboards.
|
|
37
46
|
|
|
@@ -42,12 +51,18 @@ The command's technical implementation involves:
|
|
|
42
51
|
|
|
43
52
|
- **Limits Retrieval:** Calls \`conn.limits()\` to retrieve the \`DataStorageMB\` object containing \`Max\` and \`Remaining\` values. Handles negative \`Remaining\` values (over-usage scenarios) by calculating \`overUsageMB\` and adjusting display values.
|
|
44
53
|
- **SObject Discovery:** Uses \`conn.metadata.list([{ type: 'CustomObject' }])\` to get custom objects and \`conn.describeGlobal()\` to get all SObjects. Filters by object capabilities (\`layoutable\`, \`queryable\`, \`retrieveable\`, \`createable\`, \`updateable\`, \`deletable\`) and excludes metadata types (\`__mdt\` suffix) and cached empty objects.
|
|
45
|
-
- **User Interaction:** Uses \`prompts\` for interactive multi-select of SObjects
|
|
46
|
-
- **
|
|
47
|
-
- **
|
|
54
|
+
- **User Interaction:** Uses \`prompts\` for interactive multi-select of SObjects, breakdown field selection, granularity choice (for date fields), and optional WHERE conditions. All objects are pre-selected by default for user convenience.
|
|
55
|
+
- **Field Validation:** Recursively validates breakdown fields including nested relationships (e.g., \`SBQQ__Quote__r.RecordType.Name\`) by traversing the relationship chain and checking field existence on each related object. Automatically handles special cases like \`RecordType\` -> \`RecordTypeId\` and \`__r\` -> \`__c\` conversions.
|
|
56
|
+
- **Dynamic Query Generation:** Builds SOQL queries based on field type and granularity:
|
|
57
|
+
- For date fields with year granularity: \`SELECT CALENDAR_YEAR(<Field>) breakdown, COUNT(Id) total FROM <SObject> [WHERE ...] GROUP BY CALENDAR_YEAR(<Field>) ORDER BY CALENDAR_YEAR(<Field>)\`
|
|
58
|
+
- For date fields with month granularity: \`SELECT CALENDAR_YEAR(<Field>) year, CALENDAR_MONTH(<Field>) month, COUNT(Id) total FROM <SObject> [WHERE ...] GROUP BY CALENDAR_YEAR(<Field>), CALENDAR_MONTH(<Field>) ORDER BY CALENDAR_YEAR(<Field>), CALENDAR_MONTH(<Field>)\`
|
|
59
|
+
- For non-date fields: \`SELECT <Field> breakdown, COUNT(Id) total FROM <SObject> [WHERE ...] GROUP BY <Field> ORDER BY <Field>\`
|
|
60
|
+
- **WHERE Clause Support:** Accepts user-provided WHERE conditions via flag (\`--where\`) or interactive prompt. Injects the condition into all SOQL queries for consistent filtering across all objects.
|
|
61
|
+
- **Storage Calculation:** Applies a conservative average record size of 2 KB (2048 bytes) to estimate storage consumption. Calculates both MB usage and percentage of org quota for each object and breakdown value.
|
|
48
62
|
- **Report Generation:** Uses \`generateCsvFile\` and \`generateReportPath\` helpers to create two CSV files in the reports directory:
|
|
49
|
-
- Detailed breakdown: includes all
|
|
63
|
+
- Detailed breakdown: includes all statistics per breakdown value per object (e.g., by year, by month, by RecordType)
|
|
50
64
|
- Totals summary: includes only aggregate totals per object
|
|
65
|
+
- File naming includes breakdown field, granularity (for date fields), and \`-filtered\` suffix when WHERE clause is applied
|
|
51
66
|
- **Caching Mechanism:** Writes a JSON cache file per authenticated username (sanitized) in the reports directory (\`<username>_empty_tables_cache.json\`) containing an array of empty object names. The cache is updated after each run with newly detected empty objects.
|
|
52
67
|
- **Progress & UX:** Uses \`WebSocketClient\` to emit start/step/end progress messages for external monitoring. Outputs summary tables with \`uxLogTable\` and status messages with \`uxLog\`.
|
|
53
68
|
- **Return Value:** Returns a JSON object containing \`tableStorageInfos\` (all rows), \`tableStorageInfosTotals\` (summary rows), \`storageLimits\` (org limits object), and \`outputFiles\` (paths to generated CSV/XLSX reports).
|
|
@@ -59,12 +74,25 @@ The command's technical implementation involves:
|
|
|
59
74
|
`;
|
|
60
75
|
static examples = [
|
|
61
76
|
'$ sf hardis:org:diagnose:storage-stats',
|
|
77
|
+
'$ sf hardis:org:diagnose:storage-stats --breakdown-field "CreatedDate"',
|
|
78
|
+
'$ sf hardis:org:diagnose:storage-stats -b "RecordType.Name"',
|
|
79
|
+
'$ sf hardis:org:diagnose:storage-stats --where "CreatedDate = LAST_N_DAYS:365"',
|
|
80
|
+
'$ sf hardis:org:diagnose:storage-stats -w "Status__c = \'Active\'"',
|
|
81
|
+
'$ sf hardis:org:diagnose:storage-stats -b "LastModifiedDate" -w "IsDeleted = false"',
|
|
62
82
|
];
|
|
63
83
|
static flags = {
|
|
64
84
|
outputfile: Flags.string({
|
|
65
85
|
char: 'f',
|
|
66
86
|
description: 'Force the path and name of output report file. Must end with .csv',
|
|
67
87
|
}),
|
|
88
|
+
'breakdown-field': Flags.string({
|
|
89
|
+
char: 'b',
|
|
90
|
+
description: 'Field to use for storage stats breakdown. Example: "CreatedDate", "LastModifiedDate", "RecordType.Name", or custom fields like "Status__c"',
|
|
91
|
+
}),
|
|
92
|
+
where: Flags.string({
|
|
93
|
+
char: 'w',
|
|
94
|
+
description: 'WHERE clause to filter records in the query (without the WHERE keyword). Example: "CreatedDate = LAST_N_DAYS:365" or "Status__c = \'Active\'"',
|
|
95
|
+
}),
|
|
68
96
|
debug: Flags.boolean({
|
|
69
97
|
char: 'd',
|
|
70
98
|
default: false,
|
|
@@ -84,11 +112,14 @@ The command's technical implementation involves:
|
|
|
84
112
|
tableStorageInfos = [];
|
|
85
113
|
outputFile;
|
|
86
114
|
outputFilesRes = {};
|
|
115
|
+
dateGranularity = 'year';
|
|
116
|
+
whereCondition = '';
|
|
87
117
|
/* jscpd:ignore-end */
|
|
88
118
|
async run() {
|
|
89
119
|
const { flags } = await this.parse(StorageStats);
|
|
90
120
|
this.debugMode = flags.debug || false;
|
|
91
121
|
this.outputFile = flags.outputfile || null;
|
|
122
|
+
this.whereCondition = flags.where || '';
|
|
92
123
|
const conn = flags['target-org'].getConnection();
|
|
93
124
|
// Querying storage limit
|
|
94
125
|
uxLog("action", this, `Retrieving storage limits from the org...`);
|
|
@@ -145,24 +176,78 @@ The command's technical implementation involves:
|
|
|
145
176
|
return sObjectsFiltered.find((obj) => obj.name === objName);
|
|
146
177
|
});
|
|
147
178
|
uxLog("log", this, `${selectedObjects.length} SObjects selected for analysis.`);
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
179
|
+
// Get breakdown field from flag or prompt user
|
|
180
|
+
let breakdownField = flags['breakdown-field'];
|
|
181
|
+
if (!breakdownField) {
|
|
182
|
+
// Prompt user for stats on CreatedDate or LastModifiedDate
|
|
183
|
+
const promptDateFieldRes = await prompts({
|
|
184
|
+
type: 'select',
|
|
185
|
+
message: 'Select the date field to use for storage stats breakdown',
|
|
186
|
+
description: "Choose between CreatedDate or LastModifiedDate.",
|
|
187
|
+
choices: [
|
|
188
|
+
{ title: 'Created Date', value: 'CreatedDate' },
|
|
189
|
+
{ title: 'Last Modified Date', value: 'LastModifiedDate' },
|
|
190
|
+
{ title: 'Record Type (if applicable)', value: 'RecordType.Name' },
|
|
191
|
+
{ title: "Custom (will exclude objects who doesn't have the field)", value: 'custom' }
|
|
192
|
+
],
|
|
193
|
+
});
|
|
194
|
+
breakdownField = promptDateFieldRes.value;
|
|
195
|
+
if (breakdownField === 'custom') {
|
|
196
|
+
const promptFieldRes = await prompts({
|
|
197
|
+
type: 'text',
|
|
198
|
+
message: 'Enter the API name of the custom date field to use for storage stats breakdown',
|
|
199
|
+
description: "Objects without this field will be excluded from the analysis.",
|
|
200
|
+
placeholder: 'My_Date_Field__c, RecordType.Name, SBQQ_Quote__r.Status__c or SBQQ__Quote__r.RecordType.Name',
|
|
201
|
+
});
|
|
202
|
+
breakdownField = promptFieldRes.value;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
uxLog("log", this, `Using ${c.cyan(breakdownField)} for storage stats breakdown.`);
|
|
206
|
+
// Check if the selected field is a date field to prompt for granularity
|
|
207
|
+
// We need to check at least one object to determine the field type
|
|
208
|
+
let isDateFieldForGranularity = false;
|
|
209
|
+
if (breakdownField === 'CreatedDate' || breakdownField === 'LastModifiedDate') {
|
|
210
|
+
isDateFieldForGranularity = true;
|
|
211
|
+
}
|
|
212
|
+
else if (selectedObjects.length > 0) {
|
|
213
|
+
// Check the first selected object to determine field type
|
|
214
|
+
const firstObjCheck = await this.checkFieldExistenceAndType(selectedObjects[0], breakdownField, conn);
|
|
215
|
+
isDateFieldForGranularity = firstObjCheck.isDateField;
|
|
216
|
+
}
|
|
217
|
+
// Prompt for date granularity if the field is a date/datetime
|
|
218
|
+
if (isDateFieldForGranularity) {
|
|
219
|
+
const promptGranularityRes = await prompts({
|
|
220
|
+
type: 'select',
|
|
221
|
+
message: 'Select the breakdown granularity for the date field',
|
|
222
|
+
description: "Choose how you want to group the storage statistics.",
|
|
223
|
+
choices: [
|
|
224
|
+
{ title: 'By Year (CALENDAR_YEAR)', value: 'year' },
|
|
225
|
+
{ title: 'By Month (CALENDAR_MONTH)', value: 'month' },
|
|
226
|
+
{ title: 'By Day (exact date)', value: 'day' }
|
|
227
|
+
],
|
|
228
|
+
});
|
|
229
|
+
this.dateGranularity = promptGranularityRes.value;
|
|
230
|
+
uxLog("log", this, `Using ${c.cyan(this.dateGranularity)} granularity for date breakdown.`);
|
|
231
|
+
}
|
|
232
|
+
// Prompt for WHERE condition if not provided via flag
|
|
233
|
+
if (!this.whereCondition) {
|
|
234
|
+
const promptWhereCondRes = await prompts({
|
|
235
|
+
type: 'text',
|
|
236
|
+
message: 'Enter an optional WHERE condition to filter records (SOQL syntax)',
|
|
237
|
+
description: 'You can provide an optional WHERE clause to filter records for the storage stats calculation. Leave empty for no filter.',
|
|
238
|
+
placeholder: "Ex: CreatedDate = LAST_N_DAYS:365 or Status__c = 'Active'"
|
|
239
|
+
});
|
|
240
|
+
this.whereCondition = promptWhereCondRes.value || '';
|
|
241
|
+
}
|
|
242
|
+
if (this.whereCondition) {
|
|
243
|
+
uxLog("log", this, `Applying WHERE condition: ${c.cyan(this.whereCondition)}`);
|
|
244
|
+
}
|
|
160
245
|
// Query objects to know the count of records, storage used and their year of created date
|
|
161
246
|
WebSocketClient.sendProgressStartMessage(`Calculating storage stats for ${selectedObjects.length} objects...`, selectedObjects.length);
|
|
162
247
|
const objectStorageStats = [];
|
|
163
248
|
let step = 0;
|
|
164
249
|
for (const obj of selectedObjects) {
|
|
165
|
-
const res = await this.calculateObjectStorageStats(obj,
|
|
250
|
+
const res = await this.calculateObjectStorageStats(obj, breakdownField, conn);
|
|
166
251
|
objectStorageStats.push(res);
|
|
167
252
|
step++;
|
|
168
253
|
WebSocketClient.sendProgressStepMessage(step);
|
|
@@ -171,8 +256,12 @@ The command's technical implementation involves:
|
|
|
171
256
|
uxLog("action", this, `Compiling storage stats...`);
|
|
172
257
|
// Sort by total records descending
|
|
173
258
|
sortArray(objectStorageStats, { by: 'totalRecords', order: 'desc' });
|
|
174
|
-
// Create one line by
|
|
259
|
+
// Create one line by breakdown per object
|
|
175
260
|
this.tableStorageInfos = objectStorageStats.flatMap(objStats => {
|
|
261
|
+
// Skip objects that don't have the field
|
|
262
|
+
if (objStats.skipped) {
|
|
263
|
+
return [];
|
|
264
|
+
}
|
|
176
265
|
const allLines = [];
|
|
177
266
|
// calculate object storage usage based on record count and average record size
|
|
178
267
|
const averageSalesforceRecordSizeBytes = 2 * 1024; // 2 KB average size per record
|
|
@@ -182,40 +271,49 @@ The command's technical implementation involves:
|
|
|
182
271
|
};
|
|
183
272
|
const globalLine = {
|
|
184
273
|
...tableStorageInfo,
|
|
185
|
-
|
|
274
|
+
Breakdown: 'Total',
|
|
186
275
|
RecordCount: objStats.totalRecords,
|
|
187
276
|
EstimatedStoragePercentage: ((objStats.totalRecords * averageSalesforceRecordSizeBytes) / (dataStorageLimit.Max * 1024 * 1024) * 100).toFixed(2) + "%",
|
|
188
277
|
EstimatedStorageMB: ((objStats.totalRecords * averageSalesforceRecordSizeBytes) / (1024 * 1024)).toFixed(2),
|
|
189
278
|
};
|
|
190
279
|
allLines.push(globalLine);
|
|
191
|
-
for (const
|
|
192
|
-
const
|
|
193
|
-
const recordCount =
|
|
194
|
-
const
|
|
280
|
+
for (const breakdownStat of objStats.breakdownStats) {
|
|
281
|
+
const breakdownValue = breakdownStat.breakdown;
|
|
282
|
+
const recordCount = breakdownStat.total;
|
|
283
|
+
const storageUsedBreakdownBytes = (recordCount * averageSalesforceRecordSizeBytes) / (1024 * 1024);
|
|
195
284
|
const line = {
|
|
196
285
|
...tableStorageInfo,
|
|
197
|
-
|
|
286
|
+
Breakdown: breakdownValue,
|
|
198
287
|
RecordCount: recordCount,
|
|
199
|
-
EstimatedStoragePercentage: (
|
|
200
|
-
EstimatedStorageMB:
|
|
288
|
+
EstimatedStoragePercentage: (storageUsedBreakdownBytes / (dataStorageLimit.Max) * 100).toFixed(2) + "%",
|
|
289
|
+
EstimatedStorageMB: storageUsedBreakdownBytes.toFixed(2),
|
|
201
290
|
};
|
|
202
291
|
allLines.push(line);
|
|
203
292
|
}
|
|
204
293
|
return allLines;
|
|
205
294
|
});
|
|
206
|
-
// Update empty objects cache
|
|
207
|
-
const newlyEmptyObjects = objectStorageStats
|
|
295
|
+
// Update empty objects cache (exclude objects that were skipped or had errors)
|
|
296
|
+
const newlyEmptyObjects = objectStorageStats
|
|
297
|
+
.filter(obj => obj.totalRecords === 0 && !obj.skipped && !obj.error)
|
|
298
|
+
.map(obj => obj.name);
|
|
208
299
|
const updatedEmptyObjects = Array.from(new Set([...emptyObjects, ...newlyEmptyObjects]));
|
|
209
300
|
await this.setEmptyObjectsCache(updatedEmptyObjects);
|
|
210
301
|
uxLog("log", this, `Empty objects cache updated with ${newlyEmptyObjects.length} newly detected empty objects.`);
|
|
211
302
|
// Remove objects with zero records from the report
|
|
212
303
|
this.tableStorageInfos = this.tableStorageInfos.filter(info => info.RecordCount > 0);
|
|
213
|
-
// Generate output CSV file with breakdown
|
|
214
|
-
|
|
215
|
-
|
|
304
|
+
// Generate output CSV file with breakdown
|
|
305
|
+
const granularitySuffix = isDateFieldForGranularity ? `-${this.dateGranularity}` : '';
|
|
306
|
+
const whereSuffix = this.whereCondition ? '-filtered' : '';
|
|
307
|
+
const fileBaseName = `storage-stats-by-${breakdownField.replace(/\./g, '_')}${granularitySuffix}${whereSuffix}`;
|
|
308
|
+
this.outputFile = await generateReportPath(fileBaseName, this.outputFile);
|
|
309
|
+
const whereInfo = this.whereCondition ? ` (WHERE ${this.whereCondition})` : '';
|
|
310
|
+
const fileTitleBreakdown = isDateFieldForGranularity
|
|
311
|
+
? `Storage stats breakdown by ${breakdownField} (${this.dateGranularity})${whereInfo}`
|
|
312
|
+
: `Storage stats breakdown by ${breakdownField}${whereInfo}`;
|
|
313
|
+
this.outputFilesRes = await generateCsvFile(this.tableStorageInfos, this.outputFile, { fileTitle: fileTitleBreakdown });
|
|
216
314
|
// Generate output CSV file with only total per object
|
|
217
315
|
const outputFileTotals = this.outputFile.replace('.csv', '-totals.csv');
|
|
218
|
-
const tableStorageInfosTotals = this.tableStorageInfos.filter(info => info.
|
|
316
|
+
const tableStorageInfosTotals = this.tableStorageInfos.filter(info => info.Breakdown === 'Total');
|
|
219
317
|
const outputFilesResTotals = await generateCsvFile(tableStorageInfosTotals, outputFileTotals, { fileTitle: "Storage stats totals per object" });
|
|
220
318
|
this.outputFilesRes.totalPerObject = outputFilesResTotals;
|
|
221
319
|
// Display results
|
|
@@ -244,33 +342,216 @@ The command's technical implementation involves:
|
|
|
244
342
|
};
|
|
245
343
|
await fs.writeJSON(this.cacheFilePath, cacheContent, { spaces: 2 });
|
|
246
344
|
}
|
|
247
|
-
async
|
|
345
|
+
async checkFieldExistenceAndType(obj, breakdownField, conn) {
|
|
346
|
+
// Standard date fields are always valid and are date fields
|
|
347
|
+
if (breakdownField === 'CreatedDate' || breakdownField === 'LastModifiedDate') {
|
|
348
|
+
return { isValid: true, isDateField: true };
|
|
349
|
+
}
|
|
350
|
+
const fieldPath = breakdownField.split('.');
|
|
351
|
+
try {
|
|
352
|
+
const describe = await conn.sobject(obj.name).describe();
|
|
353
|
+
const fieldName = fieldPath[0];
|
|
354
|
+
// Determine the field to check in describe
|
|
355
|
+
let fieldToCheck = fieldName;
|
|
356
|
+
// Special case: RecordType.Name -> check RecordTypeId
|
|
357
|
+
if (fieldName === 'RecordType') {
|
|
358
|
+
fieldToCheck = 'RecordTypeId';
|
|
359
|
+
}
|
|
360
|
+
// Special case: Custom relationships ending with __r -> convert to __c (e.g., SBQQ_Quote__r -> SBQQ_Quote__c)
|
|
361
|
+
else if (fieldName.endsWith('__r')) {
|
|
362
|
+
fieldToCheck = fieldName.replace(/__r$/, '__c');
|
|
363
|
+
}
|
|
364
|
+
const field = describe.fields.find((f) => f.name === fieldToCheck);
|
|
365
|
+
if (!field) {
|
|
366
|
+
uxLog("warning", this, c.yellow(`Skipping object ${c.cyan(obj.name)}: field ${c.cyan(breakdownField)} not found`));
|
|
367
|
+
return {
|
|
368
|
+
isValid: false,
|
|
369
|
+
isDateField: false,
|
|
370
|
+
errorResult: {
|
|
371
|
+
name: obj.name,
|
|
372
|
+
label: obj.label,
|
|
373
|
+
totalRecords: 0,
|
|
374
|
+
breakdownStats: [],
|
|
375
|
+
skipped: true,
|
|
376
|
+
skipReason: `Field ${breakdownField} not found on object`
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// Navigate through relationship fields recursively
|
|
381
|
+
if (fieldPath.length > 1 && field.referenceTo && field.referenceTo.length > 0) {
|
|
382
|
+
return await this.checkRelatedFieldPath(obj, field, fieldPath.slice(1), conn, [field.referenceTo[0]]);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
// Direct field on the object, check its type
|
|
386
|
+
const isDateField = field.type === 'date' || field.type === 'datetime';
|
|
387
|
+
return { isValid: true, isDateField };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
uxLog("error", this, `Error describing object ${c.cyan(obj.name)}: ${error.message}`);
|
|
392
|
+
return {
|
|
393
|
+
isValid: false,
|
|
394
|
+
isDateField: false,
|
|
395
|
+
errorResult: {
|
|
396
|
+
name: obj.name,
|
|
397
|
+
label: obj.label + ' (Describe Error): ' + error.message,
|
|
398
|
+
totalRecords: 0,
|
|
399
|
+
breakdownStats: [],
|
|
400
|
+
error: true,
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
async checkRelatedFieldPath(originalObj, currentField, remainingPath, conn, relationshipChain) {
|
|
406
|
+
const relatedObjectName = currentField.referenceTo[0]; // Take first reference (polymorphic not fully supported)
|
|
407
|
+
const nextFieldName = remainingPath[0];
|
|
408
|
+
try {
|
|
409
|
+
const relatedDescribe = await conn.sobject(relatedObjectName).describe();
|
|
410
|
+
// Determine the field to check in describe
|
|
411
|
+
let fieldToCheck = nextFieldName;
|
|
412
|
+
// Special case: RecordType.Name -> check RecordTypeId
|
|
413
|
+
if (nextFieldName === 'RecordType') {
|
|
414
|
+
fieldToCheck = 'RecordTypeId';
|
|
415
|
+
}
|
|
416
|
+
// Special case: Custom relationships ending with __r -> convert to __c
|
|
417
|
+
else if (nextFieldName.endsWith('__r')) {
|
|
418
|
+
fieldToCheck = nextFieldName.replace(/__r$/, '__c');
|
|
419
|
+
}
|
|
420
|
+
const relatedField = relatedDescribe.fields.find((f) => f.name === fieldToCheck);
|
|
421
|
+
if (!relatedField) {
|
|
422
|
+
const relationshipPath = relationshipChain.join(' -> ');
|
|
423
|
+
uxLog("warning", this, c.yellow(`Skipping object ${c.cyan(originalObj.name)}: field ${c.cyan(nextFieldName)} not found on ${c.cyan(relatedObjectName)} (path: ${relationshipPath})`));
|
|
424
|
+
return {
|
|
425
|
+
isValid: false,
|
|
426
|
+
isDateField: false,
|
|
427
|
+
errorResult: {
|
|
428
|
+
name: originalObj.name,
|
|
429
|
+
label: originalObj.label,
|
|
430
|
+
totalRecords: 0,
|
|
431
|
+
breakdownStats: [],
|
|
432
|
+
skipped: true,
|
|
433
|
+
skipReason: `Field ${nextFieldName} not found on related object ${relatedObjectName} (relationship path: ${relationshipPath})`
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
// If there are more levels to traverse
|
|
438
|
+
if (remainingPath.length > 1 && relatedField.referenceTo && relatedField.referenceTo.length > 0) {
|
|
439
|
+
return await this.checkRelatedFieldPath(originalObj, relatedField, remainingPath.slice(1), conn, [...relationshipChain, relatedField.referenceTo[0]]);
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
// This is the final field, check its type
|
|
443
|
+
const isDateField = relatedField.type === 'date' || relatedField.type === 'datetime';
|
|
444
|
+
return { isValid: true, isDateField };
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
const relationshipPath = relationshipChain.join(' -> ');
|
|
449
|
+
uxLog("error", this, `Error describing related object ${c.cyan(relatedObjectName)}: ${error.message} (path: ${relationshipPath})`);
|
|
450
|
+
return {
|
|
451
|
+
isValid: false,
|
|
452
|
+
isDateField: false,
|
|
453
|
+
errorResult: {
|
|
454
|
+
name: originalObj.name,
|
|
455
|
+
label: originalObj.label + ` (Describe Error on ${relatedObjectName}): ` + error.message,
|
|
456
|
+
totalRecords: 0,
|
|
457
|
+
breakdownStats: [],
|
|
458
|
+
error: true,
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
async calculateObjectStorageStats(obj, breakdownField, conn) {
|
|
248
464
|
uxLog("log", this, `Querying storage stats for object: ${c.cyan(obj.name)}...`);
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
465
|
+
// Check if field exists on object and determine its type
|
|
466
|
+
const fieldCheck = await this.checkFieldExistenceAndType(obj, breakdownField, conn);
|
|
467
|
+
if (!fieldCheck.isValid) {
|
|
468
|
+
return fieldCheck.errorResult;
|
|
469
|
+
}
|
|
470
|
+
// Build query based on field type
|
|
471
|
+
let query;
|
|
472
|
+
let groupByClause;
|
|
473
|
+
let orderByClause;
|
|
474
|
+
// Use appropriate date function for date/datetime fields based on granularity
|
|
475
|
+
if (fieldCheck.isDateField) {
|
|
476
|
+
switch (this.dateGranularity) {
|
|
477
|
+
case 'year':
|
|
478
|
+
groupByClause = `CALENDAR_YEAR(${breakdownField})`;
|
|
479
|
+
orderByClause = `CALENDAR_YEAR(${breakdownField})`;
|
|
480
|
+
break;
|
|
481
|
+
case 'month':
|
|
482
|
+
groupByClause = `CALENDAR_YEAR(${breakdownField}), CALENDAR_MONTH(${breakdownField})`;
|
|
483
|
+
orderByClause = `CALENDAR_YEAR(${breakdownField}), CALENDAR_MONTH(${breakdownField})`;
|
|
484
|
+
break;
|
|
485
|
+
case 'day':
|
|
486
|
+
groupByClause = breakdownField;
|
|
487
|
+
orderByClause = `${breakdownField}`;
|
|
488
|
+
break;
|
|
489
|
+
default:
|
|
490
|
+
groupByClause = `CALENDAR_YEAR(${breakdownField})`;
|
|
491
|
+
orderByClause = `CALENDAR_YEAR(${breakdownField})`;
|
|
492
|
+
}
|
|
493
|
+
// Build appropriate SELECT clause based on granularity
|
|
494
|
+
let selectClause;
|
|
495
|
+
if (this.dateGranularity === 'month') {
|
|
496
|
+
selectClause = `CALENDAR_YEAR(${breakdownField}) year, CALENDAR_MONTH(${breakdownField}) month, COUNT(Id) total`;
|
|
497
|
+
}
|
|
498
|
+
else if (this.dateGranularity === 'day') {
|
|
499
|
+
selectClause = `${breakdownField} breakdown, COUNT(Id) total`;
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
selectClause = `CALENDAR_YEAR(${breakdownField}) breakdown, COUNT(Id) total`;
|
|
503
|
+
}
|
|
504
|
+
// Build WHERE clause if provided
|
|
505
|
+
const whereClause = this.whereCondition ? `WHERE ${this.whereCondition}` : '';
|
|
506
|
+
query = `SELECT ${selectClause}
|
|
507
|
+
FROM ${obj.name}${whereClause ? ` ${whereClause}` : ''}
|
|
508
|
+
GROUP BY ${groupByClause}
|
|
509
|
+
ORDER BY ${orderByClause}`;
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
// For non-date fields (RecordType.Name, picklists, text fields), use direct grouping
|
|
513
|
+
groupByClause = breakdownField;
|
|
514
|
+
// Build WHERE clause if provided
|
|
515
|
+
const whereClause = this.whereCondition ? `WHERE ${this.whereCondition}` : '';
|
|
516
|
+
query = `SELECT ${breakdownField} breakdown, COUNT(Id) total
|
|
517
|
+
FROM ${obj.name}${whereClause ? ` ${whereClause}` : ''}
|
|
518
|
+
GROUP BY ${breakdownField}
|
|
519
|
+
ORDER BY ${breakdownField}`;
|
|
520
|
+
}
|
|
253
521
|
try {
|
|
254
522
|
const queryRes = await soqlQuery(query, conn);
|
|
255
|
-
const
|
|
256
|
-
year
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
523
|
+
const breakdownStats = queryRes.records.map((record) => {
|
|
524
|
+
// Handle month granularity (year and month fields)
|
|
525
|
+
if (record.year !== undefined && record.month !== undefined) {
|
|
526
|
+
// Format as YYYY-MM for better readability
|
|
527
|
+
const monthStr = String(record.month).padStart(2, '0');
|
|
528
|
+
return {
|
|
529
|
+
breakdown: `${record.year}-${monthStr}`,
|
|
530
|
+
total: record.total,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
// Handle other cases (year, day, or non-date fields)
|
|
534
|
+
return {
|
|
535
|
+
breakdown: record.breakdown || 'N/A',
|
|
536
|
+
total: record.total,
|
|
537
|
+
};
|
|
538
|
+
});
|
|
539
|
+
const totalRecords = breakdownStats.reduce((acc, curr) => acc + curr.total, 0);
|
|
260
540
|
return {
|
|
261
541
|
name: obj.name,
|
|
262
542
|
label: obj.label,
|
|
263
543
|
totalRecords,
|
|
264
|
-
|
|
544
|
+
breakdownStats,
|
|
265
545
|
};
|
|
266
546
|
}
|
|
267
547
|
catch (error) {
|
|
268
548
|
uxLog("error", this, `Error querying object ${c.cyan(obj.name)}: ${error.message}`);
|
|
269
549
|
return {
|
|
270
550
|
name: obj.name,
|
|
271
|
-
label: obj.label + ' (Query Error):' + error.message,
|
|
551
|
+
label: obj.label + ' (Query Error): ' + error.message,
|
|
272
552
|
totalRecords: 0,
|
|
273
|
-
|
|
553
|
+
breakdownStats: [],
|
|
554
|
+
error: true,
|
|
274
555
|
};
|
|
275
556
|
}
|
|
276
557
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-stats.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/org/diagnose/storage-stats.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage-stats.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/org/diagnose/storage-stats.ts"],"names":[],"mappings":"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"}
|