diff --git a/.gitignore b/.gitignore index add0add..50f2fd9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ node_modules .DS_Store release +TeradataClient/target diff --git a/TeradataClient/pom.xml b/TeradataClient/pom.xml index 2483366..929111d 100644 --- a/TeradataClient/pom.xml +++ b/TeradataClient/pom.xml @@ -38,7 +38,7 @@ com.teradata.jdbc terajdbc - 17.20.00.12 + 20.00.00.46 org.json diff --git a/constants/constants.js b/constants/constants.js index 1d3e3cc..3ea560b 100644 --- a/constants/constants.js +++ b/constants/constants.js @@ -2,6 +2,13 @@ const ERROR_MESSAGE = { aborted: 'Query execution was aborted', }; +const TABLE_KIND = { + regularTable: 'T', + noPiTable: 'O', + view: 'V', +}; + module.exports = { ERROR_MESSAGE, + TABLE_KIND, }; diff --git a/reverse_engineering/addons/TeradataClient.jar b/reverse_engineering/addons/TeradataClient.jar index 39d7904..0da9f93 100644 Binary files a/reverse_engineering/addons/TeradataClient.jar and b/reverse_engineering/addons/TeradataClient.jar differ diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 61a3e68..6a2b167 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -4,6 +4,7 @@ const connectionHelper = require('./helpers/connectionHelper'); const indexHelper = require('./helpers/indexHelper'); const udtHelper = require('./helpers/udtHelper'); const { prepareError } = require('./helpers/prepareError'); +const { TABLE_KIND } = require('../constants/constants'); const connect = async (connectionInfo, sshService, logger) => { return await connectionHelper.connect(connectionInfo, sshService, logger); @@ -62,10 +63,10 @@ const getDbCollectionsNames = async (connectionInfo, logger, callback, app) => { const instance = connectionHelper.createInstance(connection, _); log.info('Get table and database names'); - const tableNames = await instance.getDatabasesWithTableNames('T'); + const tableNames = await instance.getDatabasesWithTableNames([TABLE_KIND.regularTable, TABLE_KIND.noPiTable]); log.info('Get views and database names'); - const viewNames = getViewNames(await instance.getDatabasesWithTableNames('V')); + const viewNames = getViewNames(await instance.getDatabasesWithTableNames(TABLE_KIND.view)); const allDatabaseNames = [...Object.keys(tableNames), ...Object.keys(viewNames)]; diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 8eed43a..1981d25 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -506,7 +506,10 @@ const getIndexType = index => { const filterUdt = object => object.Kind === 'U'; -const excludeSystemUdt = type => !SYSTEM_UDT.has(type['Table/View/Macro Dictionary Name']); +const excludeSystemUdt = type => { + const creator = type['Creator SQL Name'].trim(); + return !SYSTEM_UDT.has(type['Table/View/Macro Dictionary Name']) && creator !== 'DBC' && creator !== 'SYSUDTLIB'; +}; module.exports = { connect, diff --git a/reverse_engineering/helpers/queryHelper.js b/reverse_engineering/helpers/queryHelper.js index 08671d8..02466b2 100644 --- a/reverse_engineering/helpers/queryHelper.js +++ b/reverse_engineering/helpers/queryHelper.js @@ -1,9 +1,18 @@ const cleanUpCommand = (command = '') => command.replaceAll(/\s+/g, ' '); +const getTableKindClause = ({ tableType }) => { + if (Array.isArray(tableType)) { + const types = tableType.map(type => `'${type}'`).join(','); + return `IN (${types})`; + } + + return `= '${tableType}'`; +}; + const getDatabaseAndTableNames = ({ tableType, systemDatabases }) => { const command = `SELECT DatabaseName, TableName FROM DBC.TablesV - WHERE TableKind = '${tableType}' + WHERE TableKind ${getTableKindClause({ tableType })} AND DatabaseName NOT IN (${systemDatabases.map(name => `'${name}'`).join(', ')}) ORDER BY DatabaseName, TableName;`;