Skip to content

Commit e6c9800

Browse files
author
Fernando Leal
committed
#5309 - Otimização de multi insert e ajustes em testes para validar e garantir a integridade da alteração.
1 parent 8333b44 commit e6c9800

26 files changed

Lines changed: 385 additions & 177 deletions

src/core/columns-base-builder.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,30 @@ export abstract class ColumnsBaseBuilder<
1212
TColumn extends Column
1313
> {
1414

15-
protected columns: TColumn[] = [];
15+
protected _columns: TColumn[] = [];
1616

1717
private _databaseHelper: DatabaseHelper = new DatabaseHelper();
1818

1919
constructor(
2020
protected readonly mapperTable: MapperTable,
21-
protected readonly modelToSave: T | Array<T>
21+
protected readonly toSave: T | Array<T>
2222
) {
2323
}
2424

25+
public get columns() { return this._columns };
26+
2527
public allColumns() {
2628
// clear columns
27-
this.columns = [];
28-
this.setAllColumns(this.mapperTable, this.modelToSave);
29+
this._columns = [];
30+
this.setAllColumns(this.mapperTable, this.toSave);
2931
}
3032

3133
public setColumn(
3234
column: string,
3335
type: FieldType,
3436
primaryKeyType: PrimaryKeyType
3537
): TThis {
36-
this.columns.push({
38+
this._columns.push({
3739
name: column,
3840
type,
3941
primaryKeyType
@@ -59,9 +61,9 @@ export abstract class ColumnsBaseBuilder<
5961
keyColumns: [],
6062
params: [],
6163
};
62-
for (const key in this.columns) {
63-
if (this.columns.hasOwnProperty(key)) {
64-
const column = this.columns[key];
64+
for (const key in this._columns) {
65+
if (this._columns.hasOwnProperty(key)) {
66+
const column = this._columns[key];
6567
if (column.primaryKeyType) {
6668
result.keyColumns.push(column.name);
6769
}
@@ -114,6 +116,6 @@ export abstract class ColumnsBaseBuilder<
114116
: void 0;
115117
return fieldTypeByMapper
116118
? fieldTypeByMapper.fieldType
117-
: Utils.getType(this.modelToSave, columnExpression);
119+
: Utils.getType(this.toSave, columnExpression);
118120
}
119121
}

src/core/columns-values-builder.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ export abstract class ColumnsValuesBuilder<
1515

1616
constructor(
1717
mapperTable: MapperTable,
18-
modelToSave: T | Array<T>,
18+
toSave: T | Array<T>,
1919
) {
20-
super(mapperTable, modelToSave);
20+
super(mapperTable, toSave);
2121
}
2222

2323
protected setColumnValue(
@@ -39,9 +39,9 @@ export abstract class ColumnsValuesBuilder<
3939
value = Utils.GUID();
4040
// set value GUID in model
4141
KeyUtils.setKey(this.mapperTable,
42-
Utils.isArray(this.modelToSave)
43-
? (this.modelToSave as Array<T>)[index]
44-
: this.modelToSave,
42+
Utils.isArray(this.toSave)
43+
? (this.toSave as Array<T>)[index]
44+
: this.toSave,
4545
value);
4646
}
4747
return value;
@@ -50,7 +50,7 @@ export abstract class ColumnsValuesBuilder<
5050
return value;
5151
}
5252
});
53-
this.columns.push({
53+
this._columns.push({
5454
name: column,
5555
type: fieldType,
5656
value: Utils.getValueType(values, fieldType),
@@ -89,8 +89,8 @@ export abstract class ColumnsValuesBuilder<
8989
keyColumns: [],
9090
params: [],
9191
};
92-
result.keyColumns = this.columns.filter(x => !!x.primaryKeyType).map(x => x.name);
93-
this.columns.forEach((column) => {
92+
result.keyColumns = this._columns.filter(x => !!x.primaryKeyType).map(x => x.name);
93+
this._columns.forEach((column) => {
9494
if (this.isAddColumn(column)) {
9595
const columnName = this.columnFormat(column);
9696
if (!Utils.isNull(columnName)) {
@@ -130,6 +130,6 @@ export abstract class ColumnsValuesBuilder<
130130
}
131131

132132
protected getValueByExpression<TReturn>(expression: ExpressionOrColumn<TReturn, T>): Array<TReturn> {
133-
return Utils.getValue(this.modelToSave, expression);
133+
return Utils.getValue(this.toSave, expression);
134134
}
135135
}

src/crud/batch-insert/commander-builder.ts renamed to src/crud/commander-builder.ts

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { QueryCompiled } from "../../core";
2-
import { Utils, ValueType } from "../../core/utils";
3-
import { MapperColumn } from "../../mapper-column";
4-
import { MapperTable } from "../../mapper-table";
1+
import { DatabaseBuilderError, QueryCompiled } from "../core";
2+
import { Utils, ValueType } from "../core/utils";
3+
import { MapperColumn } from "../mapper-column";
4+
import { MapperTable } from "../mapper-table";
55

66
export class CommanderBuilder {
77

@@ -55,18 +55,31 @@ export class CommanderBuilder {
5555

5656
public static batchInsert(tableName: string, columnsNames: string[], values: Array<ValueType[]>)
5757
: QueryCompiled[] {
58-
return this.splitChunks(values, this.LIMIT_VARIABLES_INSERT).map(valuesChunk => {
59-
return {
60-
params: [].concat(...valuesChunk),
61-
query: Utils.normalizeSqlString(
62-
`INSERT INTO ${tableName}
58+
if (this.validValues(values)) {
59+
return this.splitChunks(values, this.LIMIT_VARIABLES_INSERT).map(valuesChunk => {
60+
return {
61+
params: [].concat(...valuesChunk),
62+
query: Utils.normalizeSqlString(
63+
`INSERT INTO ${tableName}
6364
(${columnsNames.join(", ")})
6465
VALUES ${valuesChunk
65-
.map(a => `(${a.map(() => "?").join(", ")})`)
66-
.join(", ")}`
67-
),
68-
};
69-
});
66+
.map(a => `(${a.map(() => "?").join(", ")})`)
67+
.join(", ")}`
68+
),
69+
};
70+
});
71+
}
72+
}
73+
74+
private static validValues(values: Array<ValueType[]>): boolean {
75+
if (values.length < 1)
76+
throw new DatabaseBuilderError(`Values not informed`);
77+
const sizeInnerArray = values?.[0].length;
78+
if (sizeInnerArray < 1)
79+
throw new DatabaseBuilderError(`Inner values not informed`);
80+
if (!values.every(x => x.length === sizeInnerArray))
81+
throw new DatabaseBuilderError(`Values with different size not suportted, values: ${JSON.stringify(values)}`);
82+
return true;
7083
}
7184

7285
public static batchInsertColumn<T>(tableName: string, columns: MapperColumn[], models: Array<T>)

src/crud/crud-base-builder.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,13 @@ export abstract class CrudBaseBuilder<
6969
this._columnsCompiled.params = this._columnsCompiled.params.concat(compiled.params);
7070
}
7171
}
72+
73+
public get specifiedColumns() { return this.columnsBuilder.columns; }
74+
75+
private _columnsBuilder: TColumnsBuilder;
76+
protected get columnsBuilder() {
77+
return this._columnsBuilder ??= this.createColumnsBuilder();
78+
}
79+
80+
protected abstract createColumnsBuilder(): TColumnsBuilder;
7281
}

src/crud/crud-base.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ export abstract class CrudBase<
4040
this._builder = builder;
4141
}
4242

43+
protected dependencies(): MapperTable[] {
44+
/**
45+
* retornar apenas as dependencias que foram solititadas nas colunas especificadas
46+
*/
47+
return this.mapperTable.dependencies.filter(
48+
dependency => this._builder.specifiedColumns.some(
49+
x => x.name === this.mapperTable.columns.find(
50+
column => column.tableReference === dependency.tableName
51+
).column
52+
)
53+
);
54+
}
55+
4356
protected model(): T | Array<T> {
4457
return this._builder.getModel();
4558
}
@@ -51,8 +64,6 @@ export abstract class CrudBase<
5164
protected checkDatabaseResult(observable: Observable<DatabaseResult[]>): Observable<DatabaseResult[]> {
5265
if (this._typeCrud === TypeCrud.CREATE) {
5366
return observable.pipe(map(results => {
54-
debugger;
55-
5667
const models: Array<T> = Utils.isArray(this.model())
5768
? this.model() as Array<T>
5869
: [this.model() as T];

src/crud/crud.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,35 +67,35 @@ export class Crud {
6767
public update<T>(
6868
typeT: new () => T,
6969
{
70-
modelToSave,
70+
toSave,
7171
alias,
7272
metadata = this.getMapper(typeT),
7373
database = this.getDatabase()
7474
}: {
75-
modelToSave?: T,
75+
toSave?: T,
7676
alias?: string
7777
metadata?: MetadataTable<T>,
7878
database?: DatabaseBase
7979
} = {}
8080
): Update<T> {
81-
return new Update(typeT, { modelToSave, mapperTable: metadata.mapperTable, alias, database, enableLog: this.enableLog });
81+
return new Update(typeT, { toSave: toSave, mapperTable: metadata.mapperTable, alias, database, enableLog: this.enableLog });
8282
}
8383

8484
public insert<T>(
8585
typeT: new () => T,
8686
{
87-
modelToSave,
87+
toSave,
8888
alias,
8989
metadata = this.getMapper(typeT),
9090
database = this.getDatabase()
9191
}: {
92-
modelToSave?: T,
92+
toSave?: T | Array<T>,
9393
alias?: string
9494
metadata?: MetadataTable<T>,
9595
database?: DatabaseBase
9696
} = {}
9797
): Insert<T> {
98-
return new Insert(typeT, { modelToSave, mapperTable: metadata.mapperTable, alias, database, enableLog: this.enableLog });
98+
return new Insert(typeT, { toSave: toSave, mapperTable: metadata.mapperTable, alias, database, enableLog: this.enableLog });
9999
}
100100

101101
public query<T>(

src/crud/delete/delete-builder.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ import { DeleteColumnsBuilder } from "./delete-columns-builder";
22
import { WhereBuilder } from "../where-builder";
33
import { CrudBaseBuilder } from "../crud-base-builder";
44
import { MapperTable } from "../../mapper-table";
5-
import { QueryCompiled } from "../../core";
5+
import { DatabaseBuilderError, QueryCompiled } from "../../core";
66
import { KeyUtils } from "../../core/key-utils";
77
import { ColumnRef } from "../../core/column-ref";
88
import { Utils } from "../../core/utils";
9-
import { CommanderBuilder } from "../batch-insert/commander-builder";
9+
import { CommanderBuilder } from "../commander-builder";
1010

1111
export class DeleteBuilder<T> extends CrudBaseBuilder<T, DeleteColumnsBuilder<T>> {
1212

1313
constructor(
1414
typeT: new () => T,
15-
private _modelToSave: T = void 0,
15+
private _toSave: T = void 0,
1616
mapperTable: MapperTable,
1717
alias: string = void 0
1818
) {
1919
super(typeT, mapperTable, alias);
20-
if (!Utils.isNull(_modelToSave)) {
20+
if (!Utils.isNull(_toSave)) {
2121
this.where(where => {
22-
where.equal(new ColumnRef(KeyUtils.primaryKeyMapper(mapperTable).column), KeyUtils.getKey(mapperTable, _modelToSave));
22+
where.equal(new ColumnRef(KeyUtils.primaryKeyMapper(mapperTable).column), KeyUtils.getKey(mapperTable, _toSave));
2323
});
2424
}
2525
}
@@ -33,9 +33,13 @@ export class DeleteBuilder<T> extends CrudBaseBuilder<T, DeleteColumnsBuilder<T>
3333
}
3434

3535
public getModel(): T {
36-
return this._modelToSave;
36+
return this._toSave;
3737
}
3838

3939
protected setDefaultColumns(): void {
4040
}
41+
42+
protected createColumnsBuilder(): DeleteColumnsBuilder<T> {
43+
return new DeleteColumnsBuilder<T>(this.mapperTable, this._toSave);
44+
}
4145
}

src/crud/delete/delete.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ export class Delete<T> extends CrudBase<T, DeleteBuilder<T>, DeleteColumnsBuilde
2727
database?: DatabaseBase,
2828
enableLog?: boolean
2929
}
30-
// modelToSave: T = void 0,
31-
// mapperTable: MapperTable,
32-
// database: DatabaseBase = void 0,
33-
// enableLog: boolean = true,
3430
) {
3531
super(TypeCrud.DELETE, { mapperTable, builder: new DeleteBuilder(typeT, modelToSave, mapperTable), database, enableLog });
3632
}
3733

34+
protected dependencies(): MapperTable[] {
35+
// Não precisa observar as colunas pois o delete não é especificado colunas
36+
return this.mapperTable.dependencies;
37+
}
38+
3839
public where(where: (whereCallback: WhereBuilder<T>) => void): Delete<T> {
3940
this._builder.where(where);
4041
return this;

src/crud/insert/insert-builder.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
1-
import { Utils, ValueType } from "../../core/utils";
21
import { InsertColumnsBuilder } from "./insert-columns-builder";
32
import { CrudBaseBuilder } from "../crud-base-builder";
43
import { MapperTable } from "../../mapper-table";
54
import { QueryCompiled } from "../../core/query-compiled";
6-
import { CommanderBuilder } from "../batch-insert/commander-builder";
5+
import { CommanderBuilder } from "../commander-builder";
76

87
export class InsertBuilder<T> extends CrudBaseBuilder<T, InsertColumnsBuilder<T>> {
98

109
constructor(
1110
typeT: new () => T,
1211
mapperTable: MapperTable,
1312
alias: string = void 0,
14-
protected readonly _modelToSave: T = void 0,
13+
protected readonly _toSave: T | Array<T> = void 0,
1514
) {
1615
super(typeT, mapperTable, alias);
1716
}
1817

1918
public columns(columnsCallback: (columns: InsertColumnsBuilder<T>) => void): InsertBuilder<T> {
20-
return super.columnsBase(columnsCallback,
21-
new InsertColumnsBuilder<T>(this.mapperTable, this._modelToSave), this);
19+
return super.columnsBase(columnsCallback, this.columnsBuilder, this);
2220
}
2321

2422
protected buildBase(): QueryCompiled {
2523
const columnsCompiled = this.getColumnsCompiled();
2624
return CommanderBuilder.batchInsert(this._tablename, columnsCompiled.columns, columnsCompiled.params)?.[0];
2725
}
2826

29-
public getModel(): T {
30-
return this._modelToSave;
27+
public getModel(): T | Array<T> {
28+
return this._toSave;
3129
}
3230

3331
protected setDefaultColumns(): void {
3432
this.columns((columns) => columns.allColumns());
3533
}
34+
35+
protected createColumnsBuilder(): InsertColumnsBuilder<T> {
36+
return new InsertColumnsBuilder(this.mapperTable, this._toSave);
37+
}
3638
}

src/crud/insert/insert.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,35 @@ import { DependencyListSimpleModel } from "../../definitions/dependency-definiti
99
import { ReplacementParam } from "../../core/replacement-param";
1010
import { PrimaryKeyType } from "../../core/enums/primary-key-type";
1111
import { ModelUtils } from "../../core/model-utils";
12+
import { ValueTypeToParse } from "../../core/utils";
1213

1314
export class Insert<T> extends CrudBase<T, InsertBuilder<T>, InsertColumnsBuilder<T>> {
1415

1516
constructor(
1617
typeT: new () => T,
1718
{
18-
modelToSave,
19+
toSave,
1920
mapperTable,
2021
alias,
2122
database,
2223
enableLog = true
2324
}: {
24-
modelToSave: T,
25+
toSave?: T | Array<T>,
2526
mapperTable: MapperTable,
2627
alias?: string,
2728
database?: DatabaseBase,
2829
enableLog?: boolean
2930
}
3031
) {
31-
super(TypeCrud.CREATE, { mapperTable, builder: new InsertBuilder(typeT, mapperTable, alias, modelToSave), database, enableLog });
32+
super(TypeCrud.CREATE, { mapperTable, builder: new InsertBuilder(typeT, mapperTable, alias, toSave), database, enableLog });
3233
}
3334

3435
public columns(columnsCallback: (columns: InsertColumnsBuilder<T>) => void): Insert<T> {
3536
this._builder.columns(columnsCallback);
3637
return this;
3738
}
3839

39-
protected resolveDependencyByValue(dependency: MapperTable, value: any, index: number): QueryCompiled {
40+
protected resolveDependencyByValue(dependency: MapperTable, value: ValueTypeToParse, index: number): QueryCompiled {
4041
const modelBase = this.model();
4142
const modelDependency = {
4243
index,

0 commit comments

Comments
 (0)