Skip to content

Commit

Permalink
fix(schema): make STI metadata discovery order independent
Browse files Browse the repository at this point in the history
Closes #909
  • Loading branch information
B4nan committed Oct 8, 2020
1 parent 82e2efd commit f477a48
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 5 deletions.
13 changes: 10 additions & 3 deletions packages/core/src/metadata/MetadataDiscovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export class MetadataDiscovery {
// ignore base entities (not annotated with @Entity)
const filtered = this.discovered.filter(meta => meta.name);
filtered.forEach(meta => Object.values(meta.properties).forEach(prop => this.initEmbeddables(meta, prop)));
filtered.forEach(meta => this.initSingleTableInheritance(meta));
filtered.forEach(meta => this.initSingleTableInheritance(meta, filtered));
filtered.forEach(meta => this.defineBaseEntityProperties(meta));
filtered.forEach(meta => this.metadata.set(meta.className, EntitySchema.fromMetadata(meta).init().meta));
filtered.forEach(meta => this.defineBaseEntityProperties(meta));
Expand Down Expand Up @@ -570,14 +570,21 @@ export class MetadataDiscovery {
}
}

private initSingleTableInheritance(meta: EntityMetadata): void {
private initSingleTableInheritance(meta: EntityMetadata, metadata: EntityMetadata[]): void {
if (meta.root !== meta && !(meta as Dictionary).__processed) {
meta.root = metadata.find(m => m.className === meta.root.className)!;
(meta.root as Dictionary).__processed = true;
} else {
delete (meta.root as Dictionary).__processed;
}

if (!meta.root.discriminatorColumn) {
return;
}

if (!meta.root.discriminatorMap) {
meta.root.discriminatorMap = {} as Dictionary<string>;
const children = Object.values(this.metadata.getAll()).filter(m => m.root === meta.root);
const children = metadata.filter(m => m.root === meta.root);
children.forEach(m => {
const name = m.discriminatorValue || this.namingStrategy.classToTableName(m.className);
meta.root.discriminatorMap![name] = m.className;
Expand Down
2 changes: 1 addition & 1 deletion packages/knex/src/schema/SchemaGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -467,8 +467,8 @@ export class SchemaGenerator {

const columnAlreadyCreated = prop.primary && prop.reference !== ReferenceType.SCALAR && !diff;

/* istanbul ignore else */
if (!meta.pivotTable && !columnAlreadyCreated) {
/* istanbul ignore next */
this.createTableColumn(table, meta, prop, diff ?? {});
}

Expand Down
2 changes: 1 addition & 1 deletion tests/issues/GH845.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ describe('GH issue 845', () => {

beforeAll(async () => {
orm = await MikroORM.init({
entities: [Base, Relation1, Child1Specific, Parent, Child1, Child2],
entities: [Base, Relation1, Child1Specific, Child1, Child2, Parent],
dbName: ':memory:',
type: 'sqlite',
});
Expand Down

0 comments on commit f477a48

Please sign in to comment.