Skip to content

Commit

Permalink
Merge e750e2f into cedbae7
Browse files Browse the repository at this point in the history
  • Loading branch information
B4nan committed Aug 9, 2019
2 parents cedbae7 + e750e2f commit 7e08545
Show file tree
Hide file tree
Showing 25 changed files with 767 additions and 432 deletions.
7 changes: 6 additions & 1 deletion lib/MikroORM.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { EntityManager } from './EntityManager';
import { IDatabaseDriver } from './drivers';
import { AbstractSqlDriver, IDatabaseDriver } from './drivers';
import { MetadataDiscovery } from './metadata';
import { Configuration, Logger, Options } from './utils';
import { EntityMetadata } from './decorators';
import { SchemaGenerator } from './schema';

export class MikroORM {

Expand Down Expand Up @@ -61,4 +62,8 @@ export class MikroORM {
return this.metadata;
}

getSchemaGenerator(): SchemaGenerator {
return new SchemaGenerator(this.driver as AbstractSqlDriver, this.metadata);
}

}
1 change: 1 addition & 0 deletions lib/decorators/Entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export interface EntityProperty<T extends IEntityType<T> = any> {
name: string & keyof T;
entity: () => EntityName<T>;
type: string;
columnType: string;
primary: boolean;
length?: any;
reference: ReferenceType;
Expand Down
18 changes: 18 additions & 0 deletions lib/metadata/MetadataDiscovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export class MetadataDiscovery {
private readonly metadataProvider = this.config.getMetadataProvider();
private readonly cache = this.config.getCacheAdapter();
private readonly platform = this.em.getDriver().getPlatform();
private readonly schemaHelper = this.platform.getSchemaHelper();
private readonly validator = new MetadataValidator();
private readonly discovered: EntityMetadata[] = [];

Expand Down Expand Up @@ -191,6 +192,7 @@ export class MetadataDiscovery {
this.validator.validateEntityDefinition(this.metadata, meta.name);
Object.values(meta.properties).forEach(prop => {
this.applyNamingStrategy(meta, prop);
this.initColumnType(prop);

if (prop.version) {
meta.versionProperty = prop.name;
Expand Down Expand Up @@ -261,6 +263,8 @@ export class MetadataDiscovery {
ret.inverseJoinColumn = prop.referenceColumnName;
}

this.initColumnType(ret);

return ret;
}

Expand Down Expand Up @@ -292,4 +296,18 @@ export class MetadataDiscovery {
return 1;
}

private initColumnType(prop: EntityProperty): void {
if (prop.columnType || !this.schemaHelper) {
return;
}

if (prop.reference === ReferenceType.SCALAR) {
prop.columnType = this.schemaHelper.getTypeDefinition(prop);
return;
}

const meta = this.metadata[prop.type];
prop.columnType = this.schemaHelper.getTypeDefinition(meta.properties[meta.primaryKey]);
}

}
6 changes: 1 addition & 5 deletions lib/platforms/MongoPlatform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { SchemaHelper } from '../schema';

export class MongoPlatform extends Platform {

protected schemaHelper: SchemaHelper;
protected schemaHelper?: SchemaHelper;

usesPivotTable(): boolean {
return false;
Expand Down Expand Up @@ -36,8 +36,4 @@ export class MongoPlatform extends Platform {
return 'id';
}

getSchemaHelper(): SchemaHelper {
throw new Error(`${MongoPlatform.name} does not provide SchemaHelper`);
}

}
4 changes: 2 additions & 2 deletions lib/platforms/Platform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { SchemaHelper } from '../schema';

export abstract class Platform {

protected abstract schemaHelper: SchemaHelper;
protected abstract schemaHelper?: SchemaHelper;

usesPivotTable(): boolean {
return true;
Expand All @@ -26,7 +26,7 @@ export abstract class Platform {
return false;
}

getSchemaHelper(): SchemaHelper {
getSchemaHelper(): SchemaHelper | undefined {
return this.schemaHelper;
}

Expand Down
26 changes: 17 additions & 9 deletions lib/schema/MySqlSchemaHelper.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import { ColumnInfo, MySqlTableBuilder } from 'knex';
import { SchemaHelper } from './SchemaHelper';
import { EntityProperty } from '../decorators';
import { MySqlTableBuilder } from 'knex';

export class MySqlSchemaHelper extends SchemaHelper {

static readonly TYPES = {
number: 'int(?)',
float: 'float',
double: 'double',
string: 'varchar(?)',
date: 'datetime(?)',
boolean: 'tinyint(1)',
text: 'text',
json: 'json',
number: ['int(?)', 'float', 'double'],
float: ['float'],
double: ['double'],
string: ['varchar(?)', 'text'],
date: ['datetime(?)', 'timestamp(?)'],
boolean: ['tinyint(1)'],
text: ['text'],
json: ['json'],
};

static readonly DEFAULT_TYPE_LENGTHS = {
Expand All @@ -38,4 +38,12 @@ export class MySqlSchemaHelper extends SchemaHelper {
return super.getTypeDefinition(prop, MySqlSchemaHelper.TYPES, MySqlSchemaHelper.DEFAULT_TYPE_LENGTHS);
}

isSame(prop: EntityProperty, type: ColumnInfo): boolean {
return super.isSame(prop, type, MySqlSchemaHelper.TYPES);
}

getListTablesSQL(): string {
return `select table_name from information_schema.tables where table_type = 'BASE TABLE' and table_schema = schema()`;
}

}
25 changes: 17 additions & 8 deletions lib/schema/PostgreSqlSchemaHelper.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { ColumnInfo } from 'knex';
import { SchemaHelper } from './SchemaHelper';
import { EntityProperty } from '../decorators';

export class PostgreSqlSchemaHelper extends SchemaHelper {

static readonly TYPES = {
number: 'int',
float: 'float',
double: 'double precision',
string: 'varchar(?)',
date: 'timestamp(?)',
boolean: 'boolean',
text: 'text',
json: 'json',
number: ['int', 'int8', 'integer', 'float', 'float8', 'double', 'double precision', 'bigint', 'smallint', 'decimal', 'numeric', 'real'],
float: ['float'],
double: ['double', 'double precision', 'float8'],
string: ['varchar(?)', 'character varying', 'text', 'character', 'char'],
date: ['datetime(?)', 'timestamp(?)', 'timestamp without time zone', 'timestamptz', 'datetimetz', 'time', 'date', 'timetz', 'datetz'],
boolean: ['boolean', 'bool'],
text: ['text'],
json: ['json'],
};

static readonly DEFAULT_TYPE_LENGTHS = {
Expand All @@ -31,8 +32,16 @@ export class PostgreSqlSchemaHelper extends SchemaHelper {
return super.getTypeDefinition(prop, PostgreSqlSchemaHelper.TYPES, PostgreSqlSchemaHelper.DEFAULT_TYPE_LENGTHS);
}

isSame(prop: EntityProperty, type: ColumnInfo): boolean {
return super.isSame(prop, type, PostgreSqlSchemaHelper.TYPES);
}

indexForeignKeys() {
return false;
}

getListTablesSQL(): string {
return `select * from information_schema.tables where table_type = 'BASE TABLE' and table_schema not in ('pg_catalog', 'information_schema')`;
}

}

0 comments on commit 7e08545

Please sign in to comment.