Skip to content

Commit fb266e7

Browse files
author
fernandocode
committed
Implemented alter table option in ddl.
1 parent 98a6c35 commit fb266e7

11 files changed

Lines changed: 216 additions & 35 deletions

src/core/columns-base-builder.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,28 @@ import { Column } from "./column";
44
import { FieldType } from "./enums/field-type";
55
import { ColumnsCompiled } from "./columns-compiled";
66
import { PrimaryKeyType } from "./enums/primary-key-type";
7+
import { DatabaseHelper } from "../database-helper";
78

89
export abstract class ColumnsBaseBuilder<
910
TThis extends ColumnsBaseBuilder<TThis, T, TColumn>,
1011
T,
1112
TColumn extends Column
1213
> {
1314

15+
private _databaseHelper: DatabaseHelper = new DatabaseHelper();
16+
1417
protected columns: TColumn[] = [];
1518

1619
constructor(
17-
// protected readonly metadata: MetadataTable<T>,
1820
protected readonly mapperTable: MapperTable,
19-
protected readonly modelToSave: T,
20-
// protected readonly modelToSave: T = metadata.instance,
21+
protected readonly modelToSave: T
2122
) {
2223
}
2324

2425
public allColumns() {
2526
// clear columns
2627
this.columns = [];
2728
this.setAllColumns(this.mapperTable, this.modelToSave);
28-
// this.setAllColumns(this.metadata.mapperTable, this.modelToSave);
2929
}
3030

3131
public setColumn(
@@ -42,13 +42,15 @@ export abstract class ColumnsBaseBuilder<
4242
}
4343

4444
public set<TReturn extends ValueTypeToParse>(
45-
expression: ExpressionOrColumn<TReturn, T>,
46-
primaryKeyType: PrimaryKeyType
45+
columnExpression: ExpressionOrColumn<TReturn, T>,
46+
primaryKeyType: PrimaryKeyType,
47+
type?: new () => TReturn
4748
): TThis {
4849
return this.setColumn(
49-
Utils.getColumn(expression),
50-
Utils.getType(this.modelToSave, expression),
51-
// Utils.getType(this.metadata.instance, expression),
50+
Utils.getColumn(columnExpression),
51+
type
52+
? this._databaseHelper.getFieldType(type)
53+
: Utils.getType(this.modelToSave, columnExpression),
5254
primaryKeyType
5355
);
5456
}
@@ -75,8 +77,7 @@ export abstract class ColumnsBaseBuilder<
7577
}
7678

7779
protected isCompositeKey(): boolean {
78-
return this.mapperTable.columns.filter(x => !!x.primaryKeyType).length > 1;
79-
// return this.metadata.mapperTable.columns.filter(x => !!x.primaryKeyType).length > 1;
80+
return this.mapperTable && this.mapperTable.columns.filter(x => !!x.primaryKeyType).length > 1
8081
}
8182

8283
protected abstract columnFormat(column: TColumn): string;

src/core/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ export class Utils {
265265
public static getType(instance: ValueTypeToParse): FieldType;
266266
public static getType<TReturn extends ValueTypeToParse, T>(instance: any, expression: ExpressionOrColumn<TReturn, T>): FieldType;
267267
public static getType<TReturn extends ValueTypeToParse, T>(instance: any, expression?: ExpressionOrColumn<TReturn, T>): FieldType {
268+
if (instance === void 0) {
269+
return void 0;
270+
}
268271
if (expression) {
269272
return this.getTypeByValue(this.getValue(instance, expression));
270273
}

src/database-helper.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -106,20 +106,10 @@ export class DatabaseHelper {
106106
) {
107107
return ColumnType.BOOLEAN;
108108
}
109+
if (type === void 0) {
110+
return void 0;
111+
}
109112
throw new DatabaseBuilderError(`type '${type}' não configurado!`);
110-
// switch (type) {
111-
// case FieldType.STRING:
112-
// case FieldType.ARRAY:
113-
// case FieldType.OBJECT:
114-
// return ColumnType.TEXT;
115-
// case FieldType.DATE:
116-
// case FieldType.NUMBER:
117-
// return ColumnType.INTEGER;
118-
// case FieldType.BOOLEAN:
119-
// return ColumnType.BOOLEAN;
120-
// default:
121-
// throw new DatabaseBuilderError(`type '${type}' não configurado!`);
122-
// }
123113
}
124114

125115
public parseToValueType(value: ValueTypeToParse, type: FieldType = this.getType(value)): ValueType {

src/ddl/alter/alter-builder.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { DdlColumnsBuilder } from "../ddl-columns-builder";
2+
import { DdlBaseBuilder } from "../ddl-base-builder";
3+
import { MapperTable } from "../../mapper-table";
4+
import { DdlCompiled } from "../../core/ddl-compided";
5+
import { ValueTypeToParse, ExpressionOrColumn, Utils } from "../../core/utils";
6+
import { DatabaseBuilderError } from "../../core";
7+
import { FieldType } from "../../core/enums/field-type";
8+
9+
export class AlterBuilder<T> extends DdlBaseBuilder<T> {
10+
11+
private _patternOperation: (column: string) => string;
12+
13+
constructor(
14+
private typeT: new () => T
15+
) {
16+
super(typeT.name);
17+
}
18+
19+
public addColumn<TReturn extends ValueTypeToParse>(
20+
columnExpression: ExpressionOrColumn<TReturn, T>,
21+
type?: new () => TReturn
22+
): AlterBuilder<T> {
23+
this._patternOperation = (column: string) => `ADD COLUMN ${column}`;
24+
return super.columnsBase(
25+
column => column.set(columnExpression, void 0, type),
26+
new DdlColumnsBuilder<T>(
27+
void 0,
28+
new this.typeT()
29+
),
30+
this);
31+
}
32+
33+
public renameColumn<TReturn extends ValueTypeToParse>(
34+
columnExpression: ExpressionOrColumn<TReturn, T>,
35+
newColumnNameExpression: ExpressionOrColumn<TReturn, T>
36+
): AlterBuilder<T> {
37+
this._patternOperation = (column: string) => `RENAME COLUMN ${column} TO ${Utils.getColumn(newColumnNameExpression)}`;
38+
return super.columnsBase(
39+
column => column.set(columnExpression, void 0),
40+
new DdlColumnsBuilder<T>(
41+
void 0,
42+
void 0
43+
),
44+
this);
45+
}
46+
47+
public renameTable<TNewTable>(
48+
newTableName: string | (new () => TNewTable)
49+
): AlterBuilder<T> {
50+
this._patternOperation = (column: string) => `RENAME TO ${(Utils.isString(newTableName) ? newTableName as string : (newTableName as new () => void).name)}`;
51+
return this;
52+
// return super.columnsBase(
53+
// column => column.set(columnExpression, void 0),
54+
// new DdlColumnsBuilder<T>(
55+
// void 0,
56+
// void 0
57+
// ),
58+
// this);
59+
}
60+
61+
protected resolveDependency(dependency: MapperTable): DdlCompiled {
62+
return void 0;
63+
}
64+
65+
protected dependencies(): MapperTable[] {
66+
return [];
67+
}
68+
69+
protected buildBase(): string {
70+
const column = this.getColumnsCompiled();
71+
if (column.columns.length > 1) {
72+
throw new DatabaseBuilderError(`Not allowed ALTER TABLE in multi columns (number columns: ${column.columns.length})!`);
73+
}
74+
if (column.columns.length === 0 && this._patternOperation === void 0) {
75+
throw new DatabaseBuilderError(`Not column for ALTER TABLE, use 'addColumn'!`);
76+
}
77+
return `ALTER TABLE ${this._tablename}
78+
${this._patternOperation(column.columns[0])};`;
79+
}
80+
81+
protected setDefaultColumns(): void {
82+
}
83+
}

src/ddl/alter/alter.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { DatabaseBase } from "../../definitions/database-definition";
2+
import { DdlBase } from "../ddl-base";
3+
import { AlterBuilder } from "./alter-builder";
4+
import { ValueTypeToParse, ExpressionOrColumn } from "../../core/utils";
5+
import { FieldType } from "../../core/enums/field-type";
6+
7+
export class Alter<T> extends DdlBase<T, AlterBuilder<T>> {
8+
9+
constructor(
10+
typeT: new () => T,
11+
database: DatabaseBase = void 0,
12+
enableLog: boolean = true,
13+
) {
14+
super(new AlterBuilder(typeT), database, enableLog);
15+
}
16+
17+
public addColumn<TReturn extends ValueTypeToParse>(
18+
columnExpression: ExpressionOrColumn<TReturn, T>,
19+
type?: new () => TReturn
20+
): Alter<T> {
21+
this._builder.addColumn(columnExpression, type);
22+
return this;
23+
}
24+
25+
public renameColumn<TReturn extends ValueTypeToParse>(
26+
columnExpression: ExpressionOrColumn<TReturn, T>,
27+
newColumnNameExpression: ExpressionOrColumn<TReturn, T>
28+
): Alter<T> {
29+
this._builder.renameColumn(columnExpression, newColumnNameExpression);
30+
return this;
31+
}
32+
33+
public renameTable<TNewTable>(
34+
newTableName: string | (new () => TNewTable)
35+
): Alter<T> {
36+
this._builder.renameTable(newTableName);
37+
return this;
38+
}
39+
}

src/ddl/alter/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
export * from "./alter";

src/ddl/create/create-builder.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ export class CreateBuilder<T> extends DdlBaseBuilder<T> {
1717
}
1818

1919
public columns(columnsCallback: (columns: DdlColumnsBuilder<T>) => void): CreateBuilder<T> {
20-
return super.columnsBase(columnsCallback,
21-
new DdlColumnsBuilder<T>(this._mapperTable,
20+
return super.columnsBase(
21+
columnsCallback,
22+
new DdlColumnsBuilder<T>(
23+
this._mapperTable,
2224
void 0
23-
)
24-
, this);
25+
),
26+
this);
2527
}
2628

2729
protected resolveDependency(dependency: MapperTable): DdlCompiled {

src/ddl/ddl-base-builder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ export abstract class DdlBaseBuilder<T> {
4242
protected columnsBase<TBuilder extends DdlBaseBuilder<T>>(
4343
columnsCallback: (columns: DdlColumnsBuilder<T>) => void,
4444
instanceSetColumnsBuilder: DdlColumnsBuilder<T>,
45-
instanceReturn: TBuilder)
46-
: TBuilder {
45+
instanceReturn: TBuilder
46+
): TBuilder {
4747
columnsCallback(instanceSetColumnsBuilder);
4848
this.compileColumns(instanceSetColumnsBuilder.compile());
4949
return instanceReturn;

src/ddl/ddl-columns-builder.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,13 @@ export class DdlColumnsBuilder<T> extends ColumnsBaseBuilder<DdlColumnsBuilder<T
3434
return `${column.name} ${Utils.parseColumnType(column.type)}`;
3535
}
3636
if (Utils.isFlag(column.type, FieldType.NULL)) {
37-
throw new DatabaseBuilderError(`Mapper '${this.mapperTable.tableName}', column '${column.name}' of type 'NULL' not supported!`);
37+
throw new DatabaseBuilderError(`Mapper '${this.mapperTable ? this.mapperTable.tableName : "?"}', column '${column.name}' of type 'NULL' not supported!`);
3838
}
3939
// is table reference/list
4040
const columnType = Utils.parseColumnType(column.type);
4141
if (columnType === ColumnType.TABLE_REFERENCE) {
4242
return void 0;
4343
}
44-
return `${column.name} ${columnType}${!!column.primaryKeyType ? ` NOT NULL PRIMARY KEY` : ""}${column.primaryKeyType === PrimaryKeyType.AutoIncrement ? ` AUTOINCREMENT` : ""}`;
45-
// return `${column.name} ${Utils.parseColumnType(column.type)}${!!column.primaryKeyType ? ` NOT NULL PRIMARY KEY` : ""}${column.primaryKeyType === PrimaryKeyType.AutoIncrement ? ` AUTOINCREMENT` : ""}`;
44+
return `${column.name} ${columnType ? columnType : ""}${!!column.primaryKeyType ? ` NOT NULL PRIMARY KEY` : ""}${column.primaryKeyType === PrimaryKeyType.AutoIncrement ? ` AUTOINCREMENT` : ""}`.trim();
4645
}
4746
}

src/ddl/ddl.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Drop } from "./drop/drop";
22
import { Create } from "./create/create";
3+
import { Alter } from "./alter/alter";
34
import { DatabaseBase } from "../definitions/database-definition";
45
import { DatabaseBuilderError } from "../core/errors";
56
import { GetMapper } from "../mapper/interface-get-mapper";
@@ -21,6 +22,13 @@ export class Ddl {
2122
return new Create(typeT, mapperTable, database, this.enableLog);
2223
}
2324

25+
public alter<T>(
26+
typeT: new () => T,
27+
database: DatabaseBase = this.getDatabase()
28+
): Alter<T> {
29+
return new Alter(typeT, database, this.enableLog);
30+
}
31+
2432
public drop<T>(
2533
typeT: new () => T,
2634
mapperTable: MapperTable = this._mappersTable.get(typeT).mapperTable,
@@ -29,8 +37,6 @@ export class Ddl {
2937
return new Drop(typeT, mapperTable, database, this.enableLog);
3038
}
3139

32-
// TODO: create ALTER TABLE: https://sqlite.org/lang_altertable.html
33-
3440
private getDatabase() {
3541
if (!this._database) {
3642
throw new DatabaseBuilderError("Transaction ou Database not specified in query.");

0 commit comments

Comments
 (0)