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
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { getFullName } = require('../../helpers/utils');
const { checkCompModEqual, getCompMod } = require('./common');
const { getModifyContainerOptionsScript } = require('./containerHelper/optionsHelper');

module.exports = (app, options) => {
const _ = app.require('lodash');
Expand All @@ -20,26 +21,10 @@ module.exports = (app, options) => {
return ddlProvider.dropDatabase(fullName);
};

const getModifiedContainer = modelData => containerData => {
const compMod = getCompMod(containerData);
const optionsProperties = [
'businessName',
'description',
'customerEncryptionKey',
'defaultExpiration',
'labels',
];

const isAnyOptionChanged = _.some(optionsProperties, property => checkCompModEqual(compMod[property] ?? {}));

if (!isAnyOptionChanged) {
return '';
}

const constructedDbData = getDbData([containerData]);
const dbData = ddlProvider.hydrateSchema(constructedDbData, { modelData });

return ddlProvider.alterDatabase(dbData);
const getModifiedContainer = modelData => jsonSchema => {
const containerData = getDbData([jsonSchema]);
const modifyContainerOptionsScript = getModifyContainerOptionsScript({ app, jsonSchema, containerData });
return modifyContainerOptionsScript;
};

return {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
const { getName, getFullName } = require('../../helpers/utils');
const { checkCompModEqual, getCompMod, setEntityKeys } = require('./common');
const { getModifyViewOptionsScript } = require('./viewHelpers/optionsHelper');

module.exports = (app, options) => {
const _ = app.require('lodash');
Expand Down Expand Up @@ -32,31 +34,17 @@ module.exports = (app, options) => {
};

const getModifiedViewScript = modelData => jsonSchema => {
const view = _.omit(jsonSchema, 'timeUnitpartitionKey', 'clusteringKey', 'rangePartitionKey');
const idToNameHashTable = generateIdToNameHashTable(view);
const idToActivatedHashTable = generateIdToActivatedHashTable(view);
const viewSchema = setEntityKeys({ idToActivatedHashTable, idToNameHashTable, entity: view });
const dbData = { databaseName: viewSchema.compMod.keyspaceName, projectId: _.first(modelData)?.projectId };
const dbData = { databaseName: jsonSchema.compMod.keyspaceName, projectId: _.first(modelData)?.projectId };
const viewName = getName(jsonSchema);
const fullTableName = getFullName(dbData.projectId, dbData.databaseName, viewName);

const viewData = {
name: viewSchema.code || viewSchema.name,
keys: getKeys(viewSchema, viewSchema.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}),
dbData,
name: fullTableName,
};

const optionsProperties = viewSchema.materialized
? ['enableRefresh', 'refreshInterval', 'expiration', 'businessName', 'description', 'labels']
: ['expiration', 'businessName', 'description', 'labels'];

const compMod = getCompMod(view);
const isAnyOptionChanged = _.some(optionsProperties, property => !checkCompModEqual(compMod[property]));

if (!isAnyOptionChanged) {
return '';
}

const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] });
const modifyViewOptionsScript = getModifyViewOptionsScript({ app, jsonSchema, viewData });

return ddlProvider.alterView(hydratedView, dbData);
return modifyViewOptionsScript;
};

const getKeys = (viewSchema, collectionRefsDefinitionsMap) => {
Expand Down
50 changes: 50 additions & 0 deletions forward_engineering/alterScript/alterScriptHelpers/common.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const { escapeQuotes, getTimestamp, getName } = require('../../helpers/utils');
const _ = require('lodash');

const getCompMod = containerData => containerData.role?.compMod ?? {};
Expand Down Expand Up @@ -33,8 +34,57 @@ const setEntityKeys = ({ idToNameHashTable, idToActivatedHashTable, entity }) =>
};
};

const getModifyOptions = ({ jsonSchema, app, options }) => {
const { tab } = app.require('@hackolade/ddl-fe-utils').general;
const { getLabels } = require('../../helpers/general')(app);
const optionsToUpdate = [];

Object.entries(options).forEach(([customOptionName, columnOptionName]) => {
const { new: newOptionValue, old: oldOptionValue } = jsonSchema.role.compMod[customOptionName] || {};

if (!_.isEqual(newOptionValue, oldOptionValue)) {
switch (customOptionName) {
case 'businessName': {
const name = getName(jsonSchema.role);
if (name !== newOptionValue) {
const value = newOptionValue ? `"${newOptionValue}"` : 'NULL';
optionsToUpdate.push(`${columnOptionName}=${value}`);
}
break;
}
case 'description': {
const value = newOptionValue ? `"${escapeQuotes(newOptionValue)}"` : 'NULL';
optionsToUpdate.push(`${columnOptionName}=${value}`);
break;
}
case 'expiration': {
const value = newOptionValue ? `TIMESTAMP "${getTimestamp(newOptionValue)}"` : 'NULL';
optionsToUpdate.push(`${columnOptionName}=${value}`);
break;
}
case 'labels': {
const value = newOptionValue.length ? `[\n${tab(getLabels(newOptionValue))}\n]` : 'NULL';
optionsToUpdate.push(`labels=${value}`);
break;
}
default: {
const value = newOptionValue === undefined || newOptionValue === '' ? 'NULL' : newOptionValue;
optionsToUpdate.push(`${columnOptionName}=${value}`);
}
}
}
});

if (!optionsToUpdate.length) {
return '';
}

return tab(optionsToUpdate.join(',\n'));
};

module.exports = {
getCompMod,
checkCompModEqual,
setEntityKeys,
getModifyOptions,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const _ = require('lodash');
const { wrapByBackticks } = require('../../../helpers/utils');
const templates = require('../../../configs/templates');
const { getModifyOptions } = require('../common');

const options = {
businessName: 'friendly_name',
description: 'description',
customerEncryptionKey: 'default_kms_key_name',
defaultExpiration: 'default_table_expiration_days',
labels: 'labels',
};

const getModifyContainerOptionsScript = ({ jsonSchema, containerData, app }) => {
const { assignTemplates } = app.require('@hackolade/ddl-fe-utils');
const optionsToUpdate = getModifyOptions({ jsonSchema, app, options });

if (!optionsToUpdate) {
return '';
}

return assignTemplates(templates.alterDatabaseOptions, {
name: wrapByBackticks(containerData.name),
options: optionsToUpdate,
});
};

module.exports = {
getModifyContainerOptionsScript,
};
Original file line number Diff line number Diff line change
@@ -1,56 +1,27 @@
const _ = require('lodash');
const { wrapByBackticks, getFullName, escapeQuotes, getTimestamp } = require('../../../helpers/utils');
const templates = require('../../../configs/templates');
const { getModifyOptions } = require('../common');

const columnOptions = {
'description': 'description',
'partitioningFilterRequired': 'require_partition_filter',
'expiration': 'expiration_timestamp',
'customerEncryptionKey': 'kms_key_name',
'labels': 'labels',
const options = {
businessName: 'friendly_name',
description: 'description',
partitioningFilterRequired: 'require_partition_filter',
expiration: 'expiration_timestamp',
customerEncryptionKey: 'kms_key_name',
labels: 'labels',
};

const getModifyCollectionOptionsScript = ({ jsonSchema, tableData, app }) => {
const { assignTemplates } = app.require('@hackolade/ddl-fe-utils');
const { tab } = app.require('@hackolade/ddl-fe-utils').general;
const { getLabels } = require('../../../helpers/general')(app);
const optionsToUpdate = [];
const optionsToUpdate = getModifyOptions({ jsonSchema, app, options });

Object.entries(columnOptions).forEach(([customOptionName, columnOptionName]) => {
const { new: newOptionValue, old: oldOptionValue } = jsonSchema.compMod[customOptionName] || {};

if (!_.isEqual(newOptionValue, oldOptionValue)) {
switch (customOptionName) {
case 'description': {
const value = newOptionValue ? `"${escapeQuotes(newOptionValue)}"` : 'NULL';
optionsToUpdate.push(`description=${value}`);
break;
}
case 'expiration': {
const value = newOptionValue ? `TIMESTAMP "${getTimestamp(newOptionValue)}"` : 'NULL';
optionsToUpdate.push(`${columnOptionName}=${value}`);
break;
}
case 'labels': {
const value = newOptionValue.length ? `[\n${tab(getLabels(newOptionValue))}\n]` : 'NULL';
optionsToUpdate.push(`labels=${value}`);
break;
}
default: {
const value = newOptionValue === undefined || newOptionValue === '' ? 'NULL' : newOptionValue;
optionsToUpdate.push(`${columnOptionName}=${value}`);
}
}
}
});

if (!optionsToUpdate.length) {
if (!optionsToUpdate) {
return '';
}

return assignTemplates(templates.alterTableSetOptions, {
tableName: tableData.name,
options: tab(optionsToUpdate.join(',\n')),
options: optionsToUpdate,
});
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const _ = require('lodash');
const templates = require('../../../configs/templates');
const { getModifyOptions } = require('../common');

const viewOptions = {
businessName: 'friendly_name',
description: 'description',
expiration: 'expiration_timestamp',
labels: 'labels',
};

const materializedViewOptions = {
...viewOptions,
enableRefresh: 'enable_refresh',
refreshInterval: 'refresh_interval_minutes',
maxStaleness: 'max_staleness',
allowNonIncrementalDefinition: 'allow_non_incremental_definition',
};

const getModifyViewOptionsScript = ({ jsonSchema, viewData, app }) => {
const { assignTemplates } = app.require('@hackolade/ddl-fe-utils');
const options = jsonSchema.materialized ? materializedViewOptions : viewOptions;
const optionsToUpdate = getModifyOptions({ jsonSchema, app, options });

if (!optionsToUpdate) {
return '';
}

return assignTemplates(templates.alterViewOptions, {
materialized: jsonSchema.materialized ? 'MATERIALIZED ' : '',
name: viewData.name,
options: optionsToUpdate,
});
};

module.exports = {
getModifyViewOptionsScript,
};
Loading