From 031d74b39c064710d0db832264afe34c54c09d47 Mon Sep 17 00:00:00 2001 From: Vasil Rangelov Date: Mon, 24 Jun 2019 14:59:07 +0300 Subject: [PATCH 1/3] Added support for detached entities, i.e. entities which are not attached to a schema and database. --- src/Engine.ts | 1 + src/IGenerationOptions.ts | 1 + src/entity.mst | 2 +- src/index.ts | 13 +++++++++++++ src/models/EntityInfo.ts | 1 + test/utils/GeneralTestUtils.ts | 1 + 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Engine.ts b/src/Engine.ts index bf4efe6..671ef82 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -144,6 +144,7 @@ function addImportsAndGenerationOptions( }); element.GenerateConstructor = generationOptions.generateConstructor; element.IsActiveRecord = generationOptions.activeRecord; + element.detached = generationOptions.detached; element.Imports.filter((elem, index, self) => { return index === self.indexOf(elem); }); diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 11a0016..4e2a061 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -11,4 +11,5 @@ export class IGenerationOptions { public generateConstructor: boolean = false; public customNamingStrategyPath: string = ""; public relationIds: boolean = false; + public detached: boolean = false; } diff --git a/src/entity.mst b/src/entity.mst index 5a49072..371ce0e 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -3,7 +3,7 @@ import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne {{/each}} -@Entity("{{sqlEntityName}}"{{#Schema}},{schema:"{{.}}"{{#if ../Database}}, database:"{{../Database}}"{{/if}} } {{/Schema}}) +@Entity("{{sqlEntityName}}"{{#unless detached}}{{#Schema}} ,{schema:"{{.}}"{{#if ../Database}}, database:"{{../Database}}"{{/if}} } {{/Schema}}{{/unless}}) {{#Indexes}}{{^isPrimaryKey}}@Index("{{name}}",[{{#columns}}"{{toPropertyName name}}",{{/columns}}]{{#isUnique}},{unique:true}{{/isUnique}}) {{/isPrimaryKey}}{{/Indexes}}export class {{toEntityName tsEntityName}}{{#IsActiveRecord}} extends BaseEntity{{/IsActiveRecord}} { {{#Columns}} diff --git a/src/index.ts b/src/index.ts index a87cb02..04ed2b5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -157,6 +157,12 @@ function GetUtilParametersByArgs() { default: false, describe: "Generate RelationId fields" }) + .option("detached", { + boolean: true, + default: false, + describe: + "If set, omits database and schema identifier in generated entities" + }) .option("generateConstructor", { boolean: true, default: false, @@ -196,6 +202,7 @@ function GetUtilParametersByArgs() { (generationOptions.noConfigs = argv.noConfig), (generationOptions.propertyVisibility = argv.pv), (generationOptions.relationIds = argv.relationIds), + (generationOptions.detached = argv.detached), (generationOptions.resultsPath = argv.o ? argv.o.toString() : null); return { driver, connectionOptions, generationOptions }; @@ -339,6 +346,11 @@ async function GetUtilParametersByInquirer() { name: "Generate RelationId fields", value: "relationId" }, + { + name: + "Omit schema qualifier, allowing you to switch it at runtime", + value: "detached" + }, { name: "Generate constructor allowing partial initialization", @@ -360,6 +372,7 @@ async function GetUtilParametersByInquirer() { "activeRecord" ); generationOptions.relationIds = customizations.includes("relationId"); + generationOptions.detached = customizations.includes("detached"); generationOptions.generateConstructor = customizations.includes( "constructor" ); diff --git a/src/models/EntityInfo.ts b/src/models/EntityInfo.ts index 50592bc..afac0f5 100644 --- a/src/models/EntityInfo.ts +++ b/src/models/EntityInfo.ts @@ -10,6 +10,7 @@ export class EntityInfo { public Indexes: IndexInfo[]; public Schema: string; public GenerateConstructor: boolean; + public detached: boolean; public IsActiveRecord: boolean; public Database: string; diff --git a/test/utils/GeneralTestUtils.ts b/test/utils/GeneralTestUtils.ts index b85b720..36b71f0 100644 --- a/test/utils/GeneralTestUtils.ts +++ b/test/utils/GeneralTestUtils.ts @@ -24,6 +24,7 @@ export function getGenerationOptions(resultsPath: string): IGenerationOptions { generateConstructor: false, customNamingStrategyPath: "", relationIds: false, + detached: false, activeRecord: false } } From 9d49fd3ee7a3479d376604a711bae2719ee409bb Mon Sep 17 00:00:00 2001 From: Kononnable Date: Mon, 19 Aug 2019 21:45:12 +0200 Subject: [PATCH 2/3] disable generating complex relationships until they're not generated completly --- src/drivers/AbstractDriver.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/drivers/AbstractDriver.ts b/src/drivers/AbstractDriver.ts index 9bb27cf..b7366a9 100644 --- a/src/drivers/AbstractDriver.ts +++ b/src/drivers/AbstractDriver.ts @@ -216,6 +216,33 @@ export default abstract class AbstractDriver { entities: EntityInfo[] ) { relationsTemp.forEach(relationTmp => { + if (relationTmp.ownerColumnsNames.length > 1) { + const relatedTable = entities.find( + entity => entity.tsEntityName === relationTmp.ownerTable + )!; + if ( + relatedTable.Columns.length !== + relationTmp.ownerColumnsNames.length * 2 + ) { + TomgUtils.LogError( + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} wasn't generated correctly - complex relationships aren't supported yet.` + ); + return; + } + + const secondRelation = relationsTemp.find( + relation => + relation.ownerTable === relatedTable.tsEntityName && + relation.referencedTable !== relationTmp.referencedTable + )!; + if (!secondRelation) { + TomgUtils.LogError( + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} wasn't generated correctly - complex relationships aren't supported yet.` + ); + return; + } + } + const ownerEntity = entities.find( entitity => entitity.tsEntityName === relationTmp.ownerTable ); From 130be42f251ae86ad4dee792cb3016b8c3c5f47c Mon Sep 17 00:00:00 2001 From: Kononnable Date: Wed, 21 Aug 2019 18:50:07 +0200 Subject: [PATCH 3/3] change param name to skipSchema --- src/Engine.ts | 5 ++++- src/IGenerationOptions.ts | 2 +- src/drivers/AbstractDriver.ts | 24 ++++-------------------- src/drivers/MssqlDriver.ts | 6 +----- src/drivers/MysqlDriver.ts | 6 +----- src/drivers/OracleDriver.ts | 8 ++------ src/drivers/PostgresDriver.ts | 12 ++---------- src/drivers/SqliteDriver.ts | 6 +----- src/entity.mst | 2 +- src/index.ts | 14 ++++++-------- src/models/EntityInfo.ts | 6 ++---- test/utils/GeneralTestUtils.ts | 2 +- 12 files changed, 26 insertions(+), 67 deletions(-) diff --git a/src/Engine.ts b/src/Engine.ts index 8384fe6..af444af 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -143,10 +143,13 @@ function addImportsAndGenerationOptions( }); element.GenerateConstructor = generationOptions.generateConstructor; element.IsActiveRecord = generationOptions.activeRecord; - element.detached = generationOptions.detached; element.Imports.filter((elem, index, self) => { return index === self.indexOf(elem); }); + if (generationOptions.skipSchema) { + element.Schema = undefined; + element.Database = undefined; + } }); return dbModel; } diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 7eaaa3d..94f8750 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -22,5 +22,5 @@ export default class IGenerationOptions { public relationIds: boolean = false; - public detached: boolean = false; + public skipSchema: boolean = false; } diff --git a/src/drivers/AbstractDriver.ts b/src/drivers/AbstractDriver.ts index c5ee74f..9bb27cf 100644 --- a/src/drivers/AbstractDriver.ts +++ b/src/drivers/AbstractDriver.ts @@ -221,9 +221,7 @@ export default abstract class AbstractDriver { ); if (!ownerEntity) { TomgUtils.LogError( - `Relation between tables ${relationTmp.ownerTable} and ${ - relationTmp.referencedTable - } didn't found entity model ${relationTmp.ownerTable}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity model ${relationTmp.ownerTable}.` ); return; } @@ -233,9 +231,7 @@ export default abstract class AbstractDriver { ); if (!referencedEntity) { TomgUtils.LogError( - `Relation between tables ${relationTmp.ownerTable} and ${ - relationTmp.referencedTable - } didn't found entity model ${relationTmp.referencedTable}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity model ${relationTmp.referencedTable}.` ); return; } @@ -251,13 +247,7 @@ export default abstract class AbstractDriver { ); if (!ownerColumn) { TomgUtils.LogError( - `Relation between tables ${ - relationTmp.ownerTable - } and ${ - relationTmp.referencedTable - } didn't found entity column ${ - relationTmp.ownerTable - }.${ownerColumn}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity column ${relationTmp.ownerTable}.${ownerColumn}.` ); return; } @@ -268,13 +258,7 @@ export default abstract class AbstractDriver { ); if (!relatedColumn) { TomgUtils.LogError( - `Relation between tables ${ - relationTmp.ownerTable - } and ${ - relationTmp.referencedTable - } didn't found entity column ${ - relationTmp.referencedTable - }.${relatedColumn}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity column ${relationTmp.referencedTable}.${relatedColumn}.` ); return; } diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts index 9070c7a..2aed97b 100644 --- a/src/drivers/MssqlDriver.ts +++ b/src/drivers/MssqlDriver.ts @@ -191,11 +191,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG break; default: TomgUtils.LogError( - `Unknown column type: ${ - resp.DATA_TYPE - } table name: ${ - resp.TABLE_NAME - } column name: ${resp.COLUMN_NAME}` + `Unknown column type: ${resp.DATA_TYPE} table name: ${resp.TABLE_NAME} column name: ${resp.COLUMN_NAME}` ); break; } diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index 317cf1a..28ee666 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -208,11 +208,7 @@ export default class MysqlDriver extends AbstractDriver { break; default: TomgUtils.LogError( - `Unknown column type: ${ - resp.DATA_TYPE - } table name: ${ - resp.TABLE_NAME - } column name: ${resp.COLUMN_NAME}` + `Unknown column type: ${resp.DATA_TYPE} table name: ${resp.TABLE_NAME} column name: ${resp.COLUMN_NAME}` ); break; } diff --git a/src/drivers/OracleDriver.ts b/src/drivers/OracleDriver.ts index 658db35..2c7a208 100644 --- a/src/drivers/OracleDriver.ts +++ b/src/drivers/OracleDriver.ts @@ -309,9 +309,7 @@ export default class OracleDriver extends AbstractDriver { let config: any; if (connectionOptons.user === String(process.env.ORACLE_UsernameSys)) { config /* Oracle.IConnectionAttributes */ = { - connectString: `${connectionOptons.host}:${ - connectionOptons.port - }/${connectionOptons.databaseName}`, + connectString: `${connectionOptons.host}:${connectionOptons.port}/${connectionOptons.databaseName}`, externalAuth: connectionOptons.ssl, password: connectionOptons.password, privilege: this.Oracle.SYSDBA, @@ -319,9 +317,7 @@ export default class OracleDriver extends AbstractDriver { }; } else { config /* Oracle.IConnectionAttributes */ = { - connectString: `${connectionOptons.host}:${ - connectionOptons.port - }/${connectionOptons.databaseName}`, + connectString: `${connectionOptons.host}:${connectionOptons.port}/${connectionOptons.databaseName}`, externalAuth: connectionOptons.ssl, password: connectionOptons.password, user: connectionOptons.user diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index 82168ba..5ed4b6c 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -102,19 +102,11 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name resp.data_type === "ARRAY" ) { TomgUtils.LogError( - `Unknown ${resp.data_type} column type: ${ - resp.udt_name - } table name: ${ - resp.table_name - } column name: ${resp.column_name}` + `Unknown ${resp.data_type} column type: ${resp.udt_name} table name: ${resp.table_name} column name: ${resp.column_name}` ); } else { TomgUtils.LogError( - `Unknown column type: ${ - resp.data_type - } table name: ${ - resp.table_name - } column name: ${resp.column_name}` + `Unknown column type: ${resp.data_type} table name: ${resp.table_name} column name: ${resp.column_name}` ); } return; diff --git a/src/drivers/SqliteDriver.ts b/src/drivers/SqliteDriver.ts index 1f36721..5dbadc5 100644 --- a/src/drivers/SqliteDriver.ts +++ b/src/drivers/SqliteDriver.ts @@ -163,11 +163,7 @@ export default class SqliteDriver extends AbstractDriver { break; default: TomgUtils.LogError( - `Unknown column type: ${ - colInfo.options.type - } table name: ${ - ent.tsEntityName - } column name: ${resp.name}` + `Unknown column type: ${colInfo.options.type} table name: ${ent.tsEntityName} column name: ${resp.name}` ); break; } diff --git a/src/entity.mst b/src/entity.mst index 7405019..c474516 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -3,7 +3,7 @@ import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne {{/each}} -@Entity("{{sqlEntityName}}"{{#unless detached}}{{#Schema}} ,{schema:"{{.}}"{{#if ../Database}}, database:"{{../Database}}"{{/if}} } {{/Schema}}{{/unless}}) +@Entity("{{sqlEntityName}}"{{#Schema}} ,{schema:"{{.}}"{{#if ../Database}}, database:"{{../Database}}"{{/if}} } {{/Schema}}) {{#Indexes}}{{^isPrimaryKey}}@Index("{{name}}",[{{#columns}}"{{toPropertyName name}}",{{/columns}}]{{#isUnique}},{unique:true}{{/isUnique}}) {{/isPrimaryKey}}{{/Indexes}}export class {{toEntityName tsEntityName}}{{#IsActiveRecord}} extends BaseEntity{{/IsActiveRecord}} { {{#Columns}} diff --git a/src/index.ts b/src/index.ts index 9e01c6e..85a8758 100644 --- a/src/index.ts +++ b/src/index.ts @@ -153,11 +153,10 @@ function GetUtilParametersByArgs() { default: false, describe: "Generate RelationId fields" }) - .option("detached", { + .option("skipSchema", { boolean: true, default: false, - describe: - "If set, omits database and schema identifier in generated entities" + describe: "Omits schema identifier in generated entities" }) .option("generateConstructor", { boolean: true, @@ -200,7 +199,7 @@ function GetUtilParametersByArgs() { generationOptions.noConfigs = argv.noConfig; generationOptions.propertyVisibility = argv.pv; generationOptions.relationIds = argv.relationIds; - generationOptions.detached = argv.detached; + generationOptions.skipSchema = argv.skipSchema; generationOptions.resultsPath = argv.o ? argv.o.toString() : null; return { driver, connectionOptions, generationOptions }; } @@ -370,9 +369,8 @@ async function GetUtilParametersByInquirer() { value: "relationId" }, { - name: - "Omit schema qualifier, allowing you to switch it at runtime", - value: "detached" + name: "Omits schema identifier in generated entities", + value: "skipSchema" }, { name: @@ -407,7 +405,7 @@ async function GetUtilParametersByInquirer() { "activeRecord" ); generationOptions.relationIds = customizations.includes("relationId"); - generationOptions.detached = customizations.includes("detached"); + generationOptions.skipSchema = customizations.includes("skipSchema"); generationOptions.generateConstructor = customizations.includes( "constructor" ); diff --git a/src/models/EntityInfo.ts b/src/models/EntityInfo.ts index b365f97..b1cf4a7 100644 --- a/src/models/EntityInfo.ts +++ b/src/models/EntityInfo.ts @@ -14,15 +14,13 @@ export default class EntityInfo { public Indexes: IndexInfo[]; - public Schema: string; + public Schema?: string; public GenerateConstructor: boolean; - public detached: boolean; - public IsActiveRecord: boolean; - public Database: string; + public Database?: string; public relationImports() { const imports: string[] = []; diff --git a/test/utils/GeneralTestUtils.ts b/test/utils/GeneralTestUtils.ts index a2e9dca..c3981d9 100644 --- a/test/utils/GeneralTestUtils.ts +++ b/test/utils/GeneralTestUtils.ts @@ -23,7 +23,7 @@ export function getGenerationOptions(resultsPath: string): IGenerationOptions { generateConstructor: false, customNamingStrategyPath: "", relationIds: false, - detached: false, + skipSchema: false, activeRecord: false }; }