/
MongoSchemaBuilder.ts
55 lines (48 loc) · 2.36 KB
/
MongoSchemaBuilder.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import {Connection} from "../connection/Connection";
import {SchemaBuilder} from "./SchemaBuilder";
import {MongoDriver} from "../driver/mongodb/MongoDriver";
import {SqlInMemory} from "../driver/SqlInMemory";
/**
* Creates complete tables schemas in the database based on the entity metadatas.
*
* Steps how schema is being built:
* 1. load list of all tables with complete column and keys information from the db
* 2. drop all (old) foreign keys that exist in the table, but does not exist in the metadata
* 3. create new tables that does not exist in the db, but exist in the metadata
* 4. drop all columns exist (left old) in the db table, but does not exist in the metadata
* 5. add columns from metadata which does not exist in the table
* 6. update all exist columns which metadata has changed
* 7. update primary keys - update old and create new primary key from changed columns
* 8. create foreign keys which does not exist in the table yet
* 9. create indices which are missing in db yet, and drops indices which exist in the db, but does not exist in the metadata anymore
*/
export class MongoSchemaBuilder implements SchemaBuilder {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(protected connection: Connection) {
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Creates complete schemas for the given entity metadatas.
*/
async build(): Promise<void> {
const queryRunner = (this.connection.driver as MongoDriver).createQueryRunner();
const promises: Promise<any>[] = [];
this.connection.entityMetadatas.forEach(metadata => {
metadata.indices.forEach(index => {
const options = { name: index.name, unique: index.isUnique, sparse: index.isSparse };
promises.push(queryRunner.createCollectionIndex(metadata.tableName, index.columnNamesWithOrderingMap, options));
});
});
await Promise.all(promises);
}
/**
* Returns query to be executed by schema builder.
*/
log(): Promise<SqlInMemory> {
return Promise.resolve(new SqlInMemory());
}
}