Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HCK-9614: adapt FE to work in the browser #146

Merged
merged 14 commits into from
Jan 24, 2025
Merged
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