diff --git a/forward_engineering/helpers/scriptBuilder/feScriptBuilder.js b/forward_engineering/helpers/scriptBuilder/feScriptBuilder.js index 27c1746..c6696c5 100644 --- a/forward_engineering/helpers/scriptBuilder/feScriptBuilder.js +++ b/forward_engineering/helpers/scriptBuilder/feScriptBuilder.js @@ -43,7 +43,7 @@ const _ = require('lodash'); const { getDatabaseStatement, getUseCatalogStatement } = require('../databaseHelper'); -const { getTableStatement } = require('../tableHelper'); +const { getTableStatement, sortEntitiesByStreaming } = require('../tableHelper'); const { getIndexes } = require('../indexHelper'); const { buildScript, @@ -147,7 +147,9 @@ const getContainerLevelEntitiesScriptDtos = relatedSchemas: relatedSchemas, }); - for (const entityId of data.entities) { + const sortedEntities = sortEntitiesByStreaming(data.entities, data.entityData); + + for (const entityId of sortedEntities) { const entityData = data.entityData[entityId]; const tableData = getTab(0, entityData); const dbVersion = data.modelData[0].dbVersion; diff --git a/forward_engineering/helpers/tableHelper.js b/forward_engineering/helpers/tableHelper.js index 01e40b5..dcb3941 100644 --- a/forward_engineering/helpers/tableHelper.js +++ b/forward_engineering/helpers/tableHelper.js @@ -816,6 +816,31 @@ const getCreateStreamingStatement = ({ )(true, ';')(); }; +/** + * Sorts entities to ensure Standard tables are processed before Streaming tables. + * This prevents dependency errors when a Streaming table reads from a Standard table. + * * @param {Array} entities - Array of entity IDs + * @param {Object} entityData - Object containing entity data + * @returns {Array} Sorted array of entity IDs + */ +const sortEntitiesByStreaming = (entities, entityData) => { + if (!entities || !entityData) return []; + + return [...entities].sort((aId, bId) => { + const tableDataA = getTab(0, entityData[aId]); + const tableDataB = getTab(0, entityData[bId]); + + const isStreamingA = Boolean(tableDataA?.streamingTable); + const isStreamingB = Boolean(tableDataB?.streamingTable); + + if (isStreamingA === isStreamingB) { + return 0; + } + + return isStreamingA ? 1 : -1; + }); +}; + module.exports = { getTableStatement, getTablePropertiesClause, @@ -825,4 +850,5 @@ module.exports = { getPartitionKeyStatement, getClusteringKeys, getPartitionsKeys, + sortEntitiesByStreaming, };