Skip to content

Commit 27671b7

Browse files
HCK-14214: script generation options for NOT NULL (#66)
<!--do not remove this marker, its needed to replace info when ticket title is updated --> <!--jira-description-action-hidden-marker-start--> <table> <td> <a href="https://hackolade.atlassian.net/browse/HCK-14214" title="HCK-14214" target="_blank"><img alt="Sub-task" src="https://hackolade.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium" />HCK-14214</a> [DB2] Enable script generation options for Not null </td></table> <br /> <!--jira-description-action-hidden-marker-end--> ## Content You have no Jira task for this PR? Describe your changes here... ... ## Technical details You feel the need to provide technical explanations? You can do it here... ...
1 parent 6be916a commit 27671b7

File tree

6 files changed

+123
-57
lines changed

6 files changed

+123
-57
lines changed

forward_engineering/alterScript/alterScriptFromDeltaHelper.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,9 @@ const getAlterCollectionScriptDtos = ({
2424
item => Object.values(item.properties)[0],
2525
);
2626

27-
const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos({ dbVersion }));
27+
const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos);
2828
const modifyCollectionKeysScriptDtos = modifyScriptsData.flatMap(getModifyCollectionKeysScriptDtos);
29-
30-
const modifyColumnScriptDtos = modifyScriptsData.flatMap(
31-
getModifyColumnScriptDtos({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }),
32-
);
29+
const modifyColumnScriptDtos = modifyScriptsData.flatMap(getModifyColumnScriptDtos);
3330

3431
return [...modifyCollectionScriptDtos, ...modifyColumnScriptDtos, ...modifyCollectionKeysScriptDtos].filter(
3532
Boolean,

forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1+
const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper');
12
const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper');
23

3-
const getModifyCollectionScriptDtos =
4-
({}) =>
5-
collection => {
6-
// const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(...);
7-
// const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos(...);
8-
return [
9-
// ...modifyCheckConstraintScriptDtos,
10-
// ...modifyCommentScriptDtos,
11-
].filter(Boolean);
12-
};
4+
const getModifyCollectionScriptDtos = collection => {
5+
// const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(...);
6+
// const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos(...);
7+
return [
8+
// ...modifyCheckConstraintScriptDtos,
9+
// ...modifyCommentScriptDtos,
10+
].filter(Boolean);
11+
};
1312

1413
const getModifyCollectionKeysScriptDtos = collection => {
1514
const modifyPkConstraintDtos = getModifyPkConstraintsScriptDtos(collection);
@@ -20,19 +19,17 @@ const getModifyCollectionKeysScriptDtos = collection => {
2019
].filter(Boolean);
2120
};
2221

23-
const getModifyColumnScriptDtos =
24-
({}) =>
25-
collection => {
26-
// const modifyNotNullScriptDtos = getModifyNonNullColumnScriptDtos(...);
27-
// const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(...);
28-
// const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos(...);
22+
const getModifyColumnScriptDtos = collection => {
23+
const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos(collection);
24+
// const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(...);
25+
// const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos(...);
2926

30-
return [
31-
// ...modifyNotNullScriptDtos,
32-
// ...modifyDefaultColumnValueScriptDtos,
33-
// ...modifyCommentScriptDtos,
34-
].filter(Boolean);
35-
};
27+
return [
28+
...modifyNotNullScriptDtos,
29+
// ...modifyDefaultColumnValueScriptDtos,
30+
// ...modifyCommentScriptDtos,
31+
].filter(Boolean);
32+
};
3633

3734
module.exports = {
3835
getModifyCollectionScriptDtos,
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
const _ = require('lodash');
2+
const { AlterScriptDto } = require('../../types/AlterScriptDto');
3+
const {
4+
getFullCollectionName,
5+
wrapInQuotes,
6+
isObjectInDeltaModelActivated,
7+
isParentContainerActivated,
8+
getSchemaOfAlterCollection,
9+
} = require('../../../utils/general');
10+
const { assignTemplates } = require('../../../utils/assignTemplates');
11+
const templates = require('../../../ddlProvider/templates');
12+
13+
/**
14+
* @param tableName {string}
15+
* @param columnName {string}
16+
* @return string
17+
* */
18+
const setNotNullConstraint = (tableName, columnName) => {
19+
return assignTemplates({
20+
template: templates.alterNotNull,
21+
templateData: {
22+
tableName,
23+
columnName,
24+
},
25+
});
26+
};
27+
28+
/**
29+
* @param tableName {string}
30+
* @param columnName {string}
31+
* @return string
32+
* */
33+
const dropNotNullConstraint = (tableName, columnName) => {
34+
return assignTemplates({
35+
template: templates.dropNotNull,
36+
templateData: {
37+
tableName,
38+
columnName,
39+
},
40+
});
41+
};
42+
43+
/**
44+
* @param {Object} collection
45+
* @return {AlterScriptDto[]}
46+
* */
47+
const getModifyNonNullColumnsScriptDtos = collection => {
48+
const collectionSchema = getSchemaOfAlterCollection(collection);
49+
const fullTableName = getFullCollectionName(collectionSchema);
50+
51+
const isContainerActivated = isParentContainerActivated(collection);
52+
const isCollectionActivated = isObjectInDeltaModelActivated(collection);
53+
54+
const currentRequiredColumnNames = collection.required || [];
55+
const previousRequiredColumnNames = collection.role.required || [];
56+
57+
const columnNamesToAddNotNullConstraint = _.difference(currentRequiredColumnNames, previousRequiredColumnNames);
58+
const columnNamesToRemoveNotNullConstraint = _.difference(previousRequiredColumnNames, currentRequiredColumnNames);
59+
60+
const addNotNullConstraintsScript = _.toPairs(collection.properties)
61+
.filter(([name, jsonSchema]) => {
62+
const oldName = jsonSchema.compMod.oldField.name;
63+
const shouldRemoveForOldName = columnNamesToRemoveNotNullConstraint.includes(oldName);
64+
const shouldAddForNewName = columnNamesToAddNotNullConstraint.includes(name);
65+
return shouldAddForNewName && !shouldRemoveForOldName;
66+
})
67+
.map(([name, jsonSchema]) => {
68+
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
69+
return { script: setNotNullConstraint(fullTableName, wrapInQuotes({ name })), isActivated };
70+
})
71+
.map(({ script, isActivated }) => AlterScriptDto.getInstance([script], isActivated, false));
72+
73+
const removeNotNullConstraint = _.toPairs(collection.properties)
74+
.filter(([name, jsonSchema]) => {
75+
const oldName = jsonSchema.compMod.oldField.name;
76+
const shouldRemoveForOldName = columnNamesToRemoveNotNullConstraint.includes(oldName);
77+
const shouldAddForNewName = columnNamesToAddNotNullConstraint.includes(name);
78+
return shouldRemoveForOldName && !shouldAddForNewName;
79+
})
80+
.map(([name, jsonSchema]) => {
81+
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
82+
return { script: dropNotNullConstraint(fullTableName, wrapInQuotes({ name })), isActivated };
83+
})
84+
.map(({ script, isActivated }) => AlterScriptDto.getInstance([script], isActivated, true));
85+
86+
return [...addNotNullConstraintsScript, ...removeNotNullConstraint];
87+
};
88+
89+
module.exports = {
90+
getModifyNonNullColumnsScriptDtos,
91+
};

forward_engineering/ddlProvider/templates.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,8 @@ module.exports = {
3232
alterPkConstraint: 'ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} PRIMARY KEY${columns}${options};',
3333

3434
dropPK: 'ALTER TABLE ${tableName} DROP PRIMARY KEY;',
35+
36+
alterNotNull: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET NOT NULL;',
37+
38+
dropNotNull: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP NOT NULL;',
3539
};

forward_engineering/utils/general.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,16 @@ const getColumnsList = (columns, isAllColumnsDeactivated, isParentActivated, map
119119
const toArray = ({ value }) => (Array.isArray(value) ? value : [value]);
120120

121121
const getEntityName = entityData => {
122-
return (entityData && (entityData.code || entityData.collectionName)) || '';
122+
return entityData?.code || entityData?.collectionName || '';
123+
};
124+
125+
const getSchemaNameFromCollection = ({ collection }) => {
126+
return collection.compMod?.keyspaceName;
123127
};
124128

125129
const getFullCollectionName = collectionSchema => {
126130
const name = getEntityName(collectionSchema);
127-
const schemaName = collectionSchema.compMod?.keyspaceName;
131+
const schemaName = getSchemaNameFromCollection({ collection: collectionSchema });
128132
return getNamePrefixedWithSchemaName({ name, schemaName });
129133
};
130134

@@ -160,4 +164,5 @@ module.exports = {
160164
getSchemaOfAlterCollection,
161165
isObjectInDeltaModelActivated,
162166
isParentContainerActivated,
167+
getSchemaNameFromCollection,
163168
};

properties_pane/field_level/fieldLevelConfig.json

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -453,20 +453,6 @@ making sure that you maintain a proper JSON format.
453453
},
454454
"defaultValue": false
455455
},
456-
{
457-
"propertyName": "Not null constraint name",
458-
"propertyKeyword": "notNullConstraintName",
459-
"propertyType": "text",
460-
"dependency": {
461-
"type": "and",
462-
"values": [
463-
{
464-
"key": "required",
465-
"value": true
466-
}
467-
]
468-
}
469-
},
470456
{
471457
"propertyName": "Primary key",
472458
"propertyKeyword": "compositePrimaryKey",
@@ -2949,20 +2935,6 @@ making sure that you maintain a proper JSON format.
29492935
},
29502936
"defaultValue": false
29512937
},
2952-
{
2953-
"propertyName": "Not null constraint name",
2954-
"propertyKeyword": "notNullConstraintName",
2955-
"propertyType": "text",
2956-
"dependency": {
2957-
"type": "and",
2958-
"values": [
2959-
{
2960-
"key": "required",
2961-
"value": true
2962-
}
2963-
]
2964-
}
2965-
},
29662938
"minItems",
29672939
"maxItems",
29682940
"pattern",

0 commit comments

Comments
 (0)