Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions forward_engineering/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,12 @@
"disabled": false,
"value": {
"inline": {
"default": false,
"disabled": true,
"default": true,
"disabled": false,
"disabledLabel": ""
},
"separate": {
"default": true,
"default": false,
"disabled": false,
"disabledLabel": ""
},
Expand Down
15 changes: 4 additions & 11 deletions forward_engineering/generateContainerScript.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ const { getTableStatement } = require('./helpers/tableHelper');
const { getIndexes } = require('./helpers/indexHelper');
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');

Expand Down Expand Up @@ -61,6 +60,8 @@ const generateContainerScript = (data, logger, callback, app) => {
});

const entities = data.entities.reduce((result, entityId) => {
const foreignKeys = foreignKeyHelper.getForeignKeyStatementsByHashItem(foreignKeyHashTable[entityId] || {});

const args = [
containerData,
data.entityData[entityId],
Expand All @@ -69,22 +70,14 @@ const generateContainerScript = (data, logger, callback, app) => {
];

return result.concat([
getTableStatement(...args, null, areColumnConstraintsAvailable, isPkOrFkConstraintAvailable),
getTableStatement(...args, foreignKeys, areColumnConstraintsAvailable, isPkOrFkConstraintAvailable),
getIndexes(...args, areColumnConstraintsAvailable),
]);
}, []);

const foreignKeys = getForeignKeys(data, foreignKeyHashTable, isPkOrFkConstraintAvailable);

callback(
null,
buildScript(needMinify)(
...workloadManagementStatements,
databaseStatement,
...entities,
...viewsScripts,
foreignKeys,
),
buildScript(needMinify)(...workloadManagementStatements, databaseStatement, ...entities, ...viewsScripts),
);
} catch (e) {
logger.log('error', { message: e.message, stack: e.stack }, 'Hive Forward-Engineering Error');
Expand Down
42 changes: 36 additions & 6 deletions forward_engineering/helpers/alterScriptFromDeltaHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const {
getAddColumnsScripts,
getModifyColumnsScripts,
} = require('./alterScriptHelpers/alterEntityHelper');
const { getAlterRelationshipsScripts } = require('./alterScriptHelpers/alterRelationshipsHelper');
const { getAlterForeignKeyScripts } = require('./alterScriptHelpers/alterForeignKeyHelper');
const {
getAddViewsScripts,
getDeleteViewsScripts,
Expand All @@ -37,7 +37,7 @@ const getAlterContainersScripts = (schema, provider) => {
};
};

const getAlterCollectionsScripts = (schema, definitions, provider, data) => {
const getAlterCollectionsScripts = ({ schema, definitions, provider, data, inlineDeltaRelationships }) => {
let currentSchemaName = '';

const setCurrentSchemaName = (entity, getScript) => {
Expand All @@ -57,7 +57,9 @@ const getAlterCollectionsScripts = (schema, definitions, provider, data) => {

const addedCollectionsScripts = addedCollectionsItems
.filter(item => item.compMod?.created)
.flatMap(item => setCurrentSchemaName(item, getAddCollectionsScripts(definitions, data)));
.flatMap(item =>
setCurrentSchemaName(item, getAddCollectionsScripts(definitions, data, inlineDeltaRelationships)),
);
const deletedCollectionsScripts = deletedCollectionsItems
.filter(item => item.compMod?.deleted)
.flatMap(getDeleteCollectionsScripts(provider));
Expand Down Expand Up @@ -117,18 +119,46 @@ const getAlterViewsScripts = (schema, provider) => {
};
};

const getInlineRelationships = ({ schema, options }) => {
if (options?.scriptGenerationOptions?.feActiveOptions?.foreignKeys !== 'inline') {
return [];
}

const addedCollectionIDs = []
.concat(schema.properties?.entities?.properties?.added?.items)
.filter(item => item && Object.values(item.properties)?.[0]?.compMod?.created)
.map(item => Object.values(item.properties)[0].role.id);

const addedRelationships = []
.concat(schema.properties?.relationships?.properties?.added?.items)
.map(item => item && Object.values(item.properties)[0])
.filter(r => r?.role?.compMod?.created && addedCollectionIDs.includes(r?.role?.childCollection));

return addedRelationships;
};

const getAlterScript = (schema, definitions, data, app, needMinify, sqlFormatter) => {
const provider = require('./alterScriptHelpers/provider')(app);

const inlineDeltaRelationships = getInlineRelationships({ schema, options: data.options });
const ignoreRelationshipIDs = inlineDeltaRelationships.map(relationship => relationship.role.id);

const containerScripts = getAlterContainersScripts(schema, provider);
const { currentSchemaName, ...collectionScripts } = getAlterCollectionsScripts(schema, definitions, provider, data);
const { currentSchemaName, ...collectionScripts } = getAlterCollectionsScripts({
schema,
definitions,
provider,
data,
inlineDeltaRelationships,
});
const viewScripts = getAlterViewsScripts(schema, provider);
const relationshipScripts = getAlterRelationshipsScripts(schema, provider, currentSchemaName);
const foreignKeyScripts = getAlterForeignKeyScripts({ schema, provider, currentSchemaName, ignoreRelationshipIDs });

let scripts = {
...containerScripts,
...collectionScripts,
...viewScripts,
...relationshipScripts,
...foreignKeyScripts,
};

scripts = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const { getModifyUkConstraintsScripts } = require('./uniqueKeyHelper');
const { getModifyNonNullColumnsScripts } = require('./nonNullConstraintHelper');
const { getModifyDefaultValueConstraintsScripts } = require('./defaultConstraintHelper');
const { getModifyCheckConstraintsScripts } = require('./checkConstraintHelper');
const { getForeignKeyConstraint } = require('../foreignKeyHelper');

const tableProperties = [
'compositePartitionKey',
Expand Down Expand Up @@ -157,16 +158,48 @@ const generateModifyCollectionScript = (entity, definitions, provider) => {
return { type: 'modified', script: provider.alterTable(hydratedAlterTable) };
};

const getAddCollectionsScripts = (definitions, data) => entity => {
const properties = getEntityProperties(entity);
const indexes = _.get(entity, 'role.SecIndxs', []);
const hydratedCollection = hydrateCollection(entity, definitions);
const isPkOrFkConstraintAvailable = getIsPkOrFkConstraintAvailable(data);
const collectionScript = getTableStatement(...hydratedCollection, null, true, isPkOrFkConstraintAvailable);
const indexScript = getIndexes(...hydrateAddIndexes(entity, indexes, properties, definitions));
const getAddCollectionsScripts =
(definitions, data, inlineDeltaRelationships = []) =>
entity => {
const properties = getEntityProperties(entity);
const indexes = _.get(entity, 'role.SecIndxs', []);
const hydratedCollection = hydrateCollection(entity, definitions);
const isPkOrFkConstraintAvailable = getIsPkOrFkConstraintAvailable(data);

return prepareScript(collectionScript, indexScript);
};
const foreignKeyConstraints = inlineDeltaRelationships
.filter(relationship => relationship.role.childCollection === entity.role.id)
.map(relationship => {
const compMod = relationship.role.compMod;
const relationshipName =
compMod.code?.new || compMod.name?.new || relationship.role.code || relationship.role.name || '';
const constraintName = relationshipName.includes(' ') ? `\`${relationshipName}\`` : relationshipName;
const parentTableName = compMod.parent.collection.name;
const childColumns = compMod.child.collection.fkFields.map(field => field.name).join(', ');
const parentColumns = compMod.parent.collection.fkFields.map(field => field.name).join(', ');
const disableNoValidate = relationship.role?.customProperties?.disableNoValidate;

const statement = getForeignKeyConstraint({
constraintName,
childColumns,
parentTableName,
parentColumns,
disableNoValidate,
});

return statement;
})
.join('\n');

const collectionScript = getTableStatement(
...hydratedCollection,
foreignKeyConstraints,
true,
isPkOrFkConstraintAvailable,
);
const indexScript = getIndexes(...hydrateAddIndexes(entity, indexes, properties, definitions));

return prepareScript(collectionScript, indexScript);
};

const getDeleteCollectionsScripts = provider => entity => {
const entityData = { ...entity, ..._.get(entity, 'role', {}) };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,7 @@ const getModifyForeignKeyScript = provider => relationship => {
);
};

const getAlterRelationshipsScripts = (schema, provider, initialSchemaName) => {
let currentSchemaName = initialSchemaName;

const getAlterForeignKeyScripts = ({ schema, provider, currentSchemaName, ignoreRelationshipIDs = [] }) => {
const generateAddFkScripts = (addedRelationships, getScript) => {
return addedRelationships.filter(relationship => canRelationshipBeAdded(relationship)).flatMap(getScript);
};
Expand Down Expand Up @@ -162,10 +160,10 @@ const getAlterRelationshipsScripts = (schema, provider, initialSchemaName) => {
};

const deletedRelationships = getItems(schema, 'relationships', 'deleted').filter(
relationship => relationship.role?.compMod?.deleted,
relationship => relationship.role?.compMod?.deleted && !ignoreRelationshipIDs.includes(relationship?.role?.id),
);
const addedRelationships = getItems(schema, 'relationships', 'added').filter(
relationship => relationship.role?.compMod?.created,
relationship => relationship.role?.compMod?.created && !ignoreRelationshipIDs.includes(relationship?.role?.id),
);
const modifiedRelationships = getItems(schema, 'relationships', 'modified');

Expand All @@ -184,5 +182,5 @@ const getAlterRelationshipsScripts = (schema, provider, initialSchemaName) => {
};

module.exports = {
getAlterRelationshipsScripts,
getAlterForeignKeyScripts,
};
46 changes: 21 additions & 25 deletions forward_engineering/helpers/foreignKeyHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,18 @@ const getForeignKeyHashTable = ({
}, {});
};

const getForeignKeyConstraint = ({
constraintName,
childColumns,
parentTableName,
parentColumns,
disableNoValidate,
}) => {
const constraintNameStatement = constraintName ? `CONSTRAINT ${constraintName} ` : '';
const statement = `,${constraintNameStatement}FOREIGN KEY (${childColumns}) REFERENCES ${parentTableName}(${parentColumns}) ${disableNoValidate ? 'DISABLE NOVALIDATE' : ''}`;
return statement;
};

const getForeignKeyStatementsByHashItem = hashItem => {
return Object.keys(hashItem || {})
.map(groupKey => {
Expand All @@ -121,13 +133,18 @@ const getForeignKeyStatementsByHashItem = hashItem => {
const keyName = firstKey.code || firstKey.name || '';
const constraintName = keyName.includes(' ') ? `\`${keyName}\`` : keyName;
const parentTableName = firstKey.parentTableName;
const childTableName = firstKey.childTableName;
const disableNoValidate = keys.some(item => item?.disableNoValidate);
const childColumns = keys.map(item => item.childColumn).join(', ');
const parentColumns = keys.map(item => item.parentColumn).join(', ');
const isActivated = firstKey.isActivated;

const statement = `ALTER TABLE ${childTableName} ADD CONSTRAINT ${constraintName} FOREIGN KEY (${childColumns}) REFERENCES ${parentTableName}(${parentColumns}) ${disableNoValidate ? 'DISABLE NOVALIDATE' : ''};`;
const statement = getForeignKeyConstraint({
constraintName,
childColumns,
parentTableName,
parentColumns,
disableNoValidate,
});

return commentDeactivatedStatements(statement, isActivated);
})
Expand All @@ -144,29 +161,8 @@ const getPreparedForeignColumns = (columnsPaths, idToNameHashTable) => {
}
};

const getForeignKeys = (data, foreignKeyHashTable, areForeignPrimaryKeyConstraintsAvailable) => {
if (!areForeignPrimaryKeyConstraintsAvailable) {
return null;
}

const dbName = replaceSpaceWithUnderscore(getName(getTab(0, data.containerData)));

const foreignKeysStatements = data.entities
.reduce((result, entityId) => {
const foreignKeyStatement = getForeignKeyStatementsByHashItem(foreignKeyHashTable[entityId] || {});

if (foreignKeyStatement) {
return [...result, foreignKeyStatement];
}

return result;
}, [])
.join('\n');

return foreignKeysStatements ? `\nUSE ${dbName};${foreignKeysStatements}` : '';
};

module.exports = {
getForeignKeyHashTable,
getForeignKeys,
getForeignKeyStatementsByHashItem,
getForeignKeyConstraint,
};