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
77 changes: 77 additions & 0 deletions adapter/0.2.64.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/**
* Copyright © 2016-2026 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": [<names of new property>],
* "container": [<names of new property>],
* "model": [<names of new property>],
* "view": [<names of new property>],
* "field": {
* "<type>": [<names of new property>]
* }
* },
* "delete": {
* "entity": [<names of new property>],
* "container": [<names of new property>],
* "model": [<names of new property>],
* "view": [<names of new property>],
* "field": {
* "<type>": [<names of new property>]
* }
* },
* "modify": {
* "entity": [
* {
* "from": { <properties that identify record> },
* "to": { <properties that need to be changed> }
* }
* ],
* "container": [],
* "model": [],
* "view": [],
* "field": []
* },
* }
*/
{
"modify": {
"field": [
[
"movePropertyByPath",
{
"from": "primaryKeyConstraintName",
"to": "primaryKeyOptions.constraintName"
}
],
[
"addMissingIdByPath",
{
"from": "primaryKeyOptions",
"path": "primaryKeyOptions.GUID"
}
],
["convertBlockPropertyToGroupProperty", "primaryKeyOptions"],
[
"movePropertyByPath",
{
"from": "uniqueKeyConstraintName",
"to": "uniqueKeyOptions.constraintName"
}
],
[
"addMissingIdByPath",
{
"from": "uniqueKeyOptions",
"path": "uniqueKeyOptions.GUID"
}
],
["convertBlockPropertyToGroupProperty", "uniqueKeyOptions"]
]
}
}
3 changes: 2 additions & 1 deletion forward_engineering/api/generateScript.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const _ = require('lodash');
const { FORMATS } = require('../helpers/constants');
const { commentDropStatements } = require('../helpers/commentHelpers/commentDropStatements.js');
const { getAlterScript } = require('../helpers/alterScriptFromDeltaHelper.js');

Expand All @@ -14,7 +15,7 @@ function generateScript(data, logger, callback, app) {
);
}

const scriptFormat = _.get(data, 'options.targetScriptOptions.keyword');
const scriptFormat = _.get(data, 'options.targetScriptOptions.keyword') || FORMATS.SNOWSIGHT;
const script = getAlterScript({ scriptFormat, collection, ddlProvider, app, options: data.options });

const applyDropStatements = data.options?.additionalOptions?.some(
Expand Down
114 changes: 72 additions & 42 deletions forward_engineering/ddlProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -674,8 +674,29 @@ module.exports = (baseProvider, options, app) => {
},

hydrateColumn({ columnDefinition, jsonSchema, dbData }) {
const pkConstraintName = jsonSchema.compositePrimaryKey ? undefined : jsonSchema.primaryKeyConstraintName;
const ukConstraintName = jsonSchema.compositeUniqueKey ? undefined : jsonSchema.uniqueKeyConstraintName;
const readKey = (optionsKey, flatNameKey) => {
const optionsList = jsonSchema?.[optionsKey];
const options = Array.isArray(optionsList) ? optionsList[0] : optionsList;

return {
name: options?.constraintName || jsonSchema?.[flatNameKey] || '',
comment: options?.indexComment || '',
};
};

const primaryKey = readKey('primaryKeyOptions', 'primaryKeyConstraintName');
const uniqueKey = readKey('uniqueKeyOptions', 'uniqueKeyConstraintName');

const pkOutOfLine = Boolean(
!jsonSchema.compositePrimaryKey && jsonSchema.primaryKey && (primaryKey.name || primaryKey.comment),
);

const ukOutOfLine = Boolean(
!jsonSchema.compositeUniqueKey && jsonSchema.unique && (uniqueKey.name || uniqueKey.comment),
);

const pkConstraintName = jsonSchema.compositePrimaryKey ? undefined : primaryKey.name || undefined;
const ukConstraintName = jsonSchema.compositeUniqueKey ? undefined : uniqueKey.name || undefined;

return {
...columnDefinition,
Expand Down Expand Up @@ -708,12 +729,14 @@ module.exports = (baseProvider, options, app) => {
})
: {},
comment: jsonSchema.refDescription || jsonSchema.description,
unique: jsonSchema.uniqueKeyConstraintName ? false : jsonSchema.unique,
unique: ukOutOfLine ? false : jsonSchema.unique,
primaryKeyConstraintName: pkConstraintName,
compositePrimaryKey: jsonSchema.compositePrimaryKey || (pkConstraintName && jsonSchema.primaryKey),
compositeUniqueKey: jsonSchema.compositeUniqueKey || (ukConstraintName && jsonSchema.unique),
primaryKeyComment: primaryKey.comment || undefined,
compositePrimaryKey: jsonSchema.compositePrimaryKey || pkOutOfLine,
compositeUniqueKey: jsonSchema.compositeUniqueKey || ukOutOfLine,
uniqueKeyConstraintName: ukConstraintName,
primaryKey: jsonSchema.primaryKeyConstraintName ? false : columnDefinition.primaryKey,
uniqueKeyComment: uniqueKey.comment || undefined,
primaryKey: pkOutOfLine ? false : columnDefinition.primaryKey,
expression: jsonSchema.expression,
columnTags: jsonSchema.columnTags ?? [],
};
Expand Down Expand Up @@ -851,12 +874,29 @@ module.exports = (baseProvider, options, app) => {

const keyConstraints = keyHelper.getTableKeyConstraints({ jsonSchema });

const entityLevelCompositeKeysReducer = (keys, data) => ({
...keys,
[data.name]: data.columns.map(column => {
return { name: column.name, isActivated: column.isActivated };
}),
});
const mergeOutOfLineKey = (keys, { name = '', columns, comment = '' }) => {
const groupKey = name || `unnamed:${columns.map(column => column.name).join(',')}`;
const existing = keys[groupKey];

return {
...keys,
[groupKey]: {
name,
columns: existing ? uniqBy([...existing.columns, ...columns], 'name') : columns,
comment: comment || existing?.comment || '',
},
};
};

const entityLevelCompositeKeysReducer = (keys, data) =>
mergeOutOfLineKey(keys, {
name: data.name || '',
columns: (data.columns || []).map(column => ({
name: column.name,
isActivated: column.isActivated,
})),
comment: data.comment || '',
});

const entityLevelCompositePrimaryKeys = keyConstraints
.filter(({ keyType }) => keyType === 'PRIMARY KEY')
Expand All @@ -869,43 +909,29 @@ module.exports = (baseProvider, options, app) => {
const compositePrimaryKeys = tableData.columnDefinitions
.filter(column => column.compositePrimaryKey)
.reduce((result, column) => {
if (!column.primaryKeyConstraintName) {
if (!column.primaryKeyConstraintName && !column.primaryKeyComment) {
return result;
}

return {
...result,
[column.primaryKeyConstraintName]: Array.isArray(result[column.primaryKeyConstraintName])
? uniqBy(
[
...result[column.primaryKeyConstraintName],
{ name: column.name, isActivated: column.isActivated },
],
'name',
)
: [{ name: column.name, isActivated: column.isActivated }],
};
return mergeOutOfLineKey(result, {
name: column.primaryKeyConstraintName || '',
columns: [{ name: column.name, isActivated: column.isActivated }],
comment: column.primaryKeyComment || '',
});
}, entityLevelCompositePrimaryKeys);

const compositeUniqueKeys = tableData.columnDefinitions
.filter(column => column.compositeUniqueKey)
.reduce((result, column) => {
if (!column.uniqueKeyConstraintName) {
if (!column.uniqueKeyConstraintName && !column.uniqueKeyComment) {
return result;
}

return {
...result,
[column.uniqueKeyConstraintName]: Array.isArray(result[column.uniqueKeyConstraintName])
? uniqBy(
[
...result[column.uniqueKeyConstraintName],
{ name: column.name, isActivated: column.isActivated },
],
'name',
)
: [{ name: column.name, isActivated: column.isActivated }],
};
return mergeOutOfLineKey(result, {
name: column.uniqueKeyConstraintName || '',
columns: [{ name: column.name, isActivated: column.isActivated }],
comment: column.uniqueKeyComment || '',
});
}, entityLevelCompositeUniqueKeys);

return {
Expand Down Expand Up @@ -990,19 +1016,23 @@ module.exports = (baseProvider, options, app) => {
columns: firstTab.external
? tableData.columnDefinitions.map(createExternalColumn(scriptFormat))
: tableData.columns,
compositePrimaryKeys: Object.entries(compositePrimaryKeys).map(([name, keys]) =>
compositePrimaryKeys: Object.values(compositePrimaryKeys).map(({ name, columns, comment }) =>
generateConstraint({
name,
keys,
keys: columns,
comment,
scriptFormat,
keyType: 'PRIMARY KEY',
isActivated: jsonSchema.isActivated,
isCaseSensitive: firstTab.isCaseSensitive,
}),
),
compositeUniqueKeys: Object.entries(compositeUniqueKeys).map(([name, keys]) =>
compositeUniqueKeys: Object.values(compositeUniqueKeys).map(({ name, columns, comment }) =>
generateConstraint({
name,
keys,
keys: columns,
comment,
scriptFormat,
keyType: 'UNIQUE',
isActivated: jsonSchema.isActivated,
isCaseSensitive: firstTab.isCaseSensitive,
Expand Down
15 changes: 11 additions & 4 deletions forward_engineering/helpers/alterScriptFromDeltaHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,13 @@ const getAlterContainersScripts = (collection, ddlProvider, app) => {
return { addedContainerScripts, deletedContainerScripts, modifiedContainerScripts };
};

const getAlterCollectionsScripts = ({ collection, ddlProvider, app, scriptFormat, shouldIgnoreColumnComments = false }) => {
const getAlterCollectionsScripts = ({
collection,
ddlProvider,
app,
scriptFormat,
shouldIgnoreColumnComments = false,
}) => {
const getCollectionScripts = (items, compMode, getScript) =>
items.filter(item => item.compMod?.[compMode]).map(getScript);

Expand All @@ -63,7 +69,9 @@ const getAlterCollectionsScripts = ({ collection, ddlProvider, app, scriptFormat
'modified',
getModifyCollectionScript(ddlProvider),
);
const modifyCollectionKeysScripts = modifiedItems.flatMap(getModifyCollectionKeysScript);
const modifyCollectionKeysScripts = modifiedItems.flatMap(item =>
getModifyCollectionKeysScript(item, scriptFormat),
);

const addedColumnScripts = getColumnScripts(
getItems(collection, 'entities', 'added', 'values'),
Expand Down Expand Up @@ -184,8 +192,7 @@ const getAlterForeignKeysScripts = ({ collection, ddlProvider }) => {
};

const getAlterScript = ({ scriptFormat, collection, ddlProvider, app, options }) => {
const shouldIgnoreColumnComments =
options?.scriptGenerationOptions?.feActiveOptions?.columnComments === 'ignore';
const shouldIgnoreColumnComments = options?.scriptGenerationOptions?.feActiveOptions?.columnComments === 'ignore';
const script = {
...getAlterCollectionsScripts({
collection,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ const getAddColumnScript =
scriptFormat,
});
const column = ddlProvider.convertColumnDefinition(columnDefinition);
const isActivated =
isContainerActivated && isCollectionActivated && jsonSchema.isActivated !== false;
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated !== false;
const addColumnScript = `ALTER TABLE IF EXISTS ${fullName} ADD COLUMN ${commentIfDeactivated(column.statement, { isActivated })};`;
const commentScript = getAddedCommentOnColumnScript({
collection,
Expand Down Expand Up @@ -223,9 +222,14 @@ const getModifyColumnScript =
];
};

const getModifyCollectionKeysScript = collection => {
const modifyPkScriptDtos = getModifyPkScripts(collection);
const modifyUkScriptDtos = getModifyUkScripts(collection);
/**
* @param {AlterCollectionDto} collection
* @param {string} scriptFormat
* @return {string[]}
*/
const getModifyCollectionKeysScript = (collection, scriptFormat) => {
const modifyPkScriptDtos = getModifyPkScripts(collection, scriptFormat);
const modifyUkScriptDtos = getModifyUkScripts(collection, scriptFormat);

const allScriptDtos = [...modifyPkScriptDtos, ...modifyUkScriptDtos];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ const PRIMARY_KEY_CONFIG = {
* Get all modify PK scripts (both composite and regular)
*
* @param {AlterCollectionDto} collection
* @param {string} scriptFormat
* @return {AlterScriptDto[]}
* */
const getModifyPkScripts = collection => {
return getModifyKeyScripts(collection, PRIMARY_KEY_CONFIG);
const getModifyPkScripts = (collection, scriptFormat) => {
return getModifyKeyScripts(collection, PRIMARY_KEY_CONFIG, scriptFormat);
};

module.exports = {
Expand Down
Loading
Loading