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
67 changes: 47 additions & 20 deletions forward_engineering/alterScript/alterScriptFromDeltaHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,32 +144,51 @@ const getAlterCollectionsScriptDtos = ({
* @param app {App}
* @param dbVersion {string}
* @param scriptFormat {string}
* @return {AlterScriptDto[]}
* @return {{ restViewScripts: AlterScriptDto[], renameViewScripts: AlterScriptDto[]}}
* */
const getAlterViewScriptDtos = (collection, app, dbVersion, scriptFormat) => {
const createViewsScriptDtos = []
.concat(collection.properties?.views?.properties?.added?.items)
.filter(Boolean)
.map(item => Object.values(item.properties)[0])
.map(view => ({ ...view, ...(view.role || {}) }))
const properties = collection.properties?.views?.properties;
if (!properties) {
return [];
}

const prepareDtos = mutationType => {
if (!mutationType.items) {
return [];
}

return mutationType.items
.filter(Boolean)
.map(item => Object.values(item.properties)[0])
.map(view => ({ ...view, ...(view.role || {}) }));
};

const createViewsScriptDtos = prepareDtos(properties.added)
.filter(view => view.compMod?.created)
.map(getAddViewScriptDto(app, scriptFormat));

const deleteViewsScriptDtos = []
.concat(collection.properties?.views?.properties?.deleted?.items)
.filter(Boolean)
.map(item => Object.values(item.properties)[0])
.map(view => ({ ...view, ...(view.role || {}) }))
.map(getDeleteViewScriptDto(app, scriptFormat));
const deleteViewsScriptDtos = prepareDtos(properties.deleted).map(getDeleteViewScriptDto(app, scriptFormat));

const modifyViewsScriptDtos = []
.concat(collection.properties?.views?.properties?.modified?.items)
.filter(Boolean)
.map(viewWrapper => Object.values(viewWrapper.properties)[0])
.map(view => ({ ...view, ...(view.role || {}) }))
.flatMap(getModifyViewScriptDtos({ scriptFormat }));
const preparedModifyViewsScriptDtos = prepareDtos(properties.modified).reduce(
(scripts, view) => {
const { restViewScripts, renameViewScripts } = getModifyViewScriptDtos({ scriptFormat })(view);

restViewScripts.length && scripts.restViewScripts.push(...restViewScripts);
renameViewScripts.length && scripts.renameViewScripts.push(...renameViewScripts);

return [...deleteViewsScriptDtos, ...createViewsScriptDtos, ...modifyViewsScriptDtos].filter(Boolean);
return scripts;
},
{ restViewScripts: [], renameViewScripts: [] },
);

return {
restViewScripts: [
...deleteViewsScriptDtos,
...createViewsScriptDtos,
...preparedModifyViewsScriptDtos.restViewScripts,
].filter(Boolean),
renameViewScripts: preparedModifyViewsScriptDtos.renameViewScripts,
};
};

/**
Expand Down Expand Up @@ -372,8 +391,11 @@ const getAlterScriptDtos = (data, app) => {
const modelDefinitions = JSON.parse(data.modelDefinitions);
const internalDefinitions = JSON.parse(data.internalDefinitions);
const externalDefinitions = JSON.parse(data.externalDefinitions);

const dbVersion = data.modelData[0]?.dbVersion;

const containersScriptDtos = getAlterContainersScriptDtos({ collection, app, scriptFormat });

const collectionsScriptDtos = getAlterCollectionsScriptDtos({
collection,
app,
Expand All @@ -383,7 +405,9 @@ const getAlterScriptDtos = (data, app) => {
externalDefinitions,
scriptFormat,
});

const viewScriptDtos = getAlterViewScriptDtos(collection, app, dbVersion, scriptFormat);

const modelDefinitionsScriptDtos = getAlterModelDefinitionsScriptDtos({
collection,
app,
Expand All @@ -393,15 +417,18 @@ const getAlterScriptDtos = (data, app) => {
externalDefinitions,
scriptFormat,
});

const relationshipScriptDtos = getAlterRelationshipsScriptDtos({ collection, app, scriptFormat });

const containersSequencesScriptDtos = getAlterContainersSequencesScriptDtos({ collection, app, dbVersion });

return [
...containersScriptDtos,
...containersSequencesScriptDtos,
...modelDefinitionsScriptDtos,
...viewScriptDtos.renameViewScripts,
...collectionsScriptDtos,
...viewScriptDtos,
...viewScriptDtos.restViewScripts,
...relationshipScriptDtos,
]
.filter(Boolean)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const {
const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper');
const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper');
const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper');
const { getModifyCollectionNameScriptDtos } = require('./entityHelpers/nameHelper');
const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper');
const { getModifiedDefaultColumnValueScriptDtos } = require('./columnHelpers/defaultValueHelper');
const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper');
Expand Down Expand Up @@ -103,8 +104,10 @@ const getModifyCollectionScriptDtos =
const modifyUniqueKeyConstraintDtos = getModifyUniqueKeyConstraintsScriptDtos({ scriptFormat, collection });
const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos({ scriptFormat })(collection);
const modifyIndexesScriptDtos = getModifyIndexesScriptDtos({ ddlProvider, scriptFormat })({ collection });
const modifyEntityNameScriptDtos = getModifyCollectionNameScriptDtos({ scriptFormat, collection });

return [
...modifyEntityNameScriptDtos,
...modifyPKConstraintDtos,
...modifyCommentScriptDtos,
...modifyUniqueKeyConstraintDtos,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const { AlterScriptDto } = require('../types/AlterScriptDto');
const { mapDeltaDualityViewToFeDualityView } = require('./dualityViewHelpers/deltaDualityViewToFeDualityViewMapper');
const { prepareNameForScriptFormat } = require('../../utils/general');
const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper');
const { getModifyEntityNameScriptDtos } = require('./viewHelpers/nameHelper');

/**
* @return {(view: Object) => AlterScriptDto | undefined}
Expand Down Expand Up @@ -66,14 +67,20 @@ const getDeleteViewScriptDto = (app, scriptFormat) => view => {
/**
* @param {object} params
* @property {string} [scriptFormat]
* @return {(view: AlterCollectionDto) => AlterScriptDto[]}
* @return {(view: AlterCollectionDto) => { restViewScripts: AlterScriptDto[], renameViewScripts: AlterScriptDto[] }}
* */
const getModifyViewScriptDtos =
({ scriptFormat }) =>
view => {
const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos({ scriptFormat, view });

return [...modifyCommentsScriptDtos].filter(Boolean);
// RENAME view statements must go *before* renaming table statements
const modifyEntityNameScriptDtos = getModifyEntityNameScriptDtos({ scriptFormat, entity: view });

const restViewScripts = modifyCommentsScriptDtos.filter(Boolean);
const renameViewScripts = modifyEntityNameScriptDtos.filter(Boolean);

return { restViewScripts, renameViewScripts };
};

const getKeys = ({ view, collectionRefsDefinitionsMap, ddlProvider, app }) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const { AlterScriptDto } = require('../../types/AlterScriptDto');
const { AlterCollectionDto } = require('../../types/AlterCollectionDto');
const { assignTemplates } = require('../../../utils/assignTemplates');
const {
prepareNameForScriptFormat,
getSchemaOfAlterCollection,
getNamePrefixedWithSchemaNameForScriptFormat,
} = require('../../../utils/general');
const templates = require('../../../ddlProvider/templates');

/**
* @param {object} params
* @property {string} params.scriptFormat
* @property {AlterCollectionDto} params.collection
* @return {AlterScriptDto}
*/
const getRenameCollectionScriptDto = ({ scriptFormat, collection }) => {
const collectionName = collection?.role?.compMod?.collectionName;

if (!collectionName) {
return undefined;
}

const { old: name, new: newName } = collectionName;

if (!newName || newName === name) {
return undefined;
}

const collectionSchema = getSchemaOfAlterCollection(collection);
const bucketName = collectionSchema.compMod?.keyspaceName;

const fullTableName = getNamePrefixedWithSchemaNameForScriptFormat(scriptFormat)(name, bucketName);

const script = assignTemplates(templates.renameTable, {
tableName: fullTableName,
newName: prepareNameForScriptFormat(scriptFormat)(newName),
});

return AlterScriptDto.getInstance([script], true, false);
};

/**
* @param {object} params
* @param {string} params.scriptFormat
* @param {AlterCollectionDto} params.collection
* @return {Array<AlterScriptDto>}
* */
const getModifyCollectionNameScriptDtos = ({ scriptFormat, collection }) => {
const renameEntityScript = getRenameCollectionScriptDto({ scriptFormat, collection });

return [renameEntityScript];
};

module.exports = {
getModifyCollectionNameScriptDtos,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const { AlterScriptDto } = require('../../types/AlterScriptDto');
const { AlterCollectionDto } = require('../../types/AlterCollectionDto');
const { assignTemplates } = require('../../../utils/assignTemplates');
const { prepareNameForScriptFormat } = require('../../../utils/general');
const templates = require('../../../ddlProvider/templates');

/**
* @param {object} params
* @property {string} params.scriptFormat
* @property {AlterCollectionDto} params.entity
* @return {AlterScriptDto}
*/
const getRenameEntityScriptDto = ({ scriptFormat, entity }) => {
const entityName = entity?.role?.compMod?.name;

if (!entityName) {
return undefined;
}

const { old: name, new: newName } = entityName;

if (!newName || newName === name) {
return undefined;
}

const renameScript = assignTemplates(templates.renameEntity, {
name: prepareNameForScriptFormat(scriptFormat)(name),
newName: prepareNameForScriptFormat(scriptFormat)(newName),
});

const schemaName = prepareNameForScriptFormat(scriptFormat)(entity.role.compMod.keyspaceName);

const alterSessionScript = assignTemplates(templates.alterSession, {
schemaName,
});

return AlterScriptDto.getInstance([alterSessionScript, renameScript], true, false);
};

/**
* @param {object} params
* @param {string} params.scriptFormat
* @param {AlterCollectionDto} params.entity
* @return {Array<AlterScriptDto>}
* */
const getModifyEntityNameScriptDtos = ({ scriptFormat, entity }) => {
const renameEntityScript = getRenameEntityScriptDto({ scriptFormat, entity });

return [renameEntityScript].filter(Boolean);
};

module.exports = {
getModifyEntityNameScriptDtos,
};
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ module.exports = ({ templates, assignTemplates, getNamePrefixedWithSchemaName, w
*/
const configs = [
{ key: 'options', value: options, name: fullName, template: templates.alterSequence },
{ key: 'newName', value: newName, name: wrappedSequenceName, template: templates.renameSequence },
{ key: 'newName', value: newName, name: wrappedSequenceName, template: templates.renameEntity },
];

return configs
Expand Down
6 changes: 5 additions & 1 deletion forward_engineering/ddlProvider/templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ module.exports = {

dropSequence: 'DROP SEQUENCE${ifExists} ${name};\n',

renameSequence: 'RENAME ${name} TO ${newName};\n',
// works for tables, views, sequences, synonyms, and private user-owned objects
// Note: can't have full path, prefixed with schema name. Only works on objects in your current schema.
renameEntity: 'RENAME ${name} TO ${newName};\n',

renameTable: 'ALTER TABLE ${tableName} RENAME TO ${newName};\n',

alterSequence: 'ALTER SEQUENCE${ifExists} ${name}' + '${options};\n',

Expand Down