Skip to content

Commit 8333b44

Browse files
author
Fernando Leal
committed
#5309 - Fase inicial concluida e todos os testes passando
1 parent e2887bf commit 8333b44

23 files changed

Lines changed: 477 additions & 145 deletions

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
{
22
"name": "database-builder",
3-
"version": "0.5.7",
3+
"version": "0.5.8",
44
"description": "Library to assist in creating and maintaining SQL commands.",
55
"main": "./src/index.js",
66
"types": "./src/index.d.ts",
77
"scripts": {
88
"test": "tsc & mocha src/test/**/*.spec.js",
99
"test-grep": "tsc & mocha src/test/**/*.spec.js --grep",
10-
"test-single": "tsc && mocha --inspect src/test/**/*.spec.js --grep Mapper",
11-
"test-debug": "mocha -r ts-node/register src/test/**/*.spec.ts --debug-brk",
10+
"test-single": "tsc && mocha --inspect src/test/**/*.spec.js --grep \"Insert Cascade\"",
11+
"test-d": "tsc && mocha --inspect src/test/**/*.spec.js",
12+
"test-debug": "mocha -r ts-node/register src/test/**/*.spec.ts --debug-brk --grep aqui",
1213
"lint": "tslint -p tsconfig.json",
1314
"build": "tsc",
1415
"publish-npm": "tsc & npm publish",

src/core/column.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { FieldType } from "./enums/field-type";
33
import { PrimaryKeyType } from "./enums/primary-key-type";
44

55
export interface Column {
6-
value: ValueType;
6+
value: Array<ValueType>;
77
name: string;
88
type: FieldType;
99
primaryKeyType?: PrimaryKeyType;

src/core/columns-base-builder.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export abstract class ColumnsBaseBuilder<
1818

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

@@ -84,19 +84,18 @@ export abstract class ColumnsBaseBuilder<
8484

8585
protected abstract setColumnValue(
8686
column: string,
87-
value: ValueTypeToParse,
87+
value: ValueTypeToParse[],
8888
fieldType: FieldType,
8989
primaryKeyType: PrimaryKeyType
9090
): TThis;
9191

92-
private setAllColumns(mapper: MapperTable, modelWithValue: T): void {
92+
private setAllColumns(mapper: MapperTable, modelWithValue: T | Array<T>): void {
9393
for (const key in mapper.columns) {
9494
if (mapper.columns.hasOwnProperty(key)) {
9595
const column = mapper.columns[key];
96-
const value = Utils.getValue<any, any>(modelWithValue, column.fieldReference);
9796
this.setColumnValue(
9897
column.column,
99-
value,
98+
Utils.getValue<ValueTypeToParse, T>(modelWithValue, column.fieldReference),
10099
column.fieldType,
101100
column.primaryKeyType
102101
);
@@ -110,7 +109,9 @@ export abstract class ColumnsBaseBuilder<
110109
if (type) {
111110
return this._databaseHelper.getFieldType(type);
112111
}
113-
const fieldTypeByMapper = this.mapperTable ? this.mapperTable.getColumnByField(columnExpression) : void 0;
112+
const fieldTypeByMapper = this.mapperTable
113+
? this.mapperTable.getColumnByField(columnExpression)
114+
: void 0;
114115
return fieldTypeByMapper
115116
? fieldTypeByMapper.fieldType
116117
: Utils.getType(this.modelToSave, columnExpression);

src/core/columns-compiled.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import { ValueType } from "./utils";
22
import { ColumnsBaseCompiled } from "./columns-base-compiled";
33

44
export interface ColumnsCompiled extends ColumnsBaseCompiled {
5-
params: ValueType[];
5+
params: Array<ValueType[]>;
66
}

src/core/columns-values-builder.ts

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { DatabaseBuilderError } from "./errors";
22
import { KeyUtils } from "./key-utils";
33
import { PrimaryKeyType } from "./enums/primary-key-type";
4-
import { ExpressionOrColumn, Utils, ValueTypeToParse } from "./utils";
4+
import { ExpressionOrColumn, Utils, ValueType, ValueTypeToParse } from "./utils";
55
import { ColumnsBaseBuilder } from "./columns-base-builder";
66
import { Column } from "./column";
77
import { FieldType } from "./enums/field-type";
@@ -13,60 +13,60 @@ export abstract class ColumnsValuesBuilder<
1313
T, TThis extends ColumnsValuesBuilder<T, TThis>>
1414
extends ColumnsBaseBuilder<TThis, T, Column> {
1515

16-
// TODO: fixed list task
1716
constructor(
18-
// metadata: MetadataTable<T>,
1917
mapperTable: MapperTable,
20-
modelToSave: T,
21-
// modelToSave: T = metadata.instance,
22-
// modelToSave: T = void 0,
18+
modelToSave: T | Array<T>,
2319
) {
2420
super(mapperTable, modelToSave);
25-
// super(metadata, modelToSave);
2621
}
2722

28-
public setColumnValue(
23+
protected setColumnValue(
2924
column: string,
30-
value: ValueTypeToParse,
25+
values: Array<ValueTypeToParse>,
3126
fieldType: FieldType,
3227
primaryKeyType?: PrimaryKeyType
3328
): TThis {
34-
switch (primaryKeyType) {
35-
case PrimaryKeyType.Assigned:
36-
if (Utils.isNull(value)) {
37-
throw new DatabaseBuilderError("Primary key to be informed when generation strategy is 'Assigned'!");
38-
}
39-
break;
40-
case PrimaryKeyType.Guid:
41-
if ((Utils.isNull(value) || (value as string).length === 0) && this.allowGenerateKey()) {
42-
// gerar GUID
43-
value = Utils.GUID();
44-
// set value GUID in model
45-
KeyUtils.setKey(this.mapperTable, this.modelToSave, value);
46-
// KeyUtils.setKey(this.metadata, this.modelToSave, value);
47-
}
48-
break;
49-
case PrimaryKeyType.AutoIncrement:
50-
default:
51-
break;
52-
}
29+
values = values.map((value, index) => {
30+
switch (primaryKeyType) {
31+
case PrimaryKeyType.Assigned:
32+
if (Utils.isNull(value)) {
33+
throw new DatabaseBuilderError("Primary key to be informed when generation strategy is 'Assigned'!");
34+
}
35+
return value;
36+
case PrimaryKeyType.Guid:
37+
if ((Utils.isNull(value) || (value as string).length === 0) && this.allowGenerateKey()) {
38+
// gerar GUID
39+
value = Utils.GUID();
40+
// set value GUID in model
41+
KeyUtils.setKey(this.mapperTable,
42+
Utils.isArray(this.modelToSave)
43+
? (this.modelToSave as Array<T>)[index]
44+
: this.modelToSave,
45+
value);
46+
}
47+
return value;
48+
case PrimaryKeyType.AutoIncrement:
49+
default:
50+
return value;
51+
}
52+
});
5353
this.columns.push({
5454
name: column,
5555
type: fieldType,
56-
value: Utils.getValueType(value, fieldType),
56+
value: Utils.getValueType(values, fieldType),
5757
primaryKeyType
5858
});
5959
return this.getInstance();
6060
}
6161

6262
public setValue<TReturn extends ValueTypeToParse>(
6363
expression: ExpressionOrColumn<TReturn, T>,
64-
value: TReturn,
64+
value: TReturn | Array<TReturn>,
6565
primaryKeyType?: PrimaryKeyType
6666
): TThis {
6767
return this.setColumnValue(
6868
Utils.getColumn(expression),
69-
value,
69+
Utils.isArray(value) ? value as Array<TReturn> : [value],
7070
Utils.getType(value),
7171
primaryKeyType
7272
);
@@ -95,17 +95,22 @@ export abstract class ColumnsValuesBuilder<
9595
const columnName = this.columnFormat(column);
9696
if (!Utils.isNull(columnName)) {
9797
result.columns.push(columnName);
98-
result.params.push(Utils.isNull(column.value) ? null : column.value);
98+
let values = (Utils.isArray(column.value) ? column.value : [column.value]) as Array<ValueType>;
99+
for (let index = 0; index < values.length; index++) {
100+
const item = values[index];
101+
if (!result.params[index])
102+
result.params[index] = [];
103+
result.params[index].push(this.resolveNullValueType(item));
104+
}
99105
}
100106
}
101107
});
102108
return result;
103109
}
104110

105-
// Use: Utils.isNull(value)
106-
// protected isValueNull(value: any): boolean {
107-
// return value === void 0;
108-
// }
111+
private resolveNullValueType(value: ValueType): ValueType {
112+
return Utils.isNull(value) ? null : value;
113+
}
109114

110115
protected allowGenerateKey(): boolean {
111116
return false;
@@ -124,7 +129,7 @@ export abstract class ColumnsValuesBuilder<
124129
return column.name;
125130
}
126131

127-
private getValueByExpression<TReturn>(expression: ExpressionOrColumn<TReturn, T>): TReturn {
132+
protected getValueByExpression<TReturn>(expression: ExpressionOrColumn<TReturn, T>): Array<TReturn> {
128133
return Utils.getValue(this.modelToSave, expression);
129134
}
130135
}

src/core/row-result.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ export class RowResult<T> {
4040
}
4141

4242
public get<TReturn>(expression: ExpressionOrColumn<TReturn, T>): TReturn {
43-
return Utils.getValue(this._valueT, expression);
43+
return Utils.getValue(this._valueT, expression)?.[0];
4444
}
4545

4646
public single<TReturn extends string | number | boolean>(): TReturn {
4747
const keys = Object.keys(this._valueT);
4848
if(keys.length == 1){
49-
return Utils.getValue(this._valueT, keys[0]);
49+
return Utils.getValue<TReturn, T>(this._valueT, keys[0])?.[0];
5050
}
5151
throw `It is not possible to get a single result (using .single()) when there are multiple projections in the query. Details: number of projections: ${keys.length}, current projections: ${keys}`;
5252
}

src/core/utils.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as moment from "moment";
33
import { WhereBuilder } from "../crud/where-builder";
44
import { DatabaseHelper } from "../database-helper";
55
import { ProjectionBuilder } from "../crud/projection-builder";
6-
import { Expression, ExpressionUtils, LambdaColumnMetadata, LambdaExpression, ReturnExpression } from "lambda-expression";
6+
import { Expression, ExpressionMetadata, ExpressionUtils, LambdaColumnMetadata, LambdaExpression, LambdaExpressionMetadata, LambdaPropertiesMetadata, ReturnExpression } from "lambda-expression";
77
import { LambdaMetadata } from "./lambda-metadata";
88
import { ExpressionOrColumnEnum } from "./enums/expression-or-column-enum";
99
import { FieldType } from "./enums/field-type";
@@ -260,13 +260,8 @@ export class Utils {
260260
params: []
261261
};
262262
case (ExpressionOrValueEnum.Ref):
263-
// return {
264-
// column: (expression as ColumnRef).result(),
265-
// params: []
266-
// };
267263
case (ExpressionOrValueEnum.Plan):
268264
return {
269-
// column: (expression as PlanRef).result(),
270265
column: expression as Resultable,
271266
params: []
272267
};
@@ -306,20 +301,30 @@ export class Utils {
306301
return this.getExpressionUtils().getColumnByExpression(expression, ".");
307302
}
308303

309-
public static getValue<TReturn, T>(instance: any, expression: ExpressionOrColumn<TReturn, T>): TReturn {
304+
public static getValue<TReturn, T>(instance: any | Array<any>, expression: ExpressionOrColumn<TReturn, T>)
305+
: Array<TReturn> {
306+
return this.getValues(Utils.isArray(instance) ? instance as Array<any> : [instance], expression)
307+
}
308+
309+
public static getValues<TReturn, T>(instance: Array<any>, expression: ExpressionOrColumn<TReturn, T>)
310+
: Array<TReturn> {
310311
return this.expressionOrColumn(expression) === ExpressionOrColumnEnum.Expression
311-
? this.getExpressionUtils().getValueByExpression(instance, expression as Expression<T>)
312-
: this.getExpressionUtils().getValue(instance, expression as string);
312+
? instance.map(item => this.getExpressionUtils().getValueByExpression(item, expression as Expression<T>))
313+
: instance.map(item => this.getExpressionUtils().getValue(item, expression as string));
313314
}
314315

315316
public static getTypeByValue(value: ValueTypeToParse): FieldType {
316317
return this.getDatabaseHelper().getType(value);
317318
}
318319

320+
public static getType(instance: Array<ValueTypeToParse>): FieldType;
319321
public static getType(instance: ValueTypeToParse): FieldType;
320322
public static getType<TReturn extends ValueTypeToParse, T>(instance: any, expression: ExpressionOrColumn<TReturn, T>): FieldType;
321323
public static getType<TReturn extends ValueTypeToParse, T>(instance: any, expression?: ExpressionOrColumn<TReturn, T>): FieldType {
322-
if (Utils.isNull(instance)) {
324+
if (this.isArray(instance)) {
325+
return this.getType((instance as Array<ValueTypeToParse>).find(x => !this.isNull(x) && this.isValue(x)));
326+
}
327+
if (this.isNull(instance)) {
323328
return void 0;
324329
}
325330
if (expression) {
@@ -328,8 +333,19 @@ export class Utils {
328333
return this.getTypeByValue(instance);
329334
}
330335

331-
public static getValueType(value: ValueTypeToParse, type: FieldType = void 0): ValueType {
332-
return this.getDatabaseHelper().parseToValueType(value, type);
336+
public static getValueType(value: ValueTypeToParse | Array<ValueTypeToParse>, type: FieldType = void 0)
337+
: Array<ValueType> {
338+
return this.getValuesType(Utils.isArray(value) ? value as Array<ValueTypeToParse> : [value], type);
339+
}
340+
341+
public static getValuesType(values: Array<ValueTypeToParse>, type: FieldType = void 0)
342+
: Array<ValueType> {
343+
if (this.isFlag(type, FieldType.ARRAY)) {
344+
// se o campo for do type ARRAY, passar o array para o tratamento e não tratar cada valor individualmente
345+
var t = this.getDatabaseHelper().parseToValueType(values?.[0], type);
346+
return [t];
347+
}
348+
return values.map(value => this.getDatabaseHelper().parseToValueType(value, type));
333349
}
334350

335351
public static parseColumnType(type: FieldType): ColumnType {
@@ -470,7 +486,7 @@ export class Utils {
470486

471487
public static getDatabaseHelper(): DatabaseHelper {
472488
return this._databaseHelper = this._databaseHelper ? this._databaseHelper : new DatabaseHelper();
473-
}
489+
}
474490

475491
public static objectToDatabaseResult(
476492
rows: any[],

0 commit comments

Comments
 (0)