Skip to content

Commit eb426ab

Browse files
author
Fernando Leal
committed
#5309 - Implementado como padrão das rotinas de cascade em dependencias a utilização de insert otimizado, em um unico comando para cada tabela.
1 parent e6c9800 commit eb426ab

11 files changed

Lines changed: 192 additions & 145 deletions

File tree

src/core/model-utils.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,34 +28,21 @@ export class ModelUtils {
2828
public static mergeValues(oldValue: any, newValue: any) {
2929
const newIsUndefined = Utils.isNull(newValue);
3030
const oldIsUndefined = Utils.isNull(oldValue);
31-
// const newIsUndefined = lodash.isUndefined(newValue);
32-
// const oldIsUndefined = lodash.isUndefined(oldValue);
3331
const newIsNumber = Utils.isValueNumber(newValue);
3432
const oldIsNumber = Utils.isValueNumber(oldValue);
3533
const newIsEmpty = newIsNumber && !newIsUndefined ? false : Utils.isEmpty(newValue);
3634
const oldIsEmpty = oldIsNumber && !oldIsUndefined ? false : Utils.isEmpty(oldValue);
3735

38-
// const oldIsGreatZero = oldIsNumber ? oldValue as number > 0 : false;
39-
// const newIsGreatZero = Utils.isValueNumber(newValue) ? newValue as number > 0 : false;
4036
const newIsValueDefault = Utils.isValueDefault(newValue);
4137
const oldIsValueDefault = Utils.isValueDefault(oldValue);
42-
// const oldIsNumberDefaultAndNewIsNumberValid = !oldIsGreatZero && newIsGreatZero;
4338

44-
// const newValueScoreGood = (newIsUndefined && -1) + (newIsEmpty && -1) + (newIsValueDefault && 1);
45-
// const oldValueScoreGood = (oldIsUndefined && -1) + (oldIsEmpty && -1) + (oldIsValueDefault && 1);
4639
const newValueScoreBad = (newIsUndefined && 3) + (newIsEmpty && 2) + (newIsValueDefault && 1);
4740
const oldValueScoreBad = (oldIsUndefined && 3) + (oldIsEmpty && 2) + (oldIsValueDefault && 1);
4841
const newValueIsGood = !newIsUndefined && !newIsEmpty && !newIsValueDefault;
49-
// const oldValueIsGood = !oldIsUndefined && !oldIsEmpty && !oldIsValueDefault;
5042

51-
// const useNewValue: boolean = (oldIsUndefined || oldIsEmpty) || (oldIsValueDefault && (!newIsUndefined || !newIsEmpty));
5243
const useNewValue: boolean =
53-
// (oldIsUndefined || oldIsEmpty) ||
5444
(oldIsValueDefault && (!newIsUndefined || !newIsEmpty)) ||
55-
// (newValueIsGood)
56-
(newValueScoreBad <= oldValueScoreBad)
57-
;
58-
// const useNewValue: boolean = (oldIsUndefined || oldIsEmpty) || (oldIsNumberDefaultAndNewIsNumberValid);
45+
(newValueScoreBad <= oldValueScoreBad);
5946
const result = useNewValue
6047
? newValue
6148
: oldValue;

src/crud/crud-base.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ export abstract class CrudBase<
7171
throw new DatabaseBuilderError(`Há ${models.length} models e ${results.length} results, e o "checkDatabaseResult" ainda não sabe como proceder nessa situação, possivelmente você está tentando executar multi comandos em combinação com comandos em cascade`);
7272
}
7373
// como não sei qual será o retorno do insertMultiple, vou continuar considerando apenas o primeiro para pegar o id inserted do head
74-
// let index = 0;
7574
for (let index = 0; index < models.length; index++) {
7675
const result = results[index];
7776
const model = models[index];

src/crud/delete/delete.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { DependencyListSimpleModel } from "../../definitions/dependency-definiti
1010
import { KeyUtils } from "../../core/key-utils";
1111
import { ColumnRef } from "../../core/column-ref";
1212
import { DatabaseBuilderError } from "../../core";
13-
import { Utils } from "../../core/utils";
13+
import { Utils, ValueTypeToParse } from "../../core/utils";
1414

1515
export class Delete<T> extends CrudBase<T, DeleteBuilder<T>, DeleteColumnsBuilder<T>> {
1616

@@ -41,7 +41,7 @@ export class Delete<T> extends CrudBase<T, DeleteBuilder<T>, DeleteColumnsBuilde
4141
return this;
4242
}
4343

44-
protected resolveDependencyByValue(dependency: MapperTable, value: any, index: number): QueryCompiled {
44+
protected resolveDependencyByValue(dependency: MapperTable, value: ValueTypeToParse, index: number): QueryCompiled {
4545
const builder = new DeleteBuilder(void 0, void 0, dependency);
4646
return builder.compile();
4747
}

src/crud/insert/insert.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,27 @@ export class Insert<T> extends CrudBase<T, InsertBuilder<T>, InsertColumnsBuilde
3737
return this;
3838
}
3939

40-
protected resolveDependencyByValue(dependency: MapperTable, value: ValueTypeToParse, index: number): QueryCompiled {
40+
protected compileValuesDependency(dependency: MapperTable, valuesDependencyArray: ValueTypeToParse[][], fieldReferenceSubItem: string): QueryCompiled[] {
41+
const scripts: QueryCompiled[] = [];
42+
valuesDependencyArray.forEach((valuesDependency) => {
43+
if (valuesDependency) {
44+
const dependenciesListSimpleModel = valuesDependency.map((value, index) => {
45+
const valueItem = fieldReferenceSubItem ? ModelUtils.get(value, fieldReferenceSubItem) : value;
46+
return this.createDependencyListSimpleModel(dependency, valueItem, index);
47+
});
48+
const builder = new InsertBuilder(void 0, dependency, void 0, dependenciesListSimpleModel);
49+
this.checkAndPush(scripts, builder.compile());
50+
}
51+
});
52+
return scripts;
53+
}
54+
55+
56+
private createDependencyListSimpleModel(dependency: MapperTable, value: ValueTypeToParse, index: number) {
4157
const modelBase = this.model();
4258
const modelDependency = {
4359
index,
4460
value,
45-
// reference: new ReplacementParam("0", "insertId")
4661
} as DependencyListSimpleModel;
4762
// Verificar se é Assigned a estrategia de Id, se for já adicionar como parametro
4863
if (this.mapperTable.keyColumns().length > 1) {
@@ -63,8 +78,7 @@ export class Insert<T> extends CrudBase<T, InsertBuilder<T>, InsertColumnsBuilde
6378
default:
6479
break;
6580
}
66-
const builder = new InsertBuilder(void 0, dependency, void 0, modelDependency);
67-
return builder.compile();
81+
return modelDependency;
6882
}
6983

7084
protected resolveDependency(dependency: MapperTable): QueryCompiled {

src/crud/query/query.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { WhereBuilder } from "../where-builder";
88
import { DatabaseBase, DatabaseResult } from "../../definitions/database-definition";
99
import { MetadataTable } from "../../metadata-table";
1010
import { QueryBuilder } from "./query-builder";
11-
import { ExpressionOrColumn, ParamType, TypeOrderBy, Utils } from "../../core/utils";
11+
import { ExpressionOrColumn, ParamType, TypeOrderBy, Utils, ValueTypeToParse } from "../../core/utils";
1212
import { OrderBy } from "../../core/enums/order-by";
1313
import { HavingBuilder } from "../having-builder";
1414
import { LambdaExpression } from "lambda-expression";
@@ -248,7 +248,7 @@ export class Query<TType> extends SqlBase<TType> {
248248
* @param cascade use cascade fetch in `hasMany` mapper (default = true)
249249
* @returns first or default @type {TPrimitiveType}
250250
*/
251-
public toSingle<TPrimitiveType extends string|number|boolean>(
251+
public toSingle<TPrimitiveType extends string | number | boolean>(
252252
{
253253
cascade = true,
254254
database,
@@ -260,7 +260,7 @@ export class Query<TType> extends SqlBase<TType> {
260260
where?: (whereCallback: WhereBuilder<TType>) => void,
261261
_default?: any
262262
} = {}
263-
): Observable<TPrimitiveType> {
263+
): Observable<TPrimitiveType> {
264264
if (where) {
265265
this.where(where);
266266
}
@@ -276,7 +276,7 @@ export class Query<TType> extends SqlBase<TType> {
276276
* @param cascade use cascade fetch in `hasMany` mapper (default = true)
277277
* @returns Array of @type {TPrimitiveType}
278278
*/
279-
public toSingleList<TPrimitiveType extends string|number|boolean>(
279+
public toSingleList<TPrimitiveType extends string | number | boolean>(
280280
{
281281
cascade = true,
282282
database
@@ -501,7 +501,7 @@ export class Query<TType> extends SqlBase<TType> {
501501
return this._queryBuilder.compile();
502502
}
503503

504-
protected resolveDependencyByValue(dependency: MapperTable, value: any, index: number): QueryCompiled {
504+
protected resolveDependencyByValue(dependency: MapperTable, value: ValueTypeToParse, index: number): QueryCompiled {
505505
const insert = new QueryBuilder(void 0, dependency, void 0);
506506
return insert.compile();
507507
}
@@ -541,7 +541,6 @@ export class Query<TType> extends SqlBase<TType> {
541541
database: this.database,
542542
enableLog: this.enableLog
543543
});
544-
// const queryDependency = new Query<DependencyListSimpleModel>(void 0, void 0, this._getMapper, dependency, this.database, this.enableLog);
545544
queryDependency.where(where => {
546545
const columnReference = dependency.getColumnNameByField<DependencyListSimpleModel, any>(x => x.reference);
547546
where.equal(new ColumnRef(columnReference), KeyUtils.getKey(mapperTable, model));
@@ -588,4 +587,8 @@ export class Query<TType> extends SqlBase<TType> {
588587
});
589588
});
590589
}
590+
591+
protected dependencies(): MapperTable[] {
592+
return this.mapperTable.dependencies;
593+
}
591594
}

src/crud/sql-base.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,30 +75,35 @@ export abstract class SqlBase<T> implements SqlCompilable, SqlExecutable {
7575
const columnDependency = this.mapperTable.columns.find(x => x.tableReference === dependency.tableName);
7676
const fieldArraySplit = columnDependency.fieldReference.split("[?].");
7777
const valuesDependencyArray: ValueTypeToParse[][] = Utils.getValue(this.model(), fieldArraySplit[0]);
78+
return [...script, ...this.compileValuesDependency(dependency, valuesDependencyArray, fieldArraySplit?.[1])];
79+
}
80+
81+
protected compileValuesDependency(dependency: MapperTable, valuesDependencyArray: ValueTypeToParse[][], fieldReferenceSubItem: string): QueryCompiled[] {
82+
const scripts: QueryCompiled[] = [];
7883
valuesDependencyArray.forEach((valuesDependency) => {
7984
if (valuesDependency) {
8085
valuesDependency.forEach((value, index) => {
81-
const valueItem = fieldArraySplit.length > 1 ? ModelUtils.get(value, fieldArraySplit[1]) : value;
82-
this.checkAndPush(script, this.resolveDependencyByValue(dependency, valueItem, index));
86+
const valueItem = fieldReferenceSubItem ? ModelUtils.get(value, fieldReferenceSubItem) : value;
87+
this.checkAndPush(scripts, this.resolveDependencyByValue(dependency, valueItem, index));
8388
});
8489
}
8590
});
86-
return script;
91+
return scripts;
8792
}
8893

89-
protected dependencies(): MapperTable[] {
90-
return this.mapperTable.dependencies;
91-
}
92-
// protected abstract dependencies(): MapperTable[];
94+
protected abstract dependencies(): MapperTable[];
9395

9496
protected abstract model(): T | Array<T>;
9597

9698
protected abstract builderCompiled(): QueryCompiled;
9799

98-
protected abstract resolveDependencyByValue(dependency: MapperTable, value: ValueTypeToParse, index: number): QueryCompiled;
99100
protected abstract resolveDependency(dependency: MapperTable): QueryCompiled;
100-
101+
101102
protected abstract checkDatabaseResult(promise: Observable<DatabaseResult[]>): Observable<DatabaseResult[]>;
103+
104+
protected resolveDependencyByValue(dependency: MapperTable, value: ValueTypeToParse, index: number): QueryCompiled{
105+
return void 0;
106+
}
102107

103108
protected getDatabase(database: DatabaseBase): DatabaseBase {
104109
const result = (database ? database : this.database);

src/crud/update/update.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { DeleteBuilder } from "../delete/delete-builder";
1111
import { InsertBuilder } from "../insert/insert-builder";
1212
import { KeyUtils } from "../../core/key-utils";
1313
import { ColumnRef } from "../../core/column-ref";
14+
import { ValueTypeToParse } from "../../core/utils";
15+
import { ModelUtils } from "../../core/model-utils";
1416

1517
export class Update<T> extends CrudBase<T, UpdateBuilder<T>, UpdateColumnsBuilder<T>> {
1618

@@ -43,15 +45,23 @@ export class Update<T> extends CrudBase<T, UpdateBuilder<T>, UpdateColumnsBuilde
4345
return this;
4446
}
4547

46-
protected resolveDependencyByValue(dependency: MapperTable, value: any, index: number): QueryCompiled {
47-
const builder = new InsertBuilder(void 0, dependency, void 0,
48-
{
49-
index,
50-
value,
51-
reference: KeyUtils.getKey(this.mapperTable, this.model())
52-
} as DependencyListSimpleModel
53-
);
54-
return builder.compile();
48+
protected compileValuesDependency(dependency: MapperTable, valuesDependencyArray: ValueTypeToParse[][], fieldReferenceSubItem: string): QueryCompiled[] {
49+
const scripts: QueryCompiled[] = [];
50+
valuesDependencyArray.forEach((valuesDependency) => {
51+
if (valuesDependency) {
52+
const dependenciesListSimpleModel = valuesDependency.map((value, index) => {
53+
const valueItem = fieldReferenceSubItem ? ModelUtils.get(value, fieldReferenceSubItem) : value;
54+
return {
55+
index,
56+
value: valueItem,
57+
reference: KeyUtils.getKey(this.mapperTable, this.model())
58+
} as DependencyListSimpleModel;
59+
});
60+
const builder = new InsertBuilder(void 0, dependency, void 0, dependenciesListSimpleModel);
61+
this.checkAndPush(scripts, builder.compile());
62+
}
63+
});
64+
return scripts;
5565
}
5666

5767
protected resolveDependency(dependency: MapperTable): QueryCompiled {

src/definitions/dependency-definition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ValueTypeToParse } from "../core/utils";
22

33
export interface DependencyListSimpleModel {
44
index: number;
5-
value: ValueTypeToParse;
5+
value: ValueTypeToParse | Array<ValueTypeToParse>;
66
reference: any;
77
}
88

0 commit comments

Comments
 (0)