Skip to content

Commit 0b7d975

Browse files
authored
HCK-16585: Load procedures only for selected tables (#197)
* HCK-16585: Query procedures ref by selected tables * HCK-16585: Add RE options to ignore procedures * HCK-16585: Extend objects for procedures db client * HCK-16585: Remove localization param * HCK-16585: Fix incorrect wording
1 parent 0b1a8ba commit 0b7d975

4 files changed

Lines changed: 36 additions & 8 deletions

File tree

localization/en.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@
7979
"MODAL_WINDOW___SUBDOCUMENT_IN_CHILD": "Sub-document in child",
8080
"MODAL_WINDOW___ARRAY_IN_PARENT": "Array in parent",
8181
"MODAL_WINDOW___INCLUDE_EMPTY_COLLECTION": "Include empty tables",
82-
"MODAL_WINDOW___INCLUDE_PROCEDURES": "Include stored procedures",
8382
"MODAL_WINDOW___CREATE_COLLECTION": "Create table",
8483
"MODAL_WINDOW___CREATE_BUCKET": "Create schema",
8584
"MODAL_WINDOW___ALL_COLLECTIONS": "and all nested tables",

reverse_engineering/config.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,12 @@
1616
}
1717
],
1818
"externalBrowserPort": 8080,
19-
"helpUrl": "https://hackolade.com/help/ConnecttoaSQLServerinstance.html"
19+
"helpUrl": "https://hackolade.com/help/ConnecttoaSQLServerinstance.html",
20+
"options": [
21+
{
22+
"inputLabel": "Include stored procedures",
23+
"inputTooltip": "Reverse-engineer stored procedures",
24+
"inputKeyword": "includeProcedures"
25+
}
26+
]
2027
}

reverse_engineering/databaseService/databaseService.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ const getWhereClauseForUniqueSchemasAndTables = ({ tableAlias, allUniqueSchemasA
10011001
`OBJECT_SCHEMA_NAME(${tableAlias}.object_id) IN (${[...schemas].join(', ')})
10021002
AND OBJECT_NAME(${tableAlias}.object_id) IN (${[...tables].join(', ')})`;
10031003

1004-
const getDatabaseProcedures = async ({ client, dbName, logger, includeProcedures }) => {
1004+
const getDatabaseProcedures = async ({ client, dbName, logger, includeProcedures, allUniqueSchemasAndTables }) => {
10051005
if (!includeProcedures) {
10061006
logger.log(
10071007
'info',
@@ -1021,17 +1021,25 @@ const getDatabaseProcedures = async ({ client, dbName, logger, includeProcedures
10211021
dbName,
10221022
meta: {
10231023
action: 'getting procedures query',
1024-
objects: ['sys.procedures', 'sys.schemas', 'sys.sql_modules', 'sys.extended_properties'],
1024+
objects: [
1025+
'sys.procedures',
1026+
'sys.schemas',
1027+
'sys.sql_modules',
1028+
'sys.extended_properties',
1029+
'sys.sql_expression_dependencies',
1030+
],
10251031
skip: true,
10261032
},
10271033
logger,
10281034
});
10291035

1036+
const { schemas, tables } = allUniqueSchemasAndTables;
1037+
10301038
logger.log('info', { message: `Get '${dbName}' database procedures.` }, 'Reverse Engineering');
10311039
logger.progress({ message: 'Discovering stored procedure metadata', containerName: dbName, entityName: '' });
10321040

10331041
const response = await currentDbConnectionClient.query(`
1034-
SELECT
1042+
SELECT DISTINCT
10351043
s.name AS schema_name,
10361044
p.name AS procedure_name,
10371045
sm.definition AS procedure_body,
@@ -1045,12 +1053,20 @@ const getDatabaseProcedures = async ({ client, dbName, logger, includeProcedures
10451053
ON ep.major_id = p.object_id
10461054
AND ep.minor_id = 0
10471055
AND ep.name = 'MS_Description'
1048-
ORDER BY s.name, p.name;
1056+
INNER JOIN sys.sql_expression_dependencies sed
1057+
ON p.object_id = sed.referencing_id
1058+
WHERE s.name IN (${[...schemas].join(', ')})
1059+
AND sed.referenced_entity_name IN (${[...tables].join(', ')})
1060+
ORDER BY s.name, p.name
10491061
`);
10501062

10511063
const rawProcedures = await mapResponse(response);
10521064

1053-
logger.log('info', { message: `Parsing procedures.` }, 'Reverse Engineering');
1065+
logger.log(
1066+
'info',
1067+
{ message: `Fetching stored procedures completed. Procedures found: ${rawProcedures.length}.` },
1068+
'Reverse Engineering',
1069+
);
10541070
logger.progress({ message: 'Parsing procedures', containerName: dbName, entityName: '' });
10551071
const start = Date.now();
10561072
const parsedProcedures = rawProcedures.map(parseProcedure(logger));

reverse_engineering/reverseEngineeringService/reverseEngineeringService.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,13 @@ const fetchDatabaseMetadata = async ({ client, dbName, tablesInfo, logger, rever
323323
});
324324
logDiscoveredMetadataCount({ logger, label: 'spatial indexes', items: spatialIndexes });
325325

326-
const procedures = await getDatabaseProcedures({ client, dbName, logger, includeProcedures });
326+
const procedures = await getDatabaseProcedures({
327+
client,
328+
dbName,
329+
logger,
330+
includeProcedures,
331+
allUniqueSchemasAndTables,
332+
});
327333

328334
const indexesBucketCount = await getIndexesBucketCount({
329335
client,

0 commit comments

Comments
 (0)