From 9a2076b3f1a078b881a3c802fcfc9bcd2acd5e62 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Mon, 5 Jun 2017 13:39:27 +0200 Subject: [PATCH] recognision of OneTwoMany relations --- .gitignore | 3 +- src/Engine.ts | 3 ++ src/drivers/MssqlDriver.ts | 50 +++++++++++++++++++--------------- src/entity.mst | 2 +- src/models/RelationInfo.ts | 2 ++ test/utils/EntityFileToJson.ts | 24 ++++++++-------- 6 files changed, 48 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index dc73fd5..22bf062 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ typings/ output/**/*.* .nyc_output/ coverage/ -.env \ No newline at end of file +.env +package-lock.json diff --git a/src/Engine.ts b/src/Engine.ts index 225e9ba..7259ad4 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -33,6 +33,9 @@ export class Engine { this.createTsConfigFile(resultPath) this.createTypeOrm(resultPath) let entitesPath = path.resolve(resultPath, './entities') + Handlebars.registerHelper('toLowerCase', function (str) { + return str.toLowerCase(); + }); if (!fs.existsSync(entitesPath)) fs.mkdirSync(entitesPath); let compliedTemplate = Handlebars.compile(template,{noEscape:true}) diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts index 338dcc2..41a548d 100644 --- a/src/drivers/MssqlDriver.ts +++ b/src/drivers/MssqlDriver.ts @@ -273,10 +273,10 @@ order by let ownColumn: ColumnInfo = ownerColumn; let isOneToMany: boolean; isOneToMany = false; - let index = ownerEntity.Indexes.find( + let index = referencedEntity.Indexes.find( (index) => { return index.isUnique && index.columns.some(col => { - return col.name == ownColumn.name + return col.name == relatedColumn!.name }) } ) @@ -285,38 +285,44 @@ order by } else { isOneToMany = false; } - let ownerRelation=new RelationInfo() - ownerRelation.actionOnDelete= relationTmp.actionOnDelete - ownerRelation.actionOnUpdate= relationTmp.actionOnUpdate - ownerRelation.isOwner= true - ownerRelation.relatedColumn= relatedColumn.name.toLowerCase() - ownerRelation.relatedTable= relationTmp.referencedTable - ownerRelation.relationType= isOneToMany ? "OneToMany" : "OneToOne" + let ownerRelation = new RelationInfo() + ownerRelation.actionOnDelete = relationTmp.actionOnDelete + ownerRelation.actionOnUpdate = relationTmp.actionOnUpdate + ownerRelation.isOwner = true + ownerRelation.relatedColumn = relatedColumn.name.toLowerCase() + ownerRelation.relatedTable = relationTmp.referencedTable + ownerRelation.ownerTable = relationTmp.ownerTable + ownerRelation.ownerColumn = ownerEntity.EntityName.toLowerCase() + ownerRelation.relationType = isOneToMany ? "OneToMany" : "OneToOne" ownerColumn.relations.push(ownerRelation) if (isOneToMany) { let col = new ColumnInfo() col.name = ownerEntity.EntityName.toLowerCase() //+ 's' let referencedRelation = new RelationInfo(); col.relations.push(referencedRelation) - referencedRelation.actionOnDelete= relationTmp.actionOnDelete - referencedRelation.actionOnUpdate= relationTmp.actionOnUpdate - referencedRelation.isOwner= false - referencedRelation.relatedColumn= ownerColumn.name - referencedRelation.relatedTable= relationTmp.ownerTable - referencedRelation.relationType= "ManyToOne" + referencedRelation.actionOnDelete = relationTmp.actionOnDelete + referencedRelation.actionOnUpdate = relationTmp.actionOnUpdate + referencedRelation.isOwner = false + referencedRelation.relatedColumn = ownerColumn.name + referencedRelation.relatedTable = relationTmp.ownerTable + referencedRelation.ownerTable = relationTmp.referencedTable + referencedRelation.ownerColumn = relatedColumn.name.toLowerCase() + referencedRelation.relationType = "ManyToOne" referencedEntity.Columns.push(col) } else { let col = new ColumnInfo() col.name = ownerEntity.EntityName.toLowerCase() let referencedRelation = new RelationInfo(); col.relations.push(referencedRelation) - referencedRelation.actionOnDelete= relationTmp.actionOnDelete - referencedRelation.actionOnUpdate= relationTmp.actionOnUpdate - referencedRelation.isOwner= false - referencedRelation.relatedColumn= ownerColumn.name - referencedRelation.relatedTable= relationTmp.ownerTable - referencedRelation.relationType= "OneToOne" - + referencedRelation.actionOnDelete = relationTmp.actionOnDelete + referencedRelation.actionOnUpdate = relationTmp.actionOnUpdate + referencedRelation.isOwner = false + referencedRelation.relatedColumn = ownerColumn.name + referencedRelation.relatedTable = relationTmp.ownerTable + referencedRelation.ownerTable = relationTmp.referencedTable + referencedRelation.ownerColumn = relatedColumn.name.toLowerCase() + referencedRelation.relationType = "OneToOne" + referencedEntity.Columns.push(col) } }) diff --git a/src/entity.mst b/src/entity.mst index ffe45ab..f8c7173 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -19,7 +19,7 @@ import {Index,Entity, PrimaryColumn, Column, OneToOne, OneToMany, ManyToOne, Joi }) {{name}}:{{ts_type}}; {{/relations}}{{#relations}} - @{{relationType}}(type=>{{relatedTable}},x=>x.{{relatedColumn}}){{#isOwner}} + @{{relationType}}(type=>{{relatedTable}}, {{../name}}=>{{../name}}.{{#if isOwner}}{{ownerColumn}}{{else}}{{relatedColumn}}{{/if}}){{#isOwner}} @JoinColumn(){{/isOwner}} {{#if isOneToMany}}{{../name}}:{{relatedTable}}[]; {{else}}{{../name}}:{{relatedTable}}; diff --git a/src/models/RelationInfo.ts b/src/models/RelationInfo.ts index 999e7c5..3210a5a 100644 --- a/src/models/RelationInfo.ts +++ b/src/models/RelationInfo.ts @@ -3,6 +3,8 @@ export class RelationInfo { relationType: "OneToOne" | "OneToMany" | "ManyToOne" relatedTable: string relatedColumn: string + ownerTable: string + ownerColumn: string actionOnDelete: "RESTRICT" | "CASCADE" | "SET NULL" actionOnUpdate: "RESTRICT" | "CASCADE" | "SET NULL" diff --git a/test/utils/EntityFileToJson.ts b/test/utils/EntityFileToJson.ts index 346bc3d..7cd1629 100644 --- a/test/utils/EntityFileToJson.ts +++ b/test/utils/EntityFileToJson.ts @@ -5,9 +5,9 @@ export class EntityFileToJson { if (decoratorParameters.length > 0) { if (decoratorParameters.search(',') > 0) { col.columnTypes = decoratorParameters.substring(0, decoratorParameters.indexOf(',')).trim().split('|').map(function (x) { - if (!x.endsWith('[]')) { - x = x + '[]'// can't distinguish OneTwoMany from OneToOne without indexes - } + // if (!x.endsWith('[]')) { + // x = x + '[]'// can't distinguish OneTwoMany from OneToOne without indexes + // } return x; }); let badJSON = decoratorParameters.substring(decoratorParameters.indexOf(',') + 1).trim() @@ -18,9 +18,9 @@ export class EntityFileToJson { } else { if (decoratorParameters[0] == '"' && decoratorParameters.endsWith('"')) { col.columnTypes = decoratorParameters.split('|').map(function (x) { - if (!x.endsWith('[]')) { - x = x + '[]'// can't distinguish OneTwoMany from OneToOne without indexes - } + // if (!x.endsWith('[]')) { + // x = x + '[]'// can't distinguish OneTwoMany from OneToOne without indexes + // } return x; }); } else { @@ -112,7 +112,7 @@ export class EntityFileToJson { isMultilineStatement = false; let column = new EntityColumn() retVal.columns.push(column) - column.relationType = "OneToMany"//"ManyToOne" - can't distinguish OneTwoMany from OneToOne without indexes + column.relationType = "ManyToOne" continue; } } else if (trimmedLine.startsWith('@OneToMany')) { @@ -136,7 +136,7 @@ export class EntityFileToJson { isMultilineStatement = false; let column = new EntityColumn() retVal.columns.push(column) - column.relationType = "OneToMany"//"OneToOne" - can't distinguish OneTwoMany from OneToOne without indexes + column.relationType = "OneToOne" continue; } } else if (trimmedLine.startsWith('@JoinColumn')) { @@ -153,15 +153,15 @@ export class EntityFileToJson { retVal.columns[retVal.columns.length - 1].columnName = trimmedLine.split(':')[0].trim(); //TODO:Should check if null only column is nullable? retVal.columns[retVal.columns.length - 1].columnTypes = trimmedLine.split(':')[1].split(';')[0].trim().split('|').map(function (x) { - if (!x.endsWith('[]')) { - x = x + '[]'// can't distinguish OneTwoMany from OneToOne without indexes - } + // if (!x.endsWith('[]')) { + // x = x + '[]'// can't distinguish OneTwoMany from OneToOne without indexes + // } return x; }); if (!retVal.columns[retVal.columns.length - 1].columnTypes.some(function (this, val, ind, arr) { return val == "null" ? true : false; - })) retVal.columns[retVal.columns.length - 1].columnTypes.push('null[]') + })) retVal.columns[retVal.columns.length - 1].columnTypes.push('null') continue } else if (trimmedLine = '}') {