diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js index e483091..8d665f0 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js @@ -47,6 +47,19 @@ const getDefaultPkConstraintName = collection => { return getEntityNameFromCollection(collection) + '_pk'; }; +/** + * @param {object} primaryKey + * @returns {string} + */ +const getPkConstraintOptions = (primaryKey = {}) => { + const notEnforcedOption = primaryKey.notEnforced ? ' NOT ENFORCED' : ''; + const deferrable = primaryKey.deferrable ? ' DEFERRABLE' : ''; + const initiallyDeferrableOption = primaryKey.initiallyDeferrable ? ' INITIALLY DEFERRED' : ''; + const noRelyOption = primaryKey.noRely ? ' NORELY' : ''; + + return notEnforcedOption + deferrable + initiallyDeferrableOption + noRelyOption; +}; + /** * @return {({collection, dbVersion }: {collection: Object, dbVersion: string }) => Array} * */ @@ -66,12 +79,14 @@ const getAddCompositePkScripts = const compositePrimaryKey = newPk.compositePrimaryKey || []; const guidsOfColumnsInPk = compositePrimaryKey.map(compositePkEntry => compositePkEntry.keyId); const columnNamesForDDL = getPropertiesNamesByGUIDs(collection, guidsOfColumnsInPk); - const constraintName = newPk.constraintName || getDefaultPkConstraintName(collection); + const pkConstraintName = newPk.constraintName || getDefaultPkConstraintName(collection); + const constraintName = prepareName(pkConstraintName); + const constraintOptions = getPkConstraintOptions(newPk); if (!columnNamesForDDL.length) { return undefined; } - return ddlProvider.addPkConstraint(fullTableName, constraintName, columnNamesForDDL); + return ddlProvider.addPkConstraint(fullTableName, constraintName, columnNamesForDDL, constraintOptions); }) .filter(Boolean) .map(scriptLine => ({ @@ -139,10 +154,12 @@ const getAddPkScripts = .map(([name, jsonSchema]) => { const nameForDDl = prepareName(name); const columnNamesForDDL = [nameForDDl]; - const constraintName = + const pkConstraintName = jsonSchema.primaryKeyOptions?.constraintName || getDefaultPkConstraintName(collection); + const constraintName = prepareName(pkConstraintName); + const constraintOptions = getPkConstraintOptions(jsonSchema.primaryKeyOptions); - return ddlProvider.addPkConstraint(fullTableName, constraintName, columnNamesForDDL); + return ddlProvider.addPkConstraint(fullTableName, constraintName, columnNamesForDDL, constraintOptions); }) .map(scriptLine => ({ scripts: [ diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index 99f7c0c..2369b9d 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -278,17 +278,19 @@ module.exports = app => { }, /** - * @param tableName {string} - * @param constraintName {string} - * @param pkColumnNames {Array} - * @return string + * @param {string} tableName + * @param {string} constraintName + * @param {Array} pkColumnNames + * @param {string} constraintOptions + * @return {string} * */ - addPkConstraint(tableName, constraintName, pkColumnNames) { + addPkConstraint(tableName, constraintName, pkColumnNames, constraintOptions) { const pkColumns = pkColumnNames.join(', '); const templateConfig = { tableName, constraintName, pkColumns, + constraintOptions, }; return assignTemplates(templates.addPkConstraint, templateConfig); }, diff --git a/forward_engineering/ddlProvider/ddlTemplates.js b/forward_engineering/ddlProvider/ddlTemplates.js index e5615a0..5a3a533 100644 --- a/forward_engineering/ddlProvider/ddlTemplates.js +++ b/forward_engineering/ddlProvider/ddlTemplates.js @@ -36,7 +36,8 @@ module.exports = { dropCheckConstraint: 'ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};', - addPkConstraint: 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} PRIMARY KEY(${pkColumns});', + addPkConstraint: + 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} PRIMARY KEY(${pkColumns})${constraintOptions};', dropPkConstraint: 'ALTER TABLE ${tableName} DROP PRIMARY KEY IF EXISTS ${dropPkOption};',