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
11 changes: 11 additions & 0 deletions api/fe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const { generateScript } = require('../forward_engineering/generateScript');
const { generateViewScript } = require('../forward_engineering/generateViewScript');
const { generateContainerScript } = require('../forward_engineering/generateContainerScript');
const { isDropInStatements } = require('../forward_engineering/isDropInStatements');

module.exports = {
generateScript,
generateViewScript,
generateContainerScript,
isDropInStatements,
};
9 changes: 9 additions & 0 deletions esbuild.package.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const fs = require('fs');
const path = require('path');
const esbuild = require('esbuild');
const { clean } = require('esbuild-plugin-clean');
const { copy } = require('esbuild-plugin-copy');
const { copyFolderFiles, addReleaseFlag } = require('@hackolade/hck-esbuild-plugins-pack');
const { EXCLUDED_EXTENSIONS, EXCLUDED_FILES, DEFAULT_RELEASE_FOLDER_PATH } = require('./buildConstants');

Expand All @@ -11,6 +12,7 @@ const RELEASE_FOLDER_PATH = path.join(DEFAULT_RELEASE_FOLDER_PATH, `${packageDat
esbuild
.build({
entryPoints: [
path.resolve(__dirname, 'api', 'fe.js'),
path.resolve(__dirname, 'forward_engineering', 'api.js'),
path.resolve(__dirname, 'forward_engineering', 'ddlProvider', 'ddlProvider.js'),
path.resolve(__dirname, 'reverse_engineering', 'api.js'),
Expand All @@ -22,10 +24,17 @@ esbuild
outdir: RELEASE_FOLDER_PATH,
minify: true,
logLevel: 'info',
external: ['lodash'],
plugins: [
clean({
patterns: [DEFAULT_RELEASE_FOLDER_PATH],
}),
copy({
assets: {
from: [path.join('node_modules', 'lodash', '**', '*')],
to: [path.join('node_modules', 'lodash')],
},
}),
copyFolderFiles({
fromPath: __dirname,
targetFolderPath: RELEASE_FOLDER_PATH,
Expand Down
217 changes: 8 additions & 209 deletions forward_engineering/api.js
Original file line number Diff line number Diff line change
@@ -1,183 +1,14 @@
'use strict';

const {
retrieveContainerName,
retrieveEntityName,
retrieveUDA,
retrieveUDF,
retrieveIndexes,
retrieveIsItemActivated,
commentDeactivatedStatement,
getUserDefinedAggregations,
getUserDefinedFunctions,
} = require('./helpers/generalHelper');
const { getTableStatement } = require('./helpers/tableHelper');
const { sortUdt, getUdtMap, getUdtScripts, prepareDefinitions } = require('./helpers/udtHelper');
const { getIndexes } = require('./helpers/indexHelper');
const { getKeyspaceStatement } = require('./helpers/keyspaceHelper');
const { getViewScript } = require('./helpers/viewHelper');
const { getCreateTableScript } = require('./helpers/createHelper');
const { setDependencies } = require('./helpers/appDependencies');
const { applyToInstance, testConnection } = require('./helpers/dbConnectionService/index');
const { getScriptOptions } = require('./helpers/getScriptOptions');
const { buildContainerLevelAlterScript, isDropInStatements } = require('./helpers/alterScriptBuilder');
const { generateScript } = require('./generateScript');
const { generateViewScript } = require('./generateViewScript');
const { generateContainerScript } = require('./generateContainerScript');
const { isDropInStatements } = require('./isDropInStatements');

module.exports = {
generateScript(data, logger, callback, app) {
try {
setDependencies(app);
const { udtTypeMap, modelDefinitions, externalDefinitions } = prepareDefinitions(data);
const jsonSchema = JSON.parse(data.jsonSchema);
const internalDefinitions = sortUdt(JSON.parse(data.internalDefinitions));
data = { ...data, jsonSchema, udtTypeMap, modelDefinitions, externalDefinitions, internalDefinitions };

if (data.isUpdateScript) {
data.scriptOptions = getScriptOptions(data);

callback(null, buildContainerLevelAlterScript(data.jsonSchema, udtTypeMap, data));
} else {
const isKeyspaceActivated = retrieveIsItemActivated(data.containerData);
const statement = `${getKeyspaceStatement(data.containerData)}\n\n${getCreateTableScript(data, isKeyspaceActivated)}`;
const script = commentDeactivatedStatement(statement, isKeyspaceActivated);
callback(null, script);
}
} catch (e) {
logger.log('error', { message: e.message, stack: e.stack }, 'Cassandra Forward-Engineering Error');

setTimeout(() => {
callback({ message: e.message, stack: e.stack });
}, 150);
}
},

generateViewScript(data, logger, callback, app) {
setDependencies(app);
const viewSchema = JSON.parse(data.jsonSchema || '{}');
const entitySchema = JSON.parse(data.jsonSchema[viewSchema.viewOn] || '{}');

const script = getViewScript({
schema: viewSchema,
entitySchema,
viewData: data.viewData,
entityData: data.entityData,
containerData: data.containerData,
collectionRefsDefinitionsMap: data.collectionRefsDefinitionsMap,
ifNotExist: viewSchema.viewIfNotExist,
});

callback(null, script);
},

generateContainerScript(data, logger, callback, app) {
try {
setDependencies(app);
if (data.isUpdateScript) {
const { udtTypeMap, modelDefinitions, externalDefinitions } = prepareDefinitions(data);
data = { ...data, udtTypeMap, modelDefinitions, externalDefinitions };
data.scriptOptions = getScriptOptions(data);

const scripts = data.entities.map(entityId => {
const jsonSchema = JSON.parse(data.jsonSchema[entityId]);
data.internalDefinitions = sortUdt(JSON.parse(data.internalDefinitions[entityId]));
return buildContainerLevelAlterScript(jsonSchema, data.udtTypeMap, data);
});
callback(null, scripts.filter(Boolean).join('\n\n'));
} else {
const modelDefinitions = sortUdt(JSON.parse(data.modelDefinitions));
const externalDefinitions = JSON.parse(data.externalDefinitions);
const containerData = data.containerData;
let cqlScriptData = [];

const containerName = retrieveContainerName(containerData);
const keyspace = getKeyspaceStatement(containerData);
const isKeyspaceActivated = retrieveIsItemActivated(containerData);

const generalUdtTypeMap = getUdtMap([modelDefinitions, externalDefinitions]);
let generalUDT = getUdtScripts(
containerName,
[externalDefinitions, modelDefinitions],
generalUdtTypeMap,
isKeyspaceActivated,
);

const UDF = getUserDefinedFunctions(retrieveUDF(containerData));
const UDA = getUserDefinedAggregations(retrieveUDA(containerData));

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

cqlScriptData.push(keyspace, ...generalUDT);

data.entities.forEach(entityId => {
const internalDefinitions = sortUdt(JSON.parse(data.internalDefinitions[entityId]));
const jsonSchema = JSON.parse(data.jsonSchema[entityId]);
const entityData = data.entityData[entityId];
const udtTypeMap = Object.assign(
{},
generalUdtTypeMap,
getUdtMap([internalDefinitions, jsonSchema]),
);

const entityName = retrieveEntityName(entityData);
const isEntityActivated = retrieveIsItemActivated(entityData);
const dataSources = [jsonSchema, modelDefinitions, internalDefinitions, externalDefinitions];
const internalUdt = getUdtScripts(
containerName,
[internalDefinitions, jsonSchema],
udtTypeMap,
isKeyspaceActivated && isEntityActivated,
).map(udtStatement =>
commentDeactivatedStatement(udtStatement, isEntityActivated, isKeyspaceActivated),
);

const table = getTableStatement({
tableData: jsonSchema,
tableMetaData: entityData,
keyspaceMetaData: containerData,
dataSources,
udtTypeMap,
isKeyspaceActivated,
});
const indexes = getIndexes(
retrieveIndexes(entityData, dbVersion),
dataSources,
entityName,
containerName,
isEntityActivated,
isKeyspaceActivated,
dbVersion,
);

cqlScriptData.push(...internalUdt, table, indexes);
});

cqlScriptData = cqlScriptData.concat(
data.views.map(viewId => {
const viewSchema = JSON.parse(data.jsonSchema[viewId] || '{}');

return getViewScript({
schema: viewSchema,
viewData: data.viewData[viewId],
entityData: data.entityData[viewSchema.viewOn],
containerData: data.containerData,
collectionRefsDefinitionsMap: data.collectionRefsDefinitionsMap,
isKeyspaceActivated,
ifNotExist: viewSchema.viewIfNotExist,
});
}),
);

cqlScriptData.push(UDF, UDA);

callback(null, commentDeactivatedStatement(getScript(cqlScriptData), isKeyspaceActivated));
}
} catch (e) {
logger.log('error', { message: e.message, stack: e.stack }, 'Cassandra Forward-Engineering Error');

setTimeout(() => {
callback({ message: e.message, stack: e.stack });
}, 150);
}
},
generateScript,
generateViewScript,
generateContainerScript,
isDropInStatements,

applyToInstance(connectionInfo, logger, callback, app) {
logger.clear();
Expand All @@ -195,36 +26,4 @@ module.exports = {
testConnection(connectionInfo, logger, callback, app) {
testConnection(connectionInfo, app).then(callback, callback);
},

isDropInStatements(data, logger, callback, app) {
try {
setDependencies(app);
let result;
const { udtTypeMap, modelDefinitions, externalDefinitions } = prepareDefinitions(data);

if (data.level === 'container') {
data = { ...data, udtTypeMap, modelDefinitions, externalDefinitions };
result = data.entities
.map(entityId => {
const jsonSchema = JSON.parse(data.jsonSchema[entityId]);
data.internalDefinitions = sortUdt(JSON.parse(data.internalDefinitions[entityId]));
return isDropInStatements(jsonSchema, data.udtTypeMap, data);
})
.some(Boolean);
} else if (data.level === 'entity') {
const jsonSchema = JSON.parse(data.jsonSchema);
const internalDefinitions = sortUdt(JSON.parse(data.internalDefinitions));
data = { ...data, udtTypeMap, modelDefinitions, externalDefinitions, jsonSchema, internalDefinitions };
result = isDropInStatements(data.jsonSchema, data.udtTypeMap, data);
}

callback(null, result);
} catch (e) {
callback({ message: e.message, stack: e.stack });
}
},
};

const getScript = structure => {
return structure.filter(item => item).join('\n\n');
};
5 changes: 2 additions & 3 deletions forward_engineering/ddlProvider/ddlProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,14 @@ const { parseToString } = require('../helpers/tableOptionService/parseToString')
const { getViewName } = require('../helpers/updateHelpers/viewHelper');
const { getOptionsScript } = require('../helpers/viewHelper');
const { wrapInQuotes } = require('../helpers/updateHelpers/generalHelper');
const assignTemplates = require('../utils/assignTemplates');

const alterTablePrefix = (tableName, keySpace) =>
keySpace
? `ALTER TABLE ${wrapInQuotes(keySpace)}.${wrapInQuotes(tableName)}`
: `ALTER TABLE ${wrapInQuotes(tableName)}`;

module.exports = app => {
const { assignTemplates } = app.require('@hackolade/ddl-fe-utils');

module.exports = () => {
return {
dropTable(name) {
return assignTemplates(templates.dropTable, { name });
Expand Down
Loading
Loading