From addf2c8552796ad464c667d6357a904463273655 Mon Sep 17 00:00:00 2001 From: Alik Rakhmonov Date: Wed, 10 Dec 2025 14:17:30 +0100 Subject: [PATCH 1/5] HCK-13867: Script generation options for PK --- forward_engineering/config.json | 57 ++- .../generateContainerScript.js | 12 +- forward_engineering/generateScript.js | 5 +- .../helpers/alterScriptFromDeltaHelper.js | 41 +- .../alterScriptHelpers/alterEntityHelper.js | 14 +- .../alterScriptHelpers/config/templates.js | 5 + .../alterScriptHelpers/primaryKeyHelper.js | 162 ++++++++ .../helpers/alterScriptHelpers/provider.js | 3 + .../helpers/constraintHelper.js | 5 + forward_engineering/helpers/generalHelper.js | 10 +- forward_engineering/helpers/tableHelper.js | 36 +- forward_engineering/isDropInStatements.js | 6 +- .../entity_level/entityLevelConfig.json | 20 + .../field_level/fieldLevelConfig.json | 350 +++++++++++++++++- 14 files changed, 642 insertions(+), 84 deletions(-) create mode 100644 forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js diff --git a/forward_engineering/config.json b/forward_engineering/config.json index 911c041..105cb94 100644 --- a/forward_engineering/config.json +++ b/forward_engineering/config.json @@ -27,5 +27,60 @@ "compMode": { "entity": true, "container": true - } + }, + "scriptGenerationOptions": [ + { + "keyword": "primaryKeys", + "label": "FE_SCRIPT_GENERATION_OPTIONS___PRIMARY_KEYS", + "disabled": false, + "value": { + "inline": { + "default": true, + "disabled": false, + "disabledLabel": "" + }, + "separate": { + "default": false, + "disabled": false, + "disabledLabel": "" + }, + "ignore": { + "default": false, + "disabled": false, + "disabledLabel": "" + } + }, + "adapters": [ + { + "dependency": { + "key": "primaryKey", + "valueType": "array" + }, + "defaultValue": { + "primaryKey": [] + } + }, + { + "dependency": { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": true + }, + { + "key": "compositePrimaryKey", + "value": true + } + ] + }, + "defaultValue": { + "primaryKey": false, + "compositePrimaryKey": false, + "required": false + } + } + ] + } + ] } diff --git a/forward_engineering/generateContainerScript.js b/forward_engineering/generateContainerScript.js index b3d76f0..5b05891 100644 --- a/forward_engineering/generateContainerScript.js +++ b/forward_engineering/generateContainerScript.js @@ -10,6 +10,7 @@ const { buildScript } = require('./helpers/buildScript'); const { parseEntities } = require('./helpers/parseEntities'); const { getForeignKeys } = require('./helpers/foreignKeyHelper'); const { getWorkloadManagementStatements } = require('./helpers/getWorkloadManagementStatements'); +const { getIsPkOrFkConstraintAvailable } = require('./helpers/constraintHelper'); const generateContainerScript = (data, logger, callback, app) => { try { @@ -25,7 +26,7 @@ const generateContainerScript = (data, logger, callback, app) => { ); const relatedSchemas = parseEntities(data.relatedEntities ?? [], data.relatedSchemas); const areColumnConstraintsAvailable = data.modelData[0].dbVersion.startsWith('3'); - const areForeignPrimaryKeyConstraintsAvailable = !data.modelData[0].dbVersion.startsWith('1'); + const isPkOrFkConstraintAvailable = getIsPkOrFkConstraintAvailable(data); const needMinify = _.get(data, 'options.additionalOptions', []).find(option => option.id === 'minify')?.value; if (data.isUpdateScript) { @@ -68,17 +69,12 @@ const generateContainerScript = (data, logger, callback, app) => { ]; return result.concat([ - getTableStatement( - ...args, - null, - areColumnConstraintsAvailable, - areForeignPrimaryKeyConstraintsAvailable, - ), + getTableStatement(...args, null, areColumnConstraintsAvailable, isPkOrFkConstraintAvailable), getIndexes(...args, areColumnConstraintsAvailable), ]); }, []); - const foreignKeys = getForeignKeys(data, foreignKeyHashTable, areForeignPrimaryKeyConstraintsAvailable); + const foreignKeys = getForeignKeys(data, foreignKeyHashTable, isPkOrFkConstraintAvailable); callback( null, diff --git a/forward_engineering/generateScript.js b/forward_engineering/generateScript.js index 78f7ed1..31dc68d 100644 --- a/forward_engineering/generateScript.js +++ b/forward_engineering/generateScript.js @@ -5,6 +5,7 @@ const { getDatabaseStatement } = require('./helpers/databaseHelper'); const { getTableStatement } = require('./helpers/tableHelper'); const { getIndexes } = require('./helpers/indexHelper'); const { buildScript } = require('./helpers/buildScript'); +const { getIsPkOrFkConstraintAvailable } = require('./helpers/constraintHelper'); const generateScript = (data, logger, callback, app) => { try { @@ -15,7 +16,7 @@ const generateScript = (data, logger, callback, app) => { const containerData = data.containerData; const entityData = data.entityData; const areColumnConstraintsAvailable = data.modelData[0].dbVersion.startsWith('3'); - const areForeignPrimaryKeyConstraintsAvailable = !data.modelData[0].dbVersion.startsWith('1'); + const isPkOrFkConstraintAvailable = getIsPkOrFkConstraintAvailable(data); const needMinify = _.get(data, 'options.additionalOptions', []).find(option => option.id === 'minify')?.value; if (data.isUpdateScript) { @@ -36,7 +37,7 @@ const generateScript = (data, logger, callback, app) => { [modelDefinitions, internalDefinitions, externalDefinitions], null, areColumnConstraintsAvailable, - areForeignPrimaryKeyConstraintsAvailable, + isPkOrFkConstraintAvailable, ), getIndexes( containerData, diff --git a/forward_engineering/helpers/alterScriptFromDeltaHelper.js b/forward_engineering/helpers/alterScriptFromDeltaHelper.js index 7b7681c..b117e17 100644 --- a/forward_engineering/helpers/alterScriptFromDeltaHelper.js +++ b/forward_engineering/helpers/alterScriptFromDeltaHelper.js @@ -38,35 +38,30 @@ const getAlterContainersScripts = (schema, provider) => { }; }; -const getAlterCollectionsScripts = (schema, definitions, provider) => { - const getCollectionScripts = (items, compMode, getScript) => - items.filter(item => item.compMod?.[compMode]).flatMap(getScript); - +const getAlterCollectionsScripts = (schema, definitions, provider, data) => { const getColumnScripts = (items, getScript) => items.filter(item => item.properties).flatMap(getScript); - const addedCollectionsScripts = getCollectionScripts( - getItems(schema, 'entities', 'added'), - 'created', - getAddCollectionsScripts(definitions), - ); - const deletedCollectionsScripts = getCollectionScripts( - getItems(schema, 'entities', 'deleted'), - 'deleted', - getDeleteCollectionsScripts(provider), - ); - const modifiedCollectionsScripts = getCollectionScripts( - getItems(schema, 'entities', 'modified'), - 'modified', - getModifyCollectionsScripts(definitions, provider), + const addedCollectionsItems = getItems(schema, 'entities', 'added'); + const deletedCollectionsItems = getItems(schema, 'entities', 'deleted'); + const modifiedCollectionsItems = getItems(schema, 'entities', 'modified'); + + const addedCollectionsScripts = addedCollectionsItems + .filter(item => item.compMod?.created) + .flatMap(getAddCollectionsScripts(definitions, data)); + const deletedCollectionsScripts = deletedCollectionsItems + .filter(item => item.compMod?.deleted) + .flatMap(getDeleteCollectionsScripts(provider)); + const modifiedCollectionsScripts = modifiedCollectionsItems.flatMap( + getModifyCollectionsScripts(definitions, provider, data), ); - const addedColumnsItems = getItems(schema, 'entities', 'added').filter(item => !item.compMod.created); - const addedColumnsScripts = getColumnScripts(addedColumnsItems, getAddColumnsScripts(definitions, provider)); + const addedColumnsItems = addedCollectionsItems.filter(item => !item.compMod?.created); + const deletedColumnsItems = deletedCollectionsItems.filter(item => !item.compMod?.deleted); - const deletedColumnsItems = getItems(schema, 'entities', 'deleted').filter(item => !item.compMod.deleted); + const addedColumnsScripts = getColumnScripts(addedColumnsItems, getAddColumnsScripts(definitions, provider)); const deletedColumnsScripts = getColumnScripts(deletedColumnsItems, getDeleteColumnsScripts(definitions, provider)); const modifiedColumnsScripts = getColumnScripts( - getItems(schema, 'entities', 'modified'), + modifiedCollectionsItems, getModifyColumnsScripts(definitions, provider), ); @@ -115,7 +110,7 @@ const getAlterScript = (schema, definitions, data, app, needMinify, sqlFormatter const provider = require('./alterScriptHelpers/provider')(app); let scripts = { ...getAlterContainersScripts(schema, provider), - ...getAlterCollectionsScripts(schema, definitions, provider), + ...getAlterCollectionsScripts(schema, definitions, provider, data), ...getAlterViewsScripts(schema, provider), }; diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index c0d4282..daa2ade 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -15,6 +15,8 @@ const { } = require('./generalHelper'); const { hydrateKeys } = require('./tableKeysHelper'); const { replaceSpaceWithUnderscore } = require('../generalHelper'); +const { getModifyPkConstraintsScripts } = require('./primaryKeyHelper'); +const { getIsPkOrFkConstraintAvailable } = require('../constraintHelper'); const tableProperties = [ 'compositePartitionKey', @@ -136,11 +138,12 @@ const generateModifyCollectionScript = (entity, definitions, provider) => { return { type: 'modified', script: provider.alterTable(hydratedAlterTable) }; }; -const getAddCollectionsScripts = definitions => entity => { +const getAddCollectionsScripts = (definitions, data) => entity => { const properties = getEntityProperties(entity); const indexes = _.get(entity, 'role.SecIndxs', []); const hydratedCollection = hydrateCollection(entity, definitions); - const collectionScript = getTableStatement(...hydratedCollection, null, true); + const isPkOrFkConstraintAvailable = getIsPkOrFkConstraintAvailable(data); + const collectionScript = getTableStatement(...hydratedCollection, null, true, isPkOrFkConstraintAvailable); const indexScript = getIndexes(...hydrateAddIndexes(entity, indexes, properties, definitions)); return prepareScript(collectionScript, indexScript); @@ -155,14 +158,17 @@ const getDeleteCollectionsScripts = provider => entity => { return prepareScript(...indexScript, collectionScript); }; -const getModifyCollectionsScripts = (definitions, provider) => entity => { +const getModifyCollectionsScripts = (definitions, provider, data) => entity => { const properties = getEntityProperties(entity); const { script } = generateModifyCollectionScript(entity, definitions, provider); const { hydratedAddIndexes, hydratedDropIndexes } = hydrateIndex(entity, properties, definitions); const dropIndexScript = provider.dropTableIndex(hydratedDropIndexes); const addIndexScript = getIndexes(...hydratedAddIndexes); + const modifyPKConstraintScripts = getIsPkOrFkConstraintAvailable(data) + ? getModifyPkConstraintsScripts({ collection: entity, provider }) + : []; - return prepareScript(...dropIndexScript, ...script, addIndexScript); + return prepareScript(...dropIndexScript, ...script, addIndexScript, ...modifyPKConstraintScripts); }; const getAddColumnsScripts = (definitions, provider) => entity => { diff --git a/forward_engineering/helpers/alterScriptHelpers/config/templates.js b/forward_engineering/helpers/alterScriptHelpers/config/templates.js index 19bdb6e..281f777 100644 --- a/forward_engineering/helpers/alterScriptHelpers/config/templates.js +++ b/forward_engineering/helpers/alterScriptHelpers/config/templates.js @@ -50,4 +50,9 @@ module.exports = { dropSkewByStoredAsDirection: 'ALTER TABLE ${name} NOT STORED AS DIRECTORIES;', setTableLocation: 'ALTER TABLE ${name} SET LOCATION "${location}";', + + addPkConstraint: + 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${columnNames}) DISABLE${noValidate}${rely};', + + dropPkConstraint: 'ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName};', }; diff --git a/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js b/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js new file mode 100644 index 0000000..96a9389 --- /dev/null +++ b/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js @@ -0,0 +1,162 @@ +const _ = require('lodash'); +const { replaceSpaceWithUnderscore, getName, prepareName, commentDeactivatedStatements } = require('../generalHelper'); +const templates = require('./config/templates'); + +const getEntityNameFromCollection = collection => { + const entityData = collection?.role || {}; + return replaceSpaceWithUnderscore(getName(entityData)); +}; + +const getDefaultPkConstraintName = collection => { + return getEntityNameFromCollection(collection) + '_pk'; +}; + +const getPropertyNameByGuid = (collection, guid) => { + const property = _.toPairs(collection?.role?.properties).find(([name, jsonSchema]) => jsonSchema.GUID === guid); + return property?.[0] && prepareName(property[0]); +}; + +const getPropertiesNamesByGUIDs = (collection, guids) => { + return guids.map(guid => getPropertyNameByGuid(collection, guid)).filter(Boolean); +}; + +const didCompositePkChange = collection => { + const pkDto = collection?.role?.compMod?.primaryKey || {}; + const newPrimaryKeys = pkDto.new || []; + const oldPrimaryKeys = pkDto.old || []; + if (newPrimaryKeys.length !== oldPrimaryKeys.length) { + return true; + } + if (newPrimaryKeys.length === 0 && oldPrimaryKeys.length === 0) { + return false; + } + + return !_.isEmpty(_.differenceWith(oldPrimaryKeys, newPrimaryKeys, _.isEqual)); +}; + +const getDropCompositePkScripts = ({ collection, provider }) => { + const didPkChange = didCompositePkChange(collection); + + if (!didPkChange) { + return []; + } + + const tableName = getEntityNameFromCollection(collection); + const pkDto = collection?.role?.compMod?.primaryKey || {}; + const oldPrimaryKeys = pkDto.old || []; + + return oldPrimaryKeys.map(oldPk => { + const pkConstraintName = oldPk.constraintName || getDefaultPkConstraintName(collection); + const constraintName = prepareName(pkConstraintName); + + return provider.assignTemplates(templates.dropPkConstraint, { + tableName, + constraintName, + }); + }); +}; + +const getAddCompositePkScripts = ({ collection, provider }) => { + const didPkChange = didCompositePkChange(collection); + + if (!didPkChange) { + return []; + } + + const tableName = getEntityNameFromCollection(collection); + const pkDto = collection?.role?.compMod?.primaryKey || {}; + const newPrimaryKeys = pkDto.new || []; + + return newPrimaryKeys.map(newPk => { + const compositePrimaryKey = newPk.compositePrimaryKey || []; + const guidsOfColumnsInPk = compositePrimaryKey.map(compositePkEntry => compositePkEntry.keyId); + const columnNames = getPropertiesNamesByGUIDs(collection, guidsOfColumnsInPk); + const pkConstraintName = newPk.constraintName || getDefaultPkConstraintName(collection); + const constraintName = prepareName(pkConstraintName); + const noValidate = newPk.noValidateSpecification ? ` ${newPk.noValidateSpecification}` : ''; + const rely = newPk.rely ? ` ${newPk.rely}` : ''; + + return provider.assignTemplates(templates.addPkConstraint, { + tableName, + constraintName, + columnNames, + noValidate, + rely, + }); + }); +}; + +const getModifyCompositePkScripts = ({ collection, provider }) => { + const dropCompositePkScripts = getDropCompositePkScripts({ collection, provider }); + const addCompositePkScripts = getAddCompositePkScripts({ collection, provider }); + + return [...dropCompositePkScripts, ...addCompositePkScripts]; +}; + +const getDropPkScripts = ({ collection, provider }) => { + const tableName = getEntityNameFromCollection(collection); + const constraintName = getDefaultPkConstraintName(collection); + + return _.toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + const oldName = jsonSchema.compMod.oldField.name; + const oldJsonSchema = collection.role.properties[oldName]; + const wasTheFieldARegularPrimaryKey = oldJsonSchema?.primaryKey && !oldJsonSchema?.compositePrimaryKey; + + const isNotAPrimaryKey = !jsonSchema.primaryKey && !jsonSchema.compositePrimaryKey; + return wasTheFieldARegularPrimaryKey && isNotAPrimaryKey; + }) + .map(([name, jsonSchema]) => { + return provider.assignTemplates(templates.dropPkConstraint, { + tableName, + constraintName, + }); + }); +}; + +const getAddPkScripts = ({ collection, provider }) => { + const tableName = getEntityNameFromCollection(collection); + const constraintName = getDefaultPkConstraintName(collection); + + return _.toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + const isRegularPrimaryKey = jsonSchema.primaryKey && !jsonSchema.compositePrimaryKey; + const oldName = jsonSchema.compMod.oldField.name; + const wasTheFieldAPrimaryKey = Boolean(collection.role.properties[oldName]?.primaryKey); + return isRegularPrimaryKey && !wasTheFieldAPrimaryKey; + }) + .map(([name, jsonSchema]) => { + const columnNames = [prepareName(name)]; + const noValidate = jsonSchema.noValidateSpecification ? ` ${jsonSchema.noValidateSpecification}` : ''; + const rely = jsonSchema.rely ? ` ${jsonSchema.rely}` : ''; + + return provider.assignTemplates(templates.addPkConstraint, { + tableName, + constraintName, + columnNames, + noValidate, + rely, + }); + }); +}; + +const getModifyPkScripts = ({ collection, provider }) => { + const dropPkScripts = getDropPkScripts({ collection, provider }); + const addPkScripts = getAddPkScripts({ collection, provider }); + + return [...dropPkScripts, ...addPkScripts]; +}; + +const getModifyPkConstraintsScripts = ({ collection, provider }) => { + const modifyCompositePkScripts = getModifyCompositePkScripts({ collection, provider }); + const modifyPkScripts = getModifyPkScripts({ collection, provider }); + const isActivated = collection.role.isActivated; + + return [...modifyCompositePkScripts, ...modifyPkScripts].map(statement => + commentDeactivatedStatements(statement, isActivated), + ); +}; + +module.exports = { + getModifyPkConstraintsScripts, +}; diff --git a/forward_engineering/helpers/alterScriptHelpers/provider.js b/forward_engineering/helpers/alterScriptHelpers/provider.js index 8849341..40d97fc 100644 --- a/forward_engineering/helpers/alterScriptHelpers/provider.js +++ b/forward_engineering/helpers/alterScriptHelpers/provider.js @@ -3,6 +3,9 @@ const templates = require('./config/templates'); module.exports = app => { const { assignTemplates } = app.require('@hackolade/ddl-fe-utils'); return { + assignTemplates(...args) { + return assignTemplates(...args); + }, dropView({ name, isMaterialized }) { const dropTemplate = isMaterialized ? templates.dropMaterializedView : templates.dropView; return assignTemplates(dropTemplate, { name }); diff --git a/forward_engineering/helpers/constraintHelper.js b/forward_engineering/helpers/constraintHelper.js index bc55545..9605a91 100644 --- a/forward_engineering/helpers/constraintHelper.js +++ b/forward_engineering/helpers/constraintHelper.js @@ -190,6 +190,10 @@ const getColumnConstraints = ({ columnDefinition, jsonSchema }) => { return [primaryKeyConstraint, uniqueKeyConstraint, checkConstraint].filter(Boolean); }; +const getIsPkOrFkConstraintAvailable = data => { + return !data?.modelData?.[0]?.dbVersion?.startsWith('1'); +}; + module.exports = { getConstraintOpts, getUniqueKeyStatement, @@ -197,4 +201,5 @@ module.exports = { getCompositeUniqueKeys, getCompositePrimaryKeys, getColumnConstraints, + getIsPkOrFkConstraintAvailable, }; diff --git a/forward_engineering/helpers/generalHelper.js b/forward_engineering/helpers/generalHelper.js index dd142a1..dea2e64 100644 --- a/forward_engineering/helpers/generalHelper.js +++ b/forward_engineering/helpers/generalHelper.js @@ -51,7 +51,15 @@ const prepareName = (name = '') => { const replaceSpaceWithUnderscore = (name = '') => { return name.replace(/\s/g, '_'); }; -const getName = entity => entity.code || entity.collectionName || entity.name || ''; +const getName = entity => + entity.compMod?.code?.new || + entity.code || + entity.compMod?.collectionName?.new || + entity.collectionName || + entity.compMod?.name?.new || + entity.name || + ''; + const getTab = (tabNum, configData) => (Array.isArray(configData) ? configData[tabNum] || {} : {}); const indentString = (str, tab = 4) => (str || '') diff --git a/forward_engineering/helpers/tableHelper.js b/forward_engineering/helpers/tableHelper.js index 6129684..7f9a344 100644 --- a/forward_engineering/helpers/tableHelper.js +++ b/forward_engineering/helpers/tableHelper.js @@ -71,34 +71,30 @@ const getCreateStatement = ({ )(true, ';')(); }; -const getPrimaryKeyStatement = ( - jsonSchema, - keysNames, - deactivatedColumnNames, - isParentItemActivated, - areColumnConstraintsAvailable, -) => { - const getStatement = (keys, constraintOptsStatement) => `PRIMARY KEY (${keys})${constraintOptsStatement}`; +const getPrimaryKeyStatement = (jsonSchema, keysNames, deactivatedColumnNames, isParentItemActivated) => { const options = (jsonSchema.primaryKey || [])[0] || {}; - const { rely, noValidateSpecification } = options; + const { rely, noValidateSpecification, constraintName } = options; const constraintOptsStatement = constraintHelper.getConstraintOpts({ - noValidateSpecification: areColumnConstraintsAvailable ? noValidateSpecification : 'NOVALIDATE', + noValidateSpecification, rely, enableSpecification: 'DISABLE', }); + const constraintNameStatement = constraintName ? `CONSTRAINT ${constraintName} ` : ''; + + const getStatement = keys => `${constraintNameStatement}PRIMARY KEY (${keys})${constraintOptsStatement}`; if (!Array.isArray(keysNames) || !keysNames.length) { return ''; } if (!isParentItemActivated) { - return getStatement(keysNames.join(', '), constraintOptsStatement); + return getStatement(keysNames.join(', ')); } const { isAllKeysDeactivated, keysString } = commentDeactivatedInlineKeys(keysNames, deactivatedColumnNames); if (isAllKeysDeactivated) { - return '-- ' + getStatement(keysString, constraintOptsStatement); + return '-- ' + getStatement(keysString); } - return getStatement(keysString, constraintOptsStatement); + return getStatement(keysString); }; const getClusteringKeys = (clusteredKeys, deactivatedColumnNames, isParentItemActivated) => { @@ -244,7 +240,7 @@ const getTableStatement = ( definitions, foreignKeyStatement, areColumnConstraintsAvailable, - areForeignPrimaryKeyConstraintsAvailable, + isPkOrFkConstraintAvailable, ) => { const dbName = replaceSpaceWithUnderscore(getName(getTab(0, containerData))); const tableData = getTab(0, entityData); @@ -264,20 +260,14 @@ const getTableStatement = ( removePartitions(columns, keyNames.compositePartitionKey), isTableActivated, ), - primaryKeyStatement: areForeignPrimaryKeyConstraintsAvailable - ? getPrimaryKeyStatement( - jsonSchema, - keyNames.primaryKeys, - deactivatedColumnNames, - isTableActivated, - areColumnConstraintsAvailable, - ) + primaryKeyStatement: isPkOrFkConstraintAvailable + ? getPrimaryKeyStatement(jsonSchema, keyNames.primaryKeys, deactivatedColumnNames, isTableActivated) : null, uniqueKeyStatement: areColumnConstraintsAvailable ? constraintHelper.getUniqueKeyStatement(jsonSchema, deactivatedColumnNames, isTableActivated) : null, checkStatement: areColumnConstraintsAvailable ? constraintHelper.getCheckConstraint(jsonSchema) : null, - foreignKeyStatement: areForeignPrimaryKeyConstraintsAvailable ? foreignKeyStatement : null, + foreignKeyStatement: isPkOrFkConstraintAvailable ? foreignKeyStatement : null, comment: tableData.description, partitionedByKeys: getPartitionKeyStatement(getPartitionsKeys(columns, keyNames.compositePartitionKey)), clusteredKeys: getClusteringKeys(keyNames.compositeClusteringKey, deactivatedColumnNames, isTableActivated), diff --git a/forward_engineering/isDropInStatements.js b/forward_engineering/isDropInStatements.js index c60f64c..57dd5c5 100644 --- a/forward_engineering/isDropInStatements.js +++ b/forward_engineering/isDropInStatements.js @@ -1,3 +1,5 @@ +const { generateContainerScript } = require('./generateContainerScript'); +const { generateScript } = require('./generateScript'); const { DROP_STATEMENTS } = require('./helpers/constants'); const isDropInStatements = (data, logger, cb, app) => { @@ -10,9 +12,9 @@ const isDropInStatements = (data, logger, cb, app) => { }; if (data.level === 'container') { - this.generateContainerScript(data, logger, callback, app); + generateContainerScript(data, logger, callback, app); } else if (data.level === 'entity') { - this.generateScript(data, logger, callback, app); + generateScript(data, logger, callback, app); } } catch (e) { cb({ message: e.message, stack: e.stack }); diff --git a/properties_pane/entity_level/entityLevelConfig.json b/properties_pane/entity_level/entityLevelConfig.json index dff6193..54d170a 100644 --- a/properties_pane/entity_level/entityLevelConfig.json +++ b/properties_pane/entity_level/entityLevelConfig.json @@ -507,6 +507,26 @@ making sure that you maintain a proper JSON format. } ], "structure": [ + { + "propertyName": "Constraint name", + "propertyKeyword": "constraintName", + "propertyTooltip": "", + "propertyType": "text", + "shouldValidate": false, + "validation": { + "required": false + }, + "dependency": { + "type": "not", + "values": [ + { + "level": "model", + "key": "dbVersion", + "value": "1.x" + } + ] + } + }, { "propertyName": "Key", "propertyKeyword": "compositePrimaryKey", diff --git a/properties_pane/field_level/fieldLevelConfig.json b/properties_pane/field_level/fieldLevelConfig.json index e9d2091..28ce3f2 100644 --- a/properties_pane/field_level/fieldLevelConfig.json +++ b/properties_pane/field_level/fieldLevelConfig.json @@ -357,8 +357,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -912,8 +943,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -1238,8 +1300,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -1639,8 +1732,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -2156,8 +2280,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -2673,8 +2828,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -3189,8 +3375,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -3703,8 +3920,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -4194,8 +4442,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", @@ -4643,8 +4922,39 @@ making sure that you maintain a proper JSON format. "type": "or", "values": [ { - "key": "required", - "value": true + "type": "and", + "values": [ + { + "key": "required", + "value": true + }, + { + "type": "or", + "values": [ + { + "key": "primaryKey", + "value": false + }, + { + "key": "primaryKey", + "exist": false + } + ] + }, + { + "type": "or", + "values": [ + { + "key": "compositePrimaryKey", + "value": false + }, + { + "key": "compositePrimaryKey", + "exist": false + } + ] + } + ] }, { "type": "and", From 868c3e94936d84d66339111ea6c3a9c312c6b2f0 Mon Sep 17 00:00:00 2001 From: Alik Date: Thu, 11 Dec 2025 16:06:43 +0100 Subject: [PATCH 2/5] HCK-13874: script generation options for comments (#126) * HCK-13874: script generation options for comments * fix * fix: var name --- forward_engineering/config.json | 163 ++++++++++++++++++ .../alterContainerHelper.js | 51 +++++- .../alterScriptHelpers/alterEntityHelper.js | 23 ++- .../alterScriptHelpers/alterViewHelper.js | 53 +++++- .../helpers/alterScriptHelpers/common.js | 22 ++- .../alterScriptHelpers/config/templates.js | 8 +- .../helpers/alterScriptHelpers/provider.js | 28 ++- localization/en.json | 3 +- 8 files changed, 320 insertions(+), 31 deletions(-) diff --git a/forward_engineering/config.json b/forward_engineering/config.json index 105cb94..12f7a7f 100644 --- a/forward_engineering/config.json +++ b/forward_engineering/config.json @@ -81,6 +81,169 @@ } } ] + }, + { + "keyword": "schemaComments", + "label": "FE_SCRIPT_GENERATION_OPTIONS___SCHEMA_COMMENTS", + "disabled": false, + "value": { + "inline": { + "default": true, + "disabled": false, + "disabledLabel": "" + }, + "separate": { + "default": false, + "disabled": false, + "disabledLabel": "" + }, + "ignore": { + "default": false, + "disabled": false, + "disabledLabel": "" + } + }, + "adapters": [ + { + "dependency": { + "key": "type", + "value": "bucket" + }, + "defaultValue": { + "description": "" + } + } + ] + }, + { + "keyword": "tableComments", + "label": "FE_SCRIPT_GENERATION_OPTIONS___TABLE_COMMENTS", + "disabled": false, + "value": { + "inline": { + "default": true, + "disabled": false, + "disabledLabel": "" + }, + "separate": { + "default": false, + "disabled": false, + "disabledLabel": "" + }, + "ignore": { + "default": false, + "disabled": false, + "disabledLabel": "" + } + }, + "adapters": [ + { + "dependency": { + "type": "and", + "values": [ + { + "key": "collectionName", + "exist": true + }, + { + "key": "description", + "exist": true + } + ] + }, + "defaultValue": { + "description": "" + } + } + ] + }, + { + "keyword": "viewComments", + "label": "FE_SCRIPT_GENERATION_OPTIONS___VIEW_COMMENTS", + "disabled": false, + "value": { + "inline": { + "default": true, + "disabled": false, + "disabledLabel": "" + }, + "separate": { + "default": false, + "disabled": false, + "disabledLabel": "" + }, + "ignore": { + "default": false, + "disabled": false, + "disabledLabel": "" + } + }, + "adapters": [ + { + "dependency": { + "key": "viewOn", + "exist": true + }, + "defaultValue": { + "description": "" + } + } + ] + }, + { + "keyword": "columnComments", + "label": "FE_SCRIPT_GENERATION_OPTIONS___COLUMN_COMMENTS", + "disabled": false, + "value": { + "inline": { + "default": true, + "disabled": false, + "disabledLabel": "" + }, + "separate": { + "default": false, + "disabled": false, + "disabledLabel": "" + }, + "ignore": { + "default": false, + "disabled": false, + "disabledLabel": "" + } + }, + "adapters": [ + { + "dependency": { + "type": "and", + "values": [ + { + "type": "not", + "values": [ + { + "key": "type", + "value": "bucket" + } + ] + }, + { + "key": "collectionName", + "exist": false + }, + { + "key": "viewOn", + "exist": false + }, + { + "key": "description", + "exist": true + } + ] + }, + "defaultValue": { + "description": "" + } + } + ] } ] } diff --git a/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js index cdbdbc3..b7ec5b7 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js @@ -1,5 +1,6 @@ const _ = require('lodash'); const { getDatabaseStatement } = require('../databaseHelper'); +const templates = require('./config/templates'); const hydrateDrop = container => { const { role } = container; @@ -17,6 +18,53 @@ const getDeleteContainerScript = provider => container => { return provider.dropDatabase(hydratedDrop); }; +const getModifyContainerPropertiesScripts = ({ provider, container }) => { + const compMod = container.role?.compMod || {}; + const containerName = compMod.code?.new || compMod.name?.new; + const containerProperties = ['description']; + + const { addProperties, dropProperties } = containerProperties.reduce( + (acc, property) => { + const oldPropValue = compMod[property]?.old; + const newPropValue = compMod[property]?.new; + + if (_.isEqual(oldPropValue, newPropValue)) { + return acc; + } + + let propName = property; + + if (property === 'description') { + propName = 'comment'; + } + + if (newPropValue) { + acc.addProperties.push(`'${propName}'='${newPropValue}'`); + } else { + acc.dropProperties.push(`'${propName}'`); + } + + return acc; + }, + { addProperties: [], dropProperties: [] }, + ); + + const addScript = addProperties.length + ? provider.assignTemplates(templates.setContainerProperties, { + name: containerName, + properties: addProperties.join(', '), + }) + : ''; + const dropScript = dropProperties.length + ? provider.assignTemplates(templates.unsetContainerProperties, { + name: containerName, + properties: dropProperties.join(', '), + }) + : ''; + + return [dropScript, addScript].filter(Boolean); +}; + const getModifyContainerScript = provider => container => { const compMod = _.get(container, 'role.compMod', {}); const getName = type => compMod.code?.[type] || compMod.name?.[type]; @@ -25,7 +73,8 @@ const getModifyContainerScript = provider => container => { old: getName('old'), }; if (name.new === name.old) { - return []; + const modifyContainerPropertiesScripts = getModifyContainerPropertiesScripts({ provider, container }); + return modifyContainerPropertiesScripts.length ? modifyContainerPropertiesScripts : []; } const hydratedDrop = hydrateDrop({ role: { ...(container?.role || {}), name: name.old } }); const deletedScript = provider.dropDatabase(hydratedDrop); diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index daa2ade..8f7e304 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -79,16 +79,31 @@ const hydrateAlterTable = (collection, fullCollectionName, definition) => { }; }; -const hydrateAlterColumnName = (entity, definitions, properties = {}) => { +const hydrateAlterColumns = (entity, definitions, properties = {}) => { const collectionName = generateFullEntityName(entity); const columns = Object.values(properties).map(property => { const compMod = _.get(property, 'compMod', {}); const { newField = {}, oldField = {} } = compMod; + const newType = getTypeByProperty(definitions)({ ...property, ...newField }); const oldType = getTypeByProperty(definitions)({ ...property, ...oldField }); + const oldName = oldField.name; const newName = newField.name; - return oldName !== newName || newType !== oldType ? { type: newType, oldName, newName } : null; + + const newComment = property.description || ''; + const oldComment = entity.role.properties[oldName]?.description || ''; + + const isCommentChanged = newComment !== oldComment; + const isColumnChanged = oldName !== newName || newType !== oldType || isCommentChanged; + + const column = isColumnChanged ? { type: newType, oldName, newName, comment: newComment } : null; + + if (column && isCommentChanged) { + return { ...column, comment: newComment }; + } + + return column; }); return { collectionName, columns: columns.filter(Boolean) }; }; @@ -206,8 +221,8 @@ const getDeleteColumnsScripts = (definitions, provider) => entity => { const getModifyColumnsScripts = (definitions, provider) => entity => { const properties = _.get(entity, 'properties', {}); - const hydratedAlterColumnName = hydrateAlterColumnName(entity, definitions, properties); - const alterColumnScripts = provider.alterTableColumnName(hydratedAlterColumnName); + const hydratedAlterColumns = hydrateAlterColumns(entity, definitions, properties); + const alterColumnScripts = provider.alterTableColumns(hydratedAlterColumns); const { hydratedAddIndexes, hydratedDropIndexes } = hydrateIndex(entity, properties, definitions); const dropIndexScript = provider.dropTableIndex(hydratedDropIndexes); const addIndexScript = getIndexes(...hydratedAddIndexes); diff --git a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js index c11e4e6..3625be4 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js @@ -7,6 +7,7 @@ const { generateFullEntityName, getEntityName, } = require('./generalHelper'); +const templates = require('./config/templates'); const viewProperties = ['tableProperties', 'viewTemporary', 'viewOrReplace', 'isGlobal', 'description', 'name', 'code']; @@ -66,15 +67,65 @@ const getDeleteViewsScripts = provider => view => { return provider.dropView({ name, isMaterialized }); }; +const getModifyViewPropertiesScripts = ({ provider, view }) => { + const compMod = view.role?.compMod || {}; + const { newName: viewName } = getEntityName(compMod, 'name'); + const viewProperties = ['description']; + + const { addProperties, dropProperties } = viewProperties.reduce( + (acc, property) => { + const oldPropValue = compMod[property]?.old; + const newPropValue = compMod[property]?.new; + + if (_.isEqual(oldPropValue, newPropValue)) { + return acc; + } + + let propName = property; + + if (property === 'description') { + propName = 'comment'; + } + + if (newPropValue) { + acc.addProperties.push(`'${propName}'='${newPropValue}'`); + } else { + acc.dropProperties.push(`'${propName}'`); + } + + return acc; + }, + { addProperties: [], dropProperties: [] }, + ); + + const addScript = addProperties.length + ? provider.assignTemplates(templates.setViewProperties, { + name: viewName, + properties: addProperties.join(', '), + }) + : ''; + const dropScript = dropProperties.length + ? provider.assignTemplates(templates.unsetViewProperties, { + name: viewName, + properties: dropProperties.join(', '), + }) + : ''; + + return [dropScript, addScript].filter(Boolean); +}; + const getModifyViewsScripts = provider => view => { const compMod = view.role?.compMod || {}; const viewName = getEntityName(compMod, 'name'); + if (viewName.newName === viewName.oldName) { - return; + const modifyViewPropertiesScripts = getModifyViewPropertiesScripts({ provider, view }); + return modifyViewPropertiesScripts.length ? modifyViewPropertiesScripts : []; } const dropViewScript = getDeleteViewsScripts(provider)(hydrateAlterView(view, viewName.oldName)); const hydratedView = hydrateView(hydrateAlterView(view, viewName.newName)); const addViewScript = getViewScript(hydratedView); + return [dropViewScript, addViewScript]; }; diff --git a/forward_engineering/helpers/alterScriptHelpers/common.js b/forward_engineering/helpers/alterScriptHelpers/common.js index a3bb099..8aea8d3 100644 --- a/forward_engineering/helpers/alterScriptHelpers/common.js +++ b/forward_engineering/helpers/alterScriptHelpers/common.js @@ -8,26 +8,34 @@ const getDifferentItems = (newItems = [], oldItems = []) => { }; }; -const hydrateTableProperties = ({ new: newItems, old: oldItems }, name, comment) => { +const hydrateTableProperties = ({ new: newItems, old: oldItems }, name, commentState) => { const hydrateProperties = properties => (properties || '').split(',').map(prop => prop.trim()); const prepareProperties = properties => properties .filter(Boolean) - .map(property => property.replace(/(\S+)=(\S+)/, `'$1'='$2'`)) + .map(property => property.replace(/(\S+)=((\S|\s)+)/, `'$1'='$2'`)) .join(',\n'); - const commentNew = comment?.new && !_.isEqual(comment?.new, comment?.old) && comment.new; + + const isCommentChanged = !_.isEqual(commentState?.new, commentState?.old); + const addCommentProp = isCommentChanged && commentState?.new ? `comment=${commentState?.new}` : ''; + const dropCommentProp = isCommentChanged && !commentState?.new ? `comment` : ''; + const preparePropertiesName = properties => properties - .map(prop => prop.replace(/(=\S+)/, '')) - .map(property => `'${property}'`) + .filter(Boolean) + .map(prop => `'${prop.replace(/(=\S+)/, '')}'`) .join(', '); + const newHydrateItems = hydrateProperties(newItems); const oldHydrateItems = hydrateProperties(oldItems); + const { add, drop } = getDifferentItems(newHydrateItems, oldHydrateItems); + const dataProperties = { - add: prepareProperties([...add, commentNew]), - drop: preparePropertiesName(drop), + add: prepareProperties([...add, addCommentProp]), + drop: preparePropertiesName([...drop, dropCommentProp]), }; + return { dataProperties, name }; }; diff --git a/forward_engineering/helpers/alterScriptHelpers/config/templates.js b/forward_engineering/helpers/alterScriptHelpers/config/templates.js index 281f777..051095d 100644 --- a/forward_engineering/helpers/alterScriptHelpers/config/templates.js +++ b/forward_engineering/helpers/alterScriptHelpers/config/templates.js @@ -22,12 +22,14 @@ module.exports = { alterTableColumnName: 'ALTER TABLE ${collectionName} CHANGE ${oldName} ${newName} ${type};', alterTableColumnNameWithComment: - 'ALTER TABLE ${collectionName} CHANGE ${oldName} ${newName} ${type} COMMENT "${comment}";', + "ALTER TABLE ${collectionName} CHANGE ${oldName} ${newName} ${type} COMMENT '${comment}';", addTableColumns: 'ALTER TABLE ${name} ADD COLUMNS (${columns});', setTableProperties: 'ALTER TABLE ${name} SET TBLPROPERTIES (${properties});', + unsetTableProperties: 'ALTER TABLE ${name} UNSET TBLPROPERTIES IF EXISTS (${properties});', + alterSerDeProperties: 'ALTER TABLE ${name} SET SERDE ${serDe} WITH SERDEPROPERTIES (${properties});', alterSerDePropertiesOnlySerDe: 'ALTER TABLE ${name} SET SERDE ${serDe};', @@ -55,4 +57,8 @@ module.exports = { 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${columnNames}) DISABLE${noValidate}${rely};', dropPkConstraint: 'ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName};', + + setContainerProperties: 'ALTER DATABASE ${name} SET DBPROPERTIES (${properties});', + + unsetContainerProperties: 'ALTER DATABASE ${name} UNSET DBPROPERTIES IF EXISTS (${properties});', }; diff --git a/forward_engineering/helpers/alterScriptHelpers/provider.js b/forward_engineering/helpers/alterScriptHelpers/provider.js index 40d97fc..f37bb16 100644 --- a/forward_engineering/helpers/alterScriptHelpers/provider.js +++ b/forward_engineering/helpers/alterScriptHelpers/provider.js @@ -24,7 +24,7 @@ module.exports = app => { alterTable(data) { const { alterTableName, tableProperties, serDeProperties, keys } = data; let script = [this.alterTableName(alterTableName || {})]; - script = script.concat(this.alterTableProperties(tableProperties || {})); + script = script.concat(...this.alterTableProperties(tableProperties || {})); script = script.concat(this.alterSerDeProperties(serDeProperties || {})); script = script.concat(this.alterTableKeys(keys || {})); script = script.concat(this.alterTableSkewedBy(keys || {})); @@ -35,7 +35,7 @@ module.exports = app => { return !oldName || !newName ? '' : assignTemplates(templates.alterTableName, { oldName, newName }); }, - alterTableColumnName({ collectionName, columns } = {}) { + alterTableColumns({ collectionName, columns } = {}) { if (!collectionName) { return []; } @@ -43,7 +43,7 @@ module.exports = app => { if (!oldName && !newName && !type) { return ''; } - return comment + return typeof comment === 'string' ? assignTemplates(templates.alterTableColumnNameWithComment, { collectionName, oldName, @@ -58,12 +58,17 @@ module.exports = app => { alterTableProperties({ dataProperties, name }) { if (!name) { - return ''; + return []; } - const { add: addProperties = '' } = dataProperties; - return addProperties.length - ? assignTemplates(templates.setTableProperties, { name, properties: addProperties }) + const { add = '', drop = '' } = dataProperties; + const addScript = add.length + ? assignTemplates(templates.setTableProperties, { name, properties: add }) + : ''; + const dropScript = drop.length + ? assignTemplates(templates.unsetTableProperties, { name, properties: drop }) : ''; + + return [addScript, dropScript].filter(Boolean); }, setTableProperties({ name, properties } = {}) { @@ -101,15 +106,6 @@ module.exports = app => { return script; }, - alterView({ dataProperties, name }) { - const { add: properties = '' } = dataProperties || {}; - if (!name) { - return ''; - } - - return properties.length ? assignTemplates(templates.setViewProperties, { name, properties }) : ''; - }, - alterTableKeys(data) { const { compositeClusteringKey: keys, sortedByKey, intoBuckets } = data.clusteringKeyData; const name = data?.name; diff --git a/localization/en.json b/localization/en.json index d3b00ac..6f0802c 100644 --- a/localization/en.json +++ b/localization/en.json @@ -160,5 +160,6 @@ "MODAL_WINDOW___OPTIONS_DISPLAY_ERD_V_ENTITY_BOX_CONTENT": "Display of table box content", "MODAL_WINDOW___OPTIONS_DISPLAY_ERD_V_FIELDS": "Columns", "MODAL_WINDOW___OPTIONS_DISPLAY_REQUIRED_ATTRIBUTES": "Required columns", - "MODAL_WINDOW___OPTIONS_DISPLAY_NULLABLE_ATTRIBUTES": "Nullable columns" + "MODAL_WINDOW___OPTIONS_DISPLAY_NULLABLE_ATTRIBUTES": "Nullable columns", + "FE_SCRIPT_GENERATION_OPTIONS___SCHEMA_COMMENTS": "Database comments" } From ff8749f81b588fe29af526a0d98158eead3414e2 Mon Sep 17 00:00:00 2001 From: Alik Date: Fri, 12 Dec 2025 10:37:09 +0100 Subject: [PATCH 3/5] HCK-13870: script generation options for UK (#127) * HCK-13870: script generation options for UK * fix version * fix * fix --- forward_engineering/config.json | 65 +++++++ .../alterScriptHelpers/alterEntityHelper.js | 14 +- .../alterScriptHelpers/config/templates.js | 5 +- .../alterScriptHelpers/primaryKeyHelper.js | 4 +- .../alterScriptHelpers/uniqueKeyHelper.js | 162 ++++++++++++++++++ .../helpers/constraintHelper.js | 9 + 6 files changed, 254 insertions(+), 5 deletions(-) create mode 100644 forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js diff --git a/forward_engineering/config.json b/forward_engineering/config.json index 12f7a7f..4e0207c 100644 --- a/forward_engineering/config.json +++ b/forward_engineering/config.json @@ -82,6 +82,71 @@ } ] }, + { + "keyword": "uniqueConstraints", + "label": "FE_SCRIPT_GENERATION_OPTIONS___UNIQUE_KEYS", + "disabled": false, + "value": { + "inline": { + "default": true, + "disabled": false, + "disabledLabel": "" + }, + "separate": { + "default": false, + "disabled": false, + "disabledLabel": "" + }, + "ignore": { + "default": false, + "disabled": false, + "disabledLabel": "" + } + }, + "adapters": [ + { + "dependency": { + "key": "uniqueKey", + "valueType": "array" + }, + "defaultValue": { + "uniqueKey": [] + } + }, + { + "dependency": { + "key": "uniqueKey", + "valueType": "object" + }, + "defaultValue": { + "uniqueKey": {} + } + }, + { + "dependency": { + "type": "or", + "values": [ + { + "key": "unique", + "value": true + }, + { + "key": "compositeUniqueKey", + "value": true + }, + { + "key": "compMode", + "exist": true + } + ] + }, + "defaultValue": { + "unique": false, + "compositeUniqueKey": false + } + } + ] + }, { "keyword": "schemaComments", "label": "FE_SCRIPT_GENERATION_OPTIONS___SCHEMA_COMMENTS", diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index 8f7e304..4c9146d 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -16,7 +16,8 @@ const { const { hydrateKeys } = require('./tableKeysHelper'); const { replaceSpaceWithUnderscore } = require('../generalHelper'); const { getModifyPkConstraintsScripts } = require('./primaryKeyHelper'); -const { getIsPkOrFkConstraintAvailable } = require('../constraintHelper'); +const { getIsPkOrFkConstraintAvailable, getIsConstraintAvailable } = require('../constraintHelper'); +const { getModifyUkConstraintsScripts } = require('./uniqueKeyHelper'); const tableProperties = [ 'compositePartitionKey', @@ -182,8 +183,17 @@ const getModifyCollectionsScripts = (definitions, provider, data) => entity => { const modifyPKConstraintScripts = getIsPkOrFkConstraintAvailable(data) ? getModifyPkConstraintsScripts({ collection: entity, provider }) : []; + const modifyUKConstraintScripts = getIsConstraintAvailable(data) + ? getModifyUkConstraintsScripts({ collection: entity, provider }) + : []; - return prepareScript(...dropIndexScript, ...script, addIndexScript, ...modifyPKConstraintScripts); + return prepareScript( + ...dropIndexScript, + ...script, + addIndexScript, + ...modifyPKConstraintScripts, + ...modifyUKConstraintScripts, + ); }; const getAddColumnsScripts = (definitions, provider) => entity => { diff --git a/forward_engineering/helpers/alterScriptHelpers/config/templates.js b/forward_engineering/helpers/alterScriptHelpers/config/templates.js index 051095d..8c6ce0e 100644 --- a/forward_engineering/helpers/alterScriptHelpers/config/templates.js +++ b/forward_engineering/helpers/alterScriptHelpers/config/templates.js @@ -56,9 +56,12 @@ module.exports = { addPkConstraint: 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${columnNames}) DISABLE${noValidate}${rely};', - dropPkConstraint: 'ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName};', + dropConstraint: 'ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName};', setContainerProperties: 'ALTER DATABASE ${name} SET DBPROPERTIES (${properties});', unsetContainerProperties: 'ALTER DATABASE ${name} UNSET DBPROPERTIES IF EXISTS (${properties});', + + addUkConstraint: + 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} UNIQUE (${columnNames}) DISABLE${noValidate}${rely};', }; diff --git a/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js b/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js index 96a9389..5e14c1f 100644 --- a/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js @@ -49,7 +49,7 @@ const getDropCompositePkScripts = ({ collection, provider }) => { const pkConstraintName = oldPk.constraintName || getDefaultPkConstraintName(collection); const constraintName = prepareName(pkConstraintName); - return provider.assignTemplates(templates.dropPkConstraint, { + return provider.assignTemplates(templates.dropConstraint, { tableName, constraintName, }); @@ -107,7 +107,7 @@ const getDropPkScripts = ({ collection, provider }) => { return wasTheFieldARegularPrimaryKey && isNotAPrimaryKey; }) .map(([name, jsonSchema]) => { - return provider.assignTemplates(templates.dropPkConstraint, { + return provider.assignTemplates(templates.dropConstraint, { tableName, constraintName, }); diff --git a/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js b/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js new file mode 100644 index 0000000..42691c8 --- /dev/null +++ b/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js @@ -0,0 +1,162 @@ +const _ = require('lodash'); +const { replaceSpaceWithUnderscore, getName, prepareName, commentDeactivatedStatements } = require('../generalHelper'); +const templates = require('./config/templates'); + +const getEntityNameFromCollection = collection => { + const entityData = collection?.role || {}; + return replaceSpaceWithUnderscore(getName(entityData)); +}; + +const getDefaultUkConstraintName = collection => { + return getEntityNameFromCollection(collection) + '_uk'; +}; + +const getPropertyNameByGuid = (collection, guid) => { + const property = _.toPairs(collection?.role?.properties).find(([name, jsonSchema]) => jsonSchema.GUID === guid); + return property?.[0] && prepareName(property[0]); +}; + +const getPropertiesNamesByGUIDs = (collection, guids) => { + return guids.map(guid => getPropertyNameByGuid(collection, guid)).filter(Boolean); +}; + +const didCompositeUkChange = collection => { + const pkDto = collection?.role?.compMod?.uniqueKey || {}; + const newUniqueKeys = pkDto.new || []; + const oldUniqueKeys = pkDto.old || []; + if (newUniqueKeys.length !== oldUniqueKeys.length) { + return true; + } + if (newUniqueKeys.length === 0 && oldUniqueKeys.length === 0) { + return false; + } + + return !_.isEmpty(_.differenceWith(oldUniqueKeys, newUniqueKeys, _.isEqual)); +}; + +const getDropCompositeUkScripts = ({ collection, provider }) => { + const didUkChange = didCompositeUkChange(collection); + + if (!didUkChange) { + return []; + } + + const tableName = getEntityNameFromCollection(collection); + const pkDto = collection?.role?.compMod?.uniqueKey || {}; + const oldUniqueKeys = pkDto.old || []; + + return oldUniqueKeys.map(oldUk => { + const pkConstraintName = oldUk.constraintName || getDefaultUkConstraintName(collection); + const constraintName = prepareName(pkConstraintName); + + return provider.assignTemplates(templates.dropConstraint, { + tableName, + constraintName, + }); + }); +}; + +const getAddCompositeUkScripts = ({ collection, provider }) => { + const didUkChange = didCompositeUkChange(collection); + + if (!didUkChange) { + return []; + } + + const tableName = getEntityNameFromCollection(collection); + const pkDto = collection?.role?.compMod?.uniqueKey || {}; + const newUniqueKeys = pkDto.new || []; + + return newUniqueKeys.map(newUk => { + const compositeUniqueKey = newUk.compositeUniqueKey || []; + const guidsOfColumnsInUk = compositeUniqueKey.map(compositeUkEntry => compositeUkEntry.keyId); + const columnNames = getPropertiesNamesByGUIDs(collection, guidsOfColumnsInUk); + const pkConstraintName = newUk.constraintName || getDefaultUkConstraintName(collection); + const constraintName = prepareName(pkConstraintName); + const noValidate = newUk.noValidateSpecification ? ` ${newUk.noValidateSpecification}` : ''; + const rely = newUk.rely ? ` ${newUk.rely}` : ''; + + return provider.assignTemplates(templates.addUkConstraint, { + tableName, + constraintName, + columnNames, + noValidate, + rely, + }); + }); +}; + +const getModifyCompositeUkScripts = ({ collection, provider }) => { + const dropCompositeUkScripts = getDropCompositeUkScripts({ collection, provider }); + const addCompositeUkScripts = getAddCompositeUkScripts({ collection, provider }); + + return [...dropCompositeUkScripts, ...addCompositeUkScripts]; +}; + +const getDropUkScripts = ({ collection, provider }) => { + const tableName = getEntityNameFromCollection(collection); + const constraintName = getDefaultUkConstraintName(collection); + + return _.toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + const oldName = jsonSchema.compMod.oldField.name; + const oldJsonSchema = collection.role.properties[oldName]; + const wasTheFieldARegularUniqueKey = oldJsonSchema?.unique && !oldJsonSchema?.compositeUniqueKey; + + const isNotAUniqueKey = !jsonSchema.unique && !jsonSchema.compositeUniqueKey; + return wasTheFieldARegularUniqueKey && isNotAUniqueKey; + }) + .map(([name, jsonSchema]) => { + return provider.assignTemplates(templates.dropConstraint, { + tableName, + constraintName, + }); + }); +}; + +const getAddUkScripts = ({ collection, provider }) => { + const tableName = getEntityNameFromCollection(collection); + const constraintName = getDefaultUkConstraintName(collection); + + return _.toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + const isRegularUniqueKey = jsonSchema.unique && !jsonSchema.compositeUniqueKey; + const oldName = jsonSchema.compMod.oldField.name; + const wasTheFieldAUniqueKey = Boolean(collection.role.properties[oldName]?.unique); + return isRegularUniqueKey && !wasTheFieldAUniqueKey; + }) + .map(([name, jsonSchema]) => { + const columnNames = [prepareName(name)]; + const noValidate = jsonSchema.noValidateSpecification ? ` ${jsonSchema.noValidateSpecification}` : ''; + const rely = jsonSchema.rely ? ` ${jsonSchema.rely}` : ''; + + return provider.assignTemplates(templates.addUkConstraint, { + tableName, + constraintName, + columnNames, + noValidate, + rely, + }); + }); +}; + +const getModifyUkScripts = ({ collection, provider }) => { + const dropUkScripts = getDropUkScripts({ collection, provider }); + const addUkScripts = getAddUkScripts({ collection, provider }); + + return [...dropUkScripts, ...addUkScripts]; +}; + +const getModifyUkConstraintsScripts = ({ collection, provider }) => { + const modifyCompositeUkScripts = getModifyCompositeUkScripts({ collection, provider }); + const modifyUkScripts = getModifyUkScripts({ collection, provider }); + const isActivated = collection.role.isActivated; + + return [...modifyCompositeUkScripts, ...modifyUkScripts].map(statement => + commentDeactivatedStatements(statement, isActivated), + ); +}; + +module.exports = { + getModifyUkConstraintsScripts, +}; diff --git a/forward_engineering/helpers/constraintHelper.js b/forward_engineering/helpers/constraintHelper.js index 9605a91..df34866 100644 --- a/forward_engineering/helpers/constraintHelper.js +++ b/forward_engineering/helpers/constraintHelper.js @@ -194,6 +194,14 @@ const getIsPkOrFkConstraintAvailable = data => { return !data?.modelData?.[0]?.dbVersion?.startsWith('1'); }; +/** + * UNIQUE, NOT NULL, DEFAULT and CHECK constraints are available from DB version 3 + */ +const getIsConstraintAvailable = data => { + const dbVersion = data?.modelData?.[0]?.dbVersion; + return Boolean(dbVersion) && !dbVersion.startsWith('1') && !dbVersion.startsWith('2'); +}; + module.exports = { getConstraintOpts, getUniqueKeyStatement, @@ -202,4 +210,5 @@ module.exports = { getCompositePrimaryKeys, getColumnConstraints, getIsPkOrFkConstraintAvailable, + getIsConstraintAvailable, }; From 6bfbf2fd01a95e1dc9de16405d6e0360eec9a3e3 Mon Sep 17 00:00:00 2001 From: Alik Rakhmonov Date: Fri, 12 Dec 2025 11:56:53 +0100 Subject: [PATCH 4/5] hotfix: comment shouldn't be in object, it's added later --- .../helpers/alterScriptHelpers/alterEntityHelper.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index 4c9146d..3cfd7dd 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -80,9 +80,9 @@ const hydrateAlterTable = (collection, fullCollectionName, definition) => { }; }; -const hydrateAlterColumns = (entity, definitions, properties = {}) => { +const hydrateAlterColumns = (entity, definitions) => { const collectionName = generateFullEntityName(entity); - const columns = Object.values(properties).map(property => { + const columns = Object.values(entity.properties).map(property => { const compMod = _.get(property, 'compMod', {}); const { newField = {}, oldField = {} } = compMod; @@ -98,7 +98,7 @@ const hydrateAlterColumns = (entity, definitions, properties = {}) => { const isCommentChanged = newComment !== oldComment; const isColumnChanged = oldName !== newName || newType !== oldType || isCommentChanged; - const column = isColumnChanged ? { type: newType, oldName, newName, comment: newComment } : null; + const column = isColumnChanged ? { type: newType, oldName, newName } : null; if (column && isCommentChanged) { return { ...column, comment: newComment }; @@ -231,7 +231,7 @@ const getDeleteColumnsScripts = (definitions, provider) => entity => { const getModifyColumnsScripts = (definitions, provider) => entity => { const properties = _.get(entity, 'properties', {}); - const hydratedAlterColumns = hydrateAlterColumns(entity, definitions, properties); + const hydratedAlterColumns = hydrateAlterColumns(entity, definitions); const alterColumnScripts = provider.alterTableColumns(hydratedAlterColumns); const { hydratedAddIndexes, hydratedDropIndexes } = hydrateIndex(entity, properties, definitions); const dropIndexScript = provider.dropTableIndex(hydratedDropIndexes); From b3b81afc16c1ab7dc418682623fd4bc5389cb1ae Mon Sep 17 00:00:00 2001 From: Alik Date: Fri, 12 Dec 2025 12:28:59 +0100 Subject: [PATCH 5/5] fix: constraint names (#128) --- .../alterScriptHelpers/generalHelper.js | 7 +++++ .../alterScriptHelpers/primaryKeyHelper.js | 26 +++++++------------ .../alterScriptHelpers/uniqueKeyHelper.js | 26 +++++++------------ 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/forward_engineering/helpers/alterScriptHelpers/generalHelper.js b/forward_engineering/helpers/alterScriptHelpers/generalHelper.js index b177a0b..fe40053 100644 --- a/forward_engineering/helpers/alterScriptHelpers/generalHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/generalHelper.js @@ -46,6 +46,12 @@ const hydrateProperty = (entity, compMod, nameProperty) => { return !isEqualProperty(compMod, nameProperty) ? entity?.role?.[nameProperty] : null; }; +const getDefaultConstraintName = (collection, postfix) => { + const entityData = collection?.role || {}; + const entityName = replaceSpaceWithUnderscore(getName(entityData)); + return `${entityName}_${postfix}`; +}; + module.exports = { getEntityData, getFullEntityName, @@ -56,4 +62,5 @@ module.exports = { prepareScript, isEqualProperty, hydrateProperty, + getDefaultConstraintName, }; diff --git a/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js b/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js index 5e14c1f..386693b 100644 --- a/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/primaryKeyHelper.js @@ -1,15 +1,9 @@ const _ = require('lodash'); const { replaceSpaceWithUnderscore, getName, prepareName, commentDeactivatedStatements } = require('../generalHelper'); const templates = require('./config/templates'); +const { generateFullEntityName, getDefaultConstraintName } = require('./generalHelper'); -const getEntityNameFromCollection = collection => { - const entityData = collection?.role || {}; - return replaceSpaceWithUnderscore(getName(entityData)); -}; - -const getDefaultPkConstraintName = collection => { - return getEntityNameFromCollection(collection) + '_pk'; -}; +const postfix = 'pk'; const getPropertyNameByGuid = (collection, guid) => { const property = _.toPairs(collection?.role?.properties).find(([name, jsonSchema]) => jsonSchema.GUID === guid); @@ -41,12 +35,12 @@ const getDropCompositePkScripts = ({ collection, provider }) => { return []; } - const tableName = getEntityNameFromCollection(collection); + const tableName = generateFullEntityName(collection); const pkDto = collection?.role?.compMod?.primaryKey || {}; const oldPrimaryKeys = pkDto.old || []; return oldPrimaryKeys.map(oldPk => { - const pkConstraintName = oldPk.constraintName || getDefaultPkConstraintName(collection); + const pkConstraintName = oldPk.constraintName || getDefaultConstraintName(collection, postfix); const constraintName = prepareName(pkConstraintName); return provider.assignTemplates(templates.dropConstraint, { @@ -63,7 +57,7 @@ const getAddCompositePkScripts = ({ collection, provider }) => { return []; } - const tableName = getEntityNameFromCollection(collection); + const tableName = generateFullEntityName(collection); const pkDto = collection?.role?.compMod?.primaryKey || {}; const newPrimaryKeys = pkDto.new || []; @@ -71,7 +65,7 @@ const getAddCompositePkScripts = ({ collection, provider }) => { const compositePrimaryKey = newPk.compositePrimaryKey || []; const guidsOfColumnsInPk = compositePrimaryKey.map(compositePkEntry => compositePkEntry.keyId); const columnNames = getPropertiesNamesByGUIDs(collection, guidsOfColumnsInPk); - const pkConstraintName = newPk.constraintName || getDefaultPkConstraintName(collection); + const pkConstraintName = newPk.constraintName || getDefaultConstraintName(collection, postfix); const constraintName = prepareName(pkConstraintName); const noValidate = newPk.noValidateSpecification ? ` ${newPk.noValidateSpecification}` : ''; const rely = newPk.rely ? ` ${newPk.rely}` : ''; @@ -94,8 +88,8 @@ const getModifyCompositePkScripts = ({ collection, provider }) => { }; const getDropPkScripts = ({ collection, provider }) => { - const tableName = getEntityNameFromCollection(collection); - const constraintName = getDefaultPkConstraintName(collection); + const tableName = generateFullEntityName(collection); + const constraintName = getDefaultConstraintName(collection, postfix); return _.toPairs(collection.properties) .filter(([name, jsonSchema]) => { @@ -115,8 +109,8 @@ const getDropPkScripts = ({ collection, provider }) => { }; const getAddPkScripts = ({ collection, provider }) => { - const tableName = getEntityNameFromCollection(collection); - const constraintName = getDefaultPkConstraintName(collection); + const tableName = generateFullEntityName(collection); + const constraintName = getDefaultConstraintName(collection, postfix); return _.toPairs(collection.properties) .filter(([name, jsonSchema]) => { diff --git a/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js b/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js index 42691c8..26d616f 100644 --- a/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/uniqueKeyHelper.js @@ -1,15 +1,9 @@ const _ = require('lodash'); const { replaceSpaceWithUnderscore, getName, prepareName, commentDeactivatedStatements } = require('../generalHelper'); const templates = require('./config/templates'); +const { generateFullEntityName, getDefaultConstraintName } = require('./generalHelper'); -const getEntityNameFromCollection = collection => { - const entityData = collection?.role || {}; - return replaceSpaceWithUnderscore(getName(entityData)); -}; - -const getDefaultUkConstraintName = collection => { - return getEntityNameFromCollection(collection) + '_uk'; -}; +const postfix = 'uk'; const getPropertyNameByGuid = (collection, guid) => { const property = _.toPairs(collection?.role?.properties).find(([name, jsonSchema]) => jsonSchema.GUID === guid); @@ -41,12 +35,12 @@ const getDropCompositeUkScripts = ({ collection, provider }) => { return []; } - const tableName = getEntityNameFromCollection(collection); + const tableName = generateFullEntityName(collection); const pkDto = collection?.role?.compMod?.uniqueKey || {}; const oldUniqueKeys = pkDto.old || []; return oldUniqueKeys.map(oldUk => { - const pkConstraintName = oldUk.constraintName || getDefaultUkConstraintName(collection); + const pkConstraintName = oldUk.constraintName || getDefaultConstraintName(collection, postfix); const constraintName = prepareName(pkConstraintName); return provider.assignTemplates(templates.dropConstraint, { @@ -63,7 +57,7 @@ const getAddCompositeUkScripts = ({ collection, provider }) => { return []; } - const tableName = getEntityNameFromCollection(collection); + const tableName = generateFullEntityName(collection); const pkDto = collection?.role?.compMod?.uniqueKey || {}; const newUniqueKeys = pkDto.new || []; @@ -71,7 +65,7 @@ const getAddCompositeUkScripts = ({ collection, provider }) => { const compositeUniqueKey = newUk.compositeUniqueKey || []; const guidsOfColumnsInUk = compositeUniqueKey.map(compositeUkEntry => compositeUkEntry.keyId); const columnNames = getPropertiesNamesByGUIDs(collection, guidsOfColumnsInUk); - const pkConstraintName = newUk.constraintName || getDefaultUkConstraintName(collection); + const pkConstraintName = newUk.constraintName || getDefaultConstraintName(collection, postfix); const constraintName = prepareName(pkConstraintName); const noValidate = newUk.noValidateSpecification ? ` ${newUk.noValidateSpecification}` : ''; const rely = newUk.rely ? ` ${newUk.rely}` : ''; @@ -94,8 +88,8 @@ const getModifyCompositeUkScripts = ({ collection, provider }) => { }; const getDropUkScripts = ({ collection, provider }) => { - const tableName = getEntityNameFromCollection(collection); - const constraintName = getDefaultUkConstraintName(collection); + const tableName = generateFullEntityName(collection); + const constraintName = getDefaultConstraintName(collection, postfix); return _.toPairs(collection.properties) .filter(([name, jsonSchema]) => { @@ -115,8 +109,8 @@ const getDropUkScripts = ({ collection, provider }) => { }; const getAddUkScripts = ({ collection, provider }) => { - const tableName = getEntityNameFromCollection(collection); - const constraintName = getDefaultUkConstraintName(collection); + const tableName = generateFullEntityName(collection); + const constraintName = getDefaultConstraintName(collection, postfix); return _.toPairs(collection.properties) .filter(([name, jsonSchema]) => {