From bd5db1ac070a8fdd115470ca4f6e25e167f58281 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 20 Nov 2024 10:38:05 +0200 Subject: [PATCH 1/5] HCK-8842: remove relative table binding for view --- reverse_engineering/api.js | 2 +- .../reverseEngineeringService.js | 44 ++++++------------- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index f19126d..39aff5e 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -138,7 +138,7 @@ module.exports = { ]); callback( null, - mergeCollectionsWithViews(jsonSchemas), + mergeCollectionsWithViews({ jsonSchemas, _ }), modelInfo, filterRelationships(relationships, jsonSchemas), ); diff --git a/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js b/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js index c2f64c2..e7aa676 100644 --- a/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js +++ b/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js @@ -37,38 +37,20 @@ const { } = require('./helpers'); const pipe = require('../helpers/pipe'); -const mergeCollectionsWithViews = jsonSchemas => { - return jsonSchemas.reduce((structuredJSONSchemas, jsonSchema) => { - if (jsonSchema.relatedTables) { - const currentIndex = structuredJSONSchemas.findIndex( - structuredSchema => - jsonSchema.collectionName === structuredSchema.collectionName && - jsonSchema.dbName === structuredSchema.dbName, - ); - const relatedTableSchemaIndex = structuredJSONSchemas.findIndex(({ collectionName, dbName }) => - jsonSchema.relatedTables.find( - ({ tableName, schemaName }) => tableName === collectionName && schemaName === dbName, - ), - ); - - if (relatedTableSchemaIndex !== -1 && doesViewHaveRelatedTables(jsonSchema, structuredJSONSchemas)) { - structuredJSONSchemas[relatedTableSchemaIndex].views.push(jsonSchema); - } else { - structuredJSONSchemas.push({ - dbName: jsonSchema.dbName, - entityLevel: {}, - views: [jsonSchema], - emptyBucket: false, - bucketInfo: jsonSchema.bucketInfo, - }); - } - - delete jsonSchema.relatedTables; - return structuredJSONSchemas.filter((schema, i) => i !== currentIndex); - } +const mergeCollectionsWithViews = ({ jsonSchemas, _ }) => { + const [viewSchemas, collectionSchemas] = _.partition(jsonSchemas, jsonSchema => jsonSchema.relatedTables); + const groupedViewSchemas = _.groupBy(viewSchemas, 'dbName'); + const combinedViewSchemas = Object.entries(groupedViewSchemas).map(([dbName, views]) => { + return { + dbName, + entityLevel: {}, + emptyBucket: false, + bucketInfo: views[0].bucketInfo, + views: views.map(view => _.omit(view, ['relatedTables'])), + }; + }); - return structuredJSONSchemas; - }, jsonSchemas); + return [...collectionSchemas, ...combinedViewSchemas]; }; const getCollectionsRelationships = logger => async dbConnectionClient => { From 650dacd8e63595866aa50ad69f72ed293684d76a Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 20 Nov 2024 10:59:10 +0200 Subject: [PATCH 2/5] HCK-8842: add an adapter to clear viewOn property --- adapter/0.2.12.json | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 adapter/0.2.12.json diff --git a/adapter/0.2.12.json b/adapter/0.2.12.json new file mode 100644 index 0000000..b2f5f96 --- /dev/null +++ b/adapter/0.2.12.json @@ -0,0 +1,53 @@ +/** + * Copyright © 2016-2024 by IntegrIT S.A. dba Hackolade. All rights reserved. + * + * The copyright to the computer software herein is the property of IntegrIT S.A. + * The software may be used and/or copied only with the written permission of + * IntegrIT S.A. or in accordance with the terms and conditions stipulated in + * the agreement/contract under which the software has been supplied. + * + * { + * "add": { + * "entity": [], + * "container": [], + * "model": [], + * "view": [], + * "field": { + * "": [] + * } + * }, + * "delete": { + * "entity": [], + * "container": [], + * "model": [], + * "view": [], + * "field": { + * "": [] + * } + * }, + * "modify": { + * "entity": [ + * { + * "from": { }, + * "to": { } + * } + * ], + * "container": [], + * "model": [], + * "view": [], + * "field": [] + * }, + * } + */ +{ + "modify": { + "view": [ + { + "from": {}, + "to": { + "viewOn": "" + } + } + ] + } +} From bb7ef1984330f964599a75e8c6d0e5d1fd5161e7 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Thu, 21 Nov 2024 10:30:20 +0200 Subject: [PATCH 3/5] HCK-8842: install lodash --- package-lock.json | 10 ++++++++-- package.json | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 933a006..15790d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,18 @@ { "name": "Synapse", - "version": "0.2.8", + "version": "0.2.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Synapse", - "version": "0.2.8", + "version": "0.2.12", "dependencies": { "@azure/msal-node": "2.9.2", "axios": "1.7.2", "base64url": "3.0.1", "crypto": "1.0.1", + "lodash": "4.17.21", "mssql": "11.0.0", "qs": "6.12.1", "randomstring": "1.3.0" @@ -3641,6 +3642,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", diff --git a/package.json b/package.json index a93b5d9..7178923 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "axios": "1.7.2", "base64url": "3.0.1", "crypto": "1.0.1", + "lodash": "4.17.21", "mssql": "11.0.0", "qs": "6.12.1", "randomstring": "1.3.0" @@ -72,4 +73,4 @@ "prettier": "3.2.5", "simple-git-hooks": "2.11.1" } -} \ No newline at end of file +} From 8ffb993d7bc21d795a2bb5bb12d736309ac87d7c Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Thu, 21 Nov 2024 10:31:37 +0200 Subject: [PATCH 4/5] HCK-8842: replace the use of lodash from packages --- forward_engineering/ddlProvider.js | 2 +- .../helpers/alterScriptHelpers/alterContainerHelper.js | 3 ++- .../helpers/alterScriptHelpers/alterEntityHelper.js | 3 ++- .../helpers/alterScriptHelpers/alterViewHelper.js | 3 ++- .../helpers/alterScriptHelpers/common.js | 4 ++-- forward_engineering/helpers/columnDefinitionHelper.js | 4 ++-- forward_engineering/helpers/constraintsHelper.js | 2 +- forward_engineering/helpers/general.js | 2 +- .../helpers/ifNotExistStatementHelper.js | 3 ++- forward_engineering/helpers/indexHelper.js | 2 +- forward_engineering/helpers/keyHelper.js | 3 ++- reverse_engineering/api.js | 10 +++++----- .../reverseEngineeringService.js | 9 +++++---- 13 files changed, 28 insertions(+), 22 deletions(-) diff --git a/forward_engineering/ddlProvider.js b/forward_engineering/ddlProvider.js index 85d550e..ed15542 100644 --- a/forward_engineering/ddlProvider.js +++ b/forward_engineering/ddlProvider.js @@ -1,3 +1,4 @@ +const _ = require('lodash'); const defaultTypes = require('./configs/defaultTypes'); const types = require('./configs/types'); const templates = require('./configs/templates'); @@ -5,7 +6,6 @@ const { commentIfDeactivated } = require('./helpers/commentIfDeactivated'); const { joinActivatedAndDeactivatedStatements } = require('./utils/joinActivatedAndDeactivatedStatements'); const provider = (baseProvider, options, app) => { - const _ = app.require('lodash'); const { getTerminator } = require('./helpers/optionsHelper'); const { assignTemplates } = app.require('@hackolade/ddl-fe-utils'); const { divideIntoActivatedAndDeactivated, clean, tab } = app.require('@hackolade/ddl-fe-utils').general; diff --git a/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js index 8d1ff5b..0425174 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js @@ -1,5 +1,6 @@ +const _ = require('lodash'); + module.exports = (app, options) => { - const _ = app.require('lodash'); const { getDbData } = app.require('@hackolade/ddl-fe-utils').general; const ddlProvider = require('../../ddlProvider')(null, options, app); diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index 6a748b7..d6718c3 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -1,5 +1,6 @@ +const _ = require('lodash'); + module.exports = (app, options) => { - const _ = app.require('lodash'); const { getEntityName } = app.require('@hackolade/ddl-fe-utils').general; const { createColumnDefinitionBySchema } = require('./createColumnDefinition')(_); const { getTableName } = require('../general')(app); diff --git a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js index cf37282..b766dd5 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js @@ -1,5 +1,6 @@ +const _ = require('lodash'); + module.exports = (app, options) => { - const _ = app.require('lodash'); const { mapProperties } = app.require('@hackolade/ddl-fe-utils'); const { checkCompModEqual } = require('./common')(app); const ddlProvider = require('../../ddlProvider')(null, options, app); diff --git a/forward_engineering/helpers/alterScriptHelpers/common.js b/forward_engineering/helpers/alterScriptHelpers/common.js index c1476cd..8e1d2af 100644 --- a/forward_engineering/helpers/alterScriptHelpers/common.js +++ b/forward_engineering/helpers/alterScriptHelpers/common.js @@ -1,6 +1,6 @@ -module.exports = app => { - const _ = app.require('lodash'); +const _ = require('lodash'); +module.exports = app => { const checkFieldPropertiesChanged = (compMod, propertiesToCheck) => { return propertiesToCheck.some(prop => compMod?.oldField[prop] !== compMod?.newField[prop]); }; diff --git a/forward_engineering/helpers/columnDefinitionHelper.js b/forward_engineering/helpers/columnDefinitionHelper.js index a6d481f..7e05713 100644 --- a/forward_engineering/helpers/columnDefinitionHelper.js +++ b/forward_engineering/helpers/columnDefinitionHelper.js @@ -1,6 +1,6 @@ -module.exports = app => { - const _ = app.require('lodash'); +const _ = require('lodash'); +module.exports = app => { const addLength = (type, length) => { return `${type}(${length})`; }; diff --git a/forward_engineering/helpers/constraintsHelper.js b/forward_engineering/helpers/constraintsHelper.js index 9bad8a9..ee84f84 100644 --- a/forward_engineering/helpers/constraintsHelper.js +++ b/forward_engineering/helpers/constraintsHelper.js @@ -1,7 +1,7 @@ +const _ = require('lodash'); const { commentIfDeactivated } = require('./commentIfDeactivated'); module.exports = app => { - const _ = app.require('lodash'); const { assignTemplates } = app.require('@hackolade/ddl-fe-utils'); const { checkAllKeysDeactivated, divideIntoActivatedAndDeactivated } = app.require('@hackolade/ddl-fe-utils').general; diff --git a/forward_engineering/helpers/general.js b/forward_engineering/helpers/general.js index 646ab09..bb48957 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -1,9 +1,9 @@ +const _ = require('lodash'); const { commentIfDeactivated } = require('./commentIfDeactivated'); const types = require('../configs/types'); const templates = require('../configs/templates'); module.exports = app => { - const _ = app.require('lodash'); const generalHasType = app.require('@hackolade/ddl-fe-utils').general.hasType; const { decorateDefault } = require('./columnDefinitionHelper')(app); const { checkAllKeysDeactivated } = app.require('@hackolade/ddl-fe-utils').general; diff --git a/forward_engineering/helpers/ifNotExistStatementHelper.js b/forward_engineering/helpers/ifNotExistStatementHelper.js index e255078..9b98bca 100644 --- a/forward_engineering/helpers/ifNotExistStatementHelper.js +++ b/forward_engineering/helpers/ifNotExistStatementHelper.js @@ -1,5 +1,6 @@ +const _ = require('lodash'); + module.exports = app => { - const _ = app.require('lodash'); const { assignTemplates } = app.require('@hackolade/ddl-fe-utils'); const { tab } = app.require('@hackolade/ddl-fe-utils').general; diff --git a/forward_engineering/helpers/indexHelper.js b/forward_engineering/helpers/indexHelper.js index d58f6d6..3a16636 100644 --- a/forward_engineering/helpers/indexHelper.js +++ b/forward_engineering/helpers/indexHelper.js @@ -1,8 +1,8 @@ +const _ = require('lodash'); const templates = require('../configs/templates'); const { commentIfDeactivated } = require('./commentIfDeactivated'); module.exports = app => { - const _ = app.require('lodash'); const { filterColumnStoreProperties, getTableName } = require('./general')(app); const { assignTemplates } = app.require('@hackolade/ddl-fe-utils'); const { divideIntoActivatedAndDeactivated, checkAllKeysDeactivated } = diff --git a/forward_engineering/helpers/keyHelper.js b/forward_engineering/helpers/keyHelper.js index 6fca170..2f3a44a 100644 --- a/forward_engineering/helpers/keyHelper.js +++ b/forward_engineering/helpers/keyHelper.js @@ -1,5 +1,6 @@ +const _ = require('lodash'); + module.exports = app => { - const _ = app.require('lodash'); const { clean } = app.require('@hackolade/ddl-fe-utils').general; const mapProperties = (jsonSchema, iteratee) => { diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 39aff5e..9324bec 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -1,4 +1,8 @@ 'use strict'; +const _ = require('lodash'); +const crypto = require('crypto'); +const randomstring = require('randomstring'); +const base64url = require('base64url'); const { getClient, setClient, clearClient, getConnectionInfo } = require('./connectionState'); const { getObjectsFromDatabase } = require('./databaseService/databaseService'); @@ -11,9 +15,6 @@ const { logInfo } = require('./helpers/logInfo'); const filterRelationships = require('./helpers/filterRelationships'); const getOptionsFromConnectionInfo = require('./helpers/getOptionsFromConnectionInfo'); const getAdditionalAccountInfo = require('./helpers/getAdditionalAccountInfo'); -const crypto = require('crypto'); -const randomstring = require('randomstring'); -const base64url = require('base64url'); const { prepareError } = require('./databaseService/helpers/errorService'); const { parseConnectionString } = require('./helpers/parseConnectionString'); @@ -108,7 +109,6 @@ module.exports = { async getDbCollectionsData(collectionsInfo, logger, callback, app) { try { - const _ = app.require('lodash'); logger.log('info', collectionsInfo, 'Retrieving schema', collectionsInfo.hiddenKeys); logger.progress({ message: 'Start reverse-engineering process', containerName: '', entityName: '' }); const { collections } = collectionsInfo.collectionData; @@ -138,7 +138,7 @@ module.exports = { ]); callback( null, - mergeCollectionsWithViews({ jsonSchemas, _ }), + mergeCollectionsWithViews({ jsonSchemas }), modelInfo, filterRelationships(relationships, jsonSchemas), ); diff --git a/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js b/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js index e7aa676..32218ea 100644 --- a/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js +++ b/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js @@ -1,3 +1,4 @@ +const { groupBy, partition, omit } = require('lodash'); const { getTableInfo, getTableRow, @@ -37,16 +38,16 @@ const { } = require('./helpers'); const pipe = require('../helpers/pipe'); -const mergeCollectionsWithViews = ({ jsonSchemas, _ }) => { - const [viewSchemas, collectionSchemas] = _.partition(jsonSchemas, jsonSchema => jsonSchema.relatedTables); - const groupedViewSchemas = _.groupBy(viewSchemas, 'dbName'); +const mergeCollectionsWithViews = ({ jsonSchemas }) => { + const [viewSchemas, collectionSchemas] = partition(jsonSchemas, jsonSchema => jsonSchema.relatedTables); + const groupedViewSchemas = groupBy(viewSchemas, 'dbName'); const combinedViewSchemas = Object.entries(groupedViewSchemas).map(([dbName, views]) => { return { dbName, entityLevel: {}, emptyBucket: false, bucketInfo: views[0].bucketInfo, - views: views.map(view => _.omit(view, ['relatedTables'])), + views: views.map(view => omit(view, ['relatedTables'])), }; }); From 78f0153f2ff56f4852e7d5cd33d3b694ae3364fd Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Thu, 21 Nov 2024 12:50:10 +0200 Subject: [PATCH 5/5] HCK-8842: refactor exports --- forward_engineering/ddlProvider.js | 9 +- .../alterScriptHelpers/alterEntityHelper.js | 4 +- .../alterScriptHelpers/alterViewHelper.js | 2 +- .../helpers/alterScriptHelpers/common.js | 152 ++++++------ .../createColumnDefinition.js | 185 +++++++------- .../helpers/columnDefinitionHelper.js | 228 +++++++++--------- forward_engineering/helpers/general.js | 2 +- 7 files changed, 291 insertions(+), 291 deletions(-) diff --git a/forward_engineering/ddlProvider.js b/forward_engineering/ddlProvider.js index ed15542..18b4c5d 100644 --- a/forward_engineering/ddlProvider.js +++ b/forward_engineering/ddlProvider.js @@ -13,8 +13,13 @@ const provider = (baseProvider, options, app) => { const { wrapIfNotExistSchema, wrapIfNotExistDatabase, wrapIfNotExistTable, wrapIfNotExistView } = require('./helpers/ifNotExistStatementHelper')(app); - const { decorateType, getIdentity, getEncryptedWith, decorateDefault, canHaveIdentity } = - require('./helpers/columnDefinitionHelper')(app); + const { + decorateType, + getIdentity, + getEncryptedWith, + decorateDefault, + canHaveIdentity, + } = require('./helpers/columnDefinitionHelper'); const { getMemoryOptimizedIndexes, createMemoryOptimizedIndex, hydrateTableIndex, createTableIndex } = require('./helpers/indexHelper')(app); diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index d6718c3..36b130d 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -2,11 +2,11 @@ const _ = require('lodash'); module.exports = (app, options) => { const { getEntityName } = app.require('@hackolade/ddl-fe-utils').general; - const { createColumnDefinitionBySchema } = require('./createColumnDefinition')(_); + const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); const { getTableName } = require('../general')(app); const ddlProvider = require('../../ddlProvider')(null, options, app); const { generateIdToNameHashTable, generateIdToActivatedHashTable } = app.require('@hackolade/ddl-fe-utils'); - const { checkFieldPropertiesChanged, modifyGroupItems, setIndexKeys } = require('./common')(app); + const { checkFieldPropertiesChanged, modifyGroupItems, setIndexKeys } = require('./common'); const getAddCollectionScript = collection => { const schemaName = collection.compMod.keyspaceName; diff --git a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js index b766dd5..2826e1a 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js @@ -2,7 +2,7 @@ const _ = require('lodash'); module.exports = (app, options) => { const { mapProperties } = app.require('@hackolade/ddl-fe-utils'); - const { checkCompModEqual } = require('./common')(app); + const { checkCompModEqual } = require('./common'); const ddlProvider = require('../../ddlProvider')(null, options, app); const { getTableName } = require('../general')(app); diff --git a/forward_engineering/helpers/alterScriptHelpers/common.js b/forward_engineering/helpers/alterScriptHelpers/common.js index 8e1d2af..dd303e9 100644 --- a/forward_engineering/helpers/alterScriptHelpers/common.js +++ b/forward_engineering/helpers/alterScriptHelpers/common.js @@ -1,93 +1,91 @@ -const _ = require('lodash'); +const { isEqual } = require('lodash'); -module.exports = app => { - const checkFieldPropertiesChanged = (compMod, propertiesToCheck) => { - return propertiesToCheck.some(prop => compMod?.oldField[prop] !== compMod?.newField[prop]); - }; +const checkFieldPropertiesChanged = (compMod, propertiesToCheck) => { + return propertiesToCheck.some(prop => compMod?.oldField[prop] !== compMod?.newField[prop]); +}; - const modifyGroupItems = ({ data, key, hydrate, drop, create }) => { - const compMod = getCompMod(data); - const parentName = data.code || data.name || data.collectionName; +const modifyGroupItems = ({ data, key, hydrate, drop, create }) => { + const compMod = getCompMod(data); + const parentName = data.code || data.name || data.collectionName; - const { removed, added, modified } = getModifiedGroupItems(compMod[key] || {}, hydrate); + const { removed, added, modified } = getModifiedGroupItems(compMod[key] || {}, hydrate); - const removedScripts = removed.map(item => drop(parentName, item)); - const addedScripts = added.map(item => create(parentName, item)); - const modifiedScripts = modified.map(item => create(parentName, { ...item, orReplace: true })); + const removedScripts = removed.map(item => drop(parentName, item)); + const addedScripts = added.map(item => create(parentName, item)); + const modifiedScripts = modified.map(item => create(parentName, { ...item, orReplace: true })); - return [].concat(modifiedScripts).concat(removedScripts).concat(addedScripts).filter(Boolean).join('\n\n'); - }; + return [].concat(modifiedScripts).concat(removedScripts).concat(addedScripts).filter(Boolean).join('\n\n'); +}; - const getModifiedGroupItems = ({ new: newItems = [], old: oldItems = [] }, hydrate) => { - const oldHydrated = oldItems.map(hydrate).filter(Boolean); - const newHydrated = newItems.map(hydrate).filter(Boolean); - - const { removed, added, modified } = oldHydrated.reduce( - (accumulator, oldItem) => { - const newItem = newHydrated.find(item => item.name === oldItem.name); - const itemsAreNotEqual = !isGroupItemsEqual(newItem, oldItem); - - if (!newItem) { - return { - removed: [...accumulator.removed, oldItem], - modified: accumulator.modified, - added: accumulator.added, - }; - } - - if (itemsAreNotEqual) { - return { - removed: accumulator.removed, - modified: [...accumulator.modified, newItem], - added: accumulator.added, - }; - } - - return accumulator; - }, - { - removed: [], - modified: [], - added: newHydrated.filter(newItem => !oldHydrated.some(item => item.name === newItem.name)), - }, - ); - - return { removed, added, modified }; - }; +const getModifiedGroupItems = ({ new: newItems = [], old: oldItems = [] }, hydrate) => { + const oldHydrated = oldItems.map(hydrate).filter(Boolean); + const newHydrated = newItems.map(hydrate).filter(Boolean); + + const { removed, added, modified } = oldHydrated.reduce( + (accumulator, oldItem) => { + const newItem = newHydrated.find(item => item.name === oldItem.name); + const itemsAreNotEqual = !isGroupItemsEqual(newItem, oldItem); + + if (!newItem) { + return { + removed: [...accumulator.removed, oldItem], + modified: accumulator.modified, + added: accumulator.added, + }; + } + + if (itemsAreNotEqual) { + return { + removed: accumulator.removed, + modified: [...accumulator.modified, newItem], + added: accumulator.added, + }; + } + + return accumulator; + }, + { + removed: [], + modified: [], + added: newHydrated.filter(newItem => !oldHydrated.some(item => item.name === newItem.name)), + }, + ); + + return { removed, added, modified }; +}; - const isGroupItemsEqual = (leftItem, rightItem) => _.isEqual(leftItem, rightItem); +const isGroupItemsEqual = (leftItem, rightItem) => isEqual(leftItem, rightItem); - const getCompMod = containerData => containerData.role?.compMod ?? {}; +const getCompMod = containerData => containerData.role?.compMod ?? {}; - const checkCompModEqual = ({ new: newItem, old: oldItem } = {}) => _.isEqual(newItem, oldItem); +const checkCompModEqual = ({ new: newItem, old: oldItem } = {}) => isEqual(newItem, oldItem); - const setIndexKeys = (idToNameHashTable, idToActivatedHashTable, index) => { - return { - ...index, - indxKey: - index.indxKey?.map(key => ({ - ...key, - name: idToNameHashTable[key.keyId], - isActivated: idToActivatedHashTable[key.keyId], - })) || [], - indxInclude: index.indxInclude?.map(key => ({ - ...key, - name: idToNameHashTable[key.keyId], - isActivated: idToActivatedHashTable[key.keyId], - })), - indxIncludedColumn: index.indxIncludedColumn?.map(key => ({ +const setIndexKeys = (idToNameHashTable, idToActivatedHashTable, index) => { + return { + ...index, + indxKey: + index.indxKey?.map(key => ({ ...key, name: idToNameHashTable[key.keyId], isActivated: idToActivatedHashTable[key.keyId], - })), - }; + })) || [], + indxInclude: index.indxInclude?.map(key => ({ + ...key, + name: idToNameHashTable[key.keyId], + isActivated: idToActivatedHashTable[key.keyId], + })), + indxIncludedColumn: index.indxIncludedColumn?.map(key => ({ + ...key, + name: idToNameHashTable[key.keyId], + isActivated: idToActivatedHashTable[key.keyId], + })), }; +}; - return { - checkFieldPropertiesChanged, - getCompMod, - modifyGroupItems, - checkCompModEqual, - setIndexKeys, - }; +module.exports = { + checkFieldPropertiesChanged, + getCompMod, + modifyGroupItems, + checkCompModEqual, + setIndexKeys, }; diff --git a/forward_engineering/helpers/alterScriptHelpers/createColumnDefinition.js b/forward_engineering/helpers/alterScriptHelpers/createColumnDefinition.js index ff206e4..b731478 100644 --- a/forward_engineering/helpers/alterScriptHelpers/createColumnDefinition.js +++ b/forward_engineering/helpers/alterScriptHelpers/createColumnDefinition.js @@ -1,107 +1,106 @@ -module.exports = _ => { - const createColumnDefinition = data => { - return Object.assign( - { - name: '', - type: '', - nullable: true, - primaryKey: false, - default: '', - length: '', - scale: '', - precision: '', - hasMaxLength: false, - }, - data, - ); - }; +const { isBoolean, isNumber } = require('lodash'); - const isNullable = (parentSchema, propertyName) => { - if (!Array.isArray(parentSchema.required)) { - return true; - } +const createColumnDefinition = data => { + return Object.assign( + { + name: '', + type: '', + nullable: true, + primaryKey: false, + default: '', + length: '', + scale: '', + precision: '', + hasMaxLength: false, + }, + data, + ); +}; - return !parentSchema.required.includes(propertyName); - }; +const isNullable = (parentSchema, propertyName) => { + if (!Array.isArray(parentSchema.required)) { + return true; + } - const getDefault = jsonSchema => { - const defaultValue = jsonSchema.default; + return !parentSchema.required.includes(propertyName); +}; - if (_.isBoolean(defaultValue)) { - return defaultValue; - } else if (jsonSchema.default === null) { - return 'NULL'; - } else { - return defaultValue; - } - }; +const getDefault = jsonSchema => { + const defaultValue = jsonSchema.default; - const getLength = jsonSchema => { - if (_.isNumber(jsonSchema.length)) { - return jsonSchema.length; - } else if (_.isNumber(jsonSchema.maxLength)) { - return jsonSchema.maxLength; - } else { - return ''; - } - }; + if (isBoolean(defaultValue)) { + return defaultValue; + } else if (jsonSchema.default === null) { + return 'NULL'; + } else { + return defaultValue; + } +}; - const getScale = jsonSchema => { - if (_.isNumber(jsonSchema.scale)) { - return jsonSchema.scale; - } else { - return ''; - } - }; +const getLength = jsonSchema => { + if (isNumber(jsonSchema.length)) { + return jsonSchema.length; + } else if (isNumber(jsonSchema.maxLength)) { + return jsonSchema.maxLength; + } else { + return ''; + } +}; - const getPrecision = jsonSchema => { - if (_.isNumber(jsonSchema.precision)) { - return jsonSchema.precision; - } else if (_.isNumber(jsonSchema.fractSecPrecision)) { - return jsonSchema.fractSecPrecision; - } else { - return ''; - } - }; +const getScale = jsonSchema => { + if (isNumber(jsonSchema.scale)) { + return jsonSchema.scale; + } else { + return ''; + } +}; - const hasMaxLength = jsonSchema => { - if (jsonSchema.hasMaxLength) { - return jsonSchema.hasMaxLength; - } else { - return ''; - } - }; +const getPrecision = jsonSchema => { + if (isNumber(jsonSchema.precision)) { + return jsonSchema.precision; + } else if (isNumber(jsonSchema.fractSecPrecision)) { + return jsonSchema.fractSecPrecision; + } else { + return ''; + } +}; - const getType = jsonSchema => { - if (jsonSchema.$ref) { - return jsonSchema.$ref.split('/').pop(); - } +const hasMaxLength = jsonSchema => { + if (jsonSchema.hasMaxLength) { + return jsonSchema.hasMaxLength; + } else { + return ''; + } +}; - return jsonSchema.mode || jsonSchema.childType || jsonSchema.type; - }; +const getType = jsonSchema => { + if (jsonSchema.$ref) { + return jsonSchema.$ref.split('/').pop(); + } - const createColumnDefinitionBySchema = ({ name, jsonSchema, parentJsonSchema, ddlProvider, schemaData }) => { - const columnDefinition = createColumnDefinition({ - name: name, - type: getType(jsonSchema), - nullable: isNullable(parentJsonSchema, name), - default: getDefault(jsonSchema), - primaryKey: jsonSchema.primaryKey, - length: getLength(jsonSchema), - scale: getScale(jsonSchema), - precision: getPrecision(jsonSchema), - hasMaxLength: hasMaxLength(jsonSchema), - isActivated: jsonSchema.isActivated, - }); + return jsonSchema.mode || jsonSchema.childType || jsonSchema.type; +}; - return ddlProvider.hydrateColumn({ - columnDefinition, - jsonSchema, - schemaData, - }); - }; +const createColumnDefinitionBySchema = ({ name, jsonSchema, parentJsonSchema, ddlProvider, schemaData }) => { + const columnDefinition = createColumnDefinition({ + name: name, + type: getType(jsonSchema), + nullable: isNullable(parentJsonSchema, name), + default: getDefault(jsonSchema), + primaryKey: jsonSchema.primaryKey, + length: getLength(jsonSchema), + scale: getScale(jsonSchema), + precision: getPrecision(jsonSchema), + hasMaxLength: hasMaxLength(jsonSchema), + isActivated: jsonSchema.isActivated, + }); - return { - createColumnDefinitionBySchema, - }; + return ddlProvider.hydrateColumn({ + columnDefinition, + jsonSchema, + schemaData, + }); +}; +module.exports = { + createColumnDefinitionBySchema, }; diff --git a/forward_engineering/helpers/columnDefinitionHelper.js b/forward_engineering/helpers/columnDefinitionHelper.js index 7e05713..0840775 100644 --- a/forward_engineering/helpers/columnDefinitionHelper.js +++ b/forward_engineering/helpers/columnDefinitionHelper.js @@ -1,128 +1,126 @@ const _ = require('lodash'); -module.exports = app => { - const addLength = (type, length) => { - return `${type}(${length})`; - }; - - const addMaxLength = type => { - return `${type}(MAX)`; - }; - - const addScalePrecision = (type, precision, scale) => { - if (_.isNumber(scale)) { - return `${type}(${precision},${scale})`; - } else { - return `${type}(${precision})`; - } - }; - - const addPrecision = (type, precision) => { +const addLength = (type, length) => { + return `${type}(${length})`; +}; + +const addMaxLength = type => { + return `${type}(MAX)`; +}; + +const addScalePrecision = (type, precision, scale) => { + if (_.isNumber(scale)) { + return `${type}(${precision},${scale})`; + } else { return `${type}(${precision})`; - }; + } +}; - const addXmlProperties = (type, constraint, schemaCollection) => { - if (!schemaCollection) { - return type; - } +const addPrecision = (type, precision) => { + return `${type}(${precision})`; +}; - if (constraint) { - return `${type}(${constraint} ${schemaCollection})`; - } +const addXmlProperties = (type, constraint, schemaCollection) => { + if (!schemaCollection) { + return type; + } - return `${type}(${schemaCollection})`; - }; + if (constraint) { + return `${type}(${constraint} ${schemaCollection})`; + } - const canHaveLength = type => ['CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR', 'BINARY', 'VARBINARY'].includes(type); + return `${type}(${schemaCollection})`; +}; - const canHaveMax = type => ['VARCHAR', 'NVARCHAR', 'VARBINARY'].includes(type); +const canHaveLength = type => ['CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR', 'BINARY', 'VARBINARY'].includes(type); - const canHavePrecision = type => ['DECIMAL', 'NUMERIC', 'DATETIME2', 'DATETIMEOFFSET', 'TIME'].includes(type); +const canHaveMax = type => ['VARCHAR', 'NVARCHAR', 'VARBINARY'].includes(type); - const canHaveScale = type => ['DECIMAL', 'NUMERIC'].includes(type); +const canHavePrecision = type => ['DECIMAL', 'NUMERIC', 'DATETIME2', 'DATETIMEOFFSET', 'TIME'].includes(type); - const decorateType = (type, columnDefinition) => { - if (canHaveMax(type) && columnDefinition.hasMaxLength) { - return addMaxLength(type); - } else if (canHaveLength(type) && _.isNumber(columnDefinition.length)) { - return addLength(type, columnDefinition.length); - } else if (canHavePrecision(type) && canHaveScale(type) && _.isNumber(columnDefinition.precision)) { - return addScalePrecision(type, columnDefinition.precision, columnDefinition.scale); - } else if (canHavePrecision(type) && _.isNumber(columnDefinition.precision)) { - return addPrecision(type, columnDefinition.precision); - } else if (type === 'XML') { - return addXmlProperties(type, columnDefinition.xmlConstraint, columnDefinition.xmlSchemaCollection); - } +const canHaveScale = type => ['DECIMAL', 'NUMERIC'].includes(type); - return type; - }; - - const isString = type => ['CHAR', 'VARCHAR', 'NCHAR', 'NVARCHAR', 'TEXT', 'NTEXT'].includes(_.toUpper(type)); - - const escapeQuotes = str => _.trim(str).replace(/(\')+/g, "'$1"); - - const decorateDefault = (type, defaultValue) => { - if (isString(type) && defaultValue !== 'NULL') { - return `'${escapeQuotes(defaultValue)}'`; - } else if (type === 'XML') { - return `CAST(N'${defaultValue}' AS xml)`; - } else { - return defaultValue; - } - }; - - const getIdentity = identity => { - if (!identity.seed || !identity.increment) { - return ''; - } else { - return ` IDENTITY(${identity.seed}, ${identity.increment})`; - } - }; - - const addClustered = (statement, columnDefinition) => { - if (!columnDefinition.primaryKey && !columnDefinition.unique) { - return ''; - } - - if (!columnDefinition.clustered) { - return statement + ' NONCLUSTERED'; - } else { - return statement + ' CLUSTERED'; - } - }; - - const getEncryptedWith = encryption => { - return ( - ' ENCRYPTED WITH (\n' + - '\t\tCOLUMN_ENCRYPTION_KEY=' + - encryption.key + - ',\n' + - '\t\tENCRYPTION_TYPE=' + - encryption.type + - ',\n' + - "\t\tALGORITHM='" + - encryption.algorithm + - "'\n" + - '\t)' - ); - }; - - /** - * - * @param {string} type - * @returns {boolean} - */ - const canHaveIdentity = type => { - const typesAllowedToHaveAutoIncrement = ['tinyint', 'smallint', 'int', 'bigint']; - return typesAllowedToHaveAutoIncrement.includes(type); - }; - - return { - decorateType, - decorateDefault, - getIdentity, - getEncryptedWith, - addClustered, - canHaveIdentity, - }; +const decorateType = (type, columnDefinition) => { + if (canHaveMax(type) && columnDefinition.hasMaxLength) { + return addMaxLength(type); + } else if (canHaveLength(type) && _.isNumber(columnDefinition.length)) { + return addLength(type, columnDefinition.length); + } else if (canHavePrecision(type) && canHaveScale(type) && _.isNumber(columnDefinition.precision)) { + return addScalePrecision(type, columnDefinition.precision, columnDefinition.scale); + } else if (canHavePrecision(type) && _.isNumber(columnDefinition.precision)) { + return addPrecision(type, columnDefinition.precision); + } else if (type === 'XML') { + return addXmlProperties(type, columnDefinition.xmlConstraint, columnDefinition.xmlSchemaCollection); + } + + return type; +}; + +const isString = type => ['CHAR', 'VARCHAR', 'NCHAR', 'NVARCHAR', 'TEXT', 'NTEXT'].includes(_.toUpper(type)); + +const escapeQuotes = str => _.trim(str).replace(/(\')+/g, "'$1"); + +const decorateDefault = (type, defaultValue) => { + if (isString(type) && defaultValue !== 'NULL') { + return `'${escapeQuotes(defaultValue)}'`; + } else if (type === 'XML') { + return `CAST(N'${defaultValue}' AS xml)`; + } else { + return defaultValue; + } +}; + +const getIdentity = identity => { + if (!identity.seed || !identity.increment) { + return ''; + } else { + return ` IDENTITY(${identity.seed}, ${identity.increment})`; + } +}; + +const addClustered = (statement, columnDefinition) => { + if (!columnDefinition.primaryKey && !columnDefinition.unique) { + return ''; + } + + if (!columnDefinition.clustered) { + return statement + ' NONCLUSTERED'; + } else { + return statement + ' CLUSTERED'; + } +}; + +const getEncryptedWith = encryption => { + return ( + ' ENCRYPTED WITH (\n' + + '\t\tCOLUMN_ENCRYPTION_KEY=' + + encryption.key + + ',\n' + + '\t\tENCRYPTION_TYPE=' + + encryption.type + + ',\n' + + "\t\tALGORITHM='" + + encryption.algorithm + + "'\n" + + '\t)' + ); +}; + +/** + * + * @param {string} type + * @returns {boolean} + */ +const canHaveIdentity = type => { + const typesAllowedToHaveAutoIncrement = ['tinyint', 'smallint', 'int', 'bigint']; + return typesAllowedToHaveAutoIncrement.includes(type); +}; + +module.exports = { + decorateType, + decorateDefault, + getIdentity, + getEncryptedWith, + addClustered, + canHaveIdentity, }; diff --git a/forward_engineering/helpers/general.js b/forward_engineering/helpers/general.js index bb48957..e34ec4f 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -5,7 +5,7 @@ const templates = require('../configs/templates'); module.exports = app => { const generalHasType = app.require('@hackolade/ddl-fe-utils').general.hasType; - const { decorateDefault } = require('./columnDefinitionHelper')(app); + const { decorateDefault } = require('./columnDefinitionHelper'); const { checkAllKeysDeactivated } = app.require('@hackolade/ddl-fe-utils').general; const { assignTemplates } = app.require('@hackolade/ddl-fe-utils');