Skip to content

Commit 9cdf7cc

Browse files
author
Fernando Leal
committed
Added single projection support, and update all dependencies
1 parent 6d24947 commit 9cdf7cc

8 files changed

Lines changed: 4183 additions & 680 deletions

File tree

package-lock.json

Lines changed: 3957 additions & 587 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "database-builder",
3-
"version": "0.5.3",
3+
"version": "0.5.6",
44
"description": "Library to assist in creating and maintaining SQL commands.",
55
"main": "./src/index.js",
66
"types": "./src/index.d.ts",
@@ -22,28 +22,28 @@
2222
},
2323
"dependencies": {
2424
"lambda-expression": ">=0.1.4",
25-
"lodash": "^4.17.15",
26-
"moment": "^2.22.0",
25+
"lodash": "^4.17.21",
26+
"moment": "^2.29.1",
2727
"reflect-metadata": "^0.1.13",
28-
"rxjs": "^6.5.3",
29-
"uuid": "^3.3.2"
28+
"rxjs": "^7.5.2",
29+
"uuid": "^8.3.2"
3030
},
3131
"devDependencies": {
32-
"@types/chai": "^4.2.6",
33-
"@types/chai-as-promised": "^7.1.2",
34-
"@types/lodash": "^4.14.149",
35-
"@types/mocha": "^5.2.7",
36-
"@types/sinon": "^7.5.2",
37-
"@types/sqlite3": "^3.1.5",
38-
"@types/uuid": "^3.4.4",
39-
"chai": "^4.2.0",
32+
"@types/chai": "^4.3.0",
33+
"@types/chai-as-promised": "^7.1.4",
34+
"@types/lodash": "^4.14.178",
35+
"@types/mocha": "^9.0.0",
36+
"@types/sinon": "^10.0.6",
37+
"@types/sqlite3": "^3.1.8",
38+
"@types/uuid": "^8.3.4",
39+
"chai": "^4.3.4",
4040
"chai-as-promised": "^7.1.1",
41-
"mocha": "^6.2.2",
42-
"sinon": "^9.0.0",
43-
"sqlite3": "^4.1.1",
41+
"mocha": "^9.1.4",
42+
"sinon": "^12.0.1",
43+
"sqlite3": "^5.0.2",
4444
"terser": "^5.10.0",
45-
"ts-node": "^8.5.4",
46-
"tslint": "^5.20.1",
45+
"ts-node": "^10.4.0",
46+
"tslint": "^6.1.3",
4747
"typescript": "^4.5.4"
4848
},
4949
"keywords": [

src/core/row-result.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ export class RowResult<T> {
4343
return Utils.getValue(this._valueT, expression);
4444
}
4545

46+
public single<TReturn extends string | number | boolean>(): TReturn {
47+
const keys = Object.keys(this._valueT);
48+
if(keys.length == 1){
49+
return Utils.getValue(this._valueT, keys[0]);
50+
}
51+
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}`;
52+
}
53+
4654
public coalesce<TReturn>(expression: ExpressionOrColumn<TReturn, T>, defaultValue: TReturn) {
4755
const value = this.get(expression);
4856
// tslint:disable-next-line:triple-equals

src/core/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { ProjectionsHelper } from "./projections-helper";
1515
import { ColumnParams } from "./column-params";
1616
import { ColumnRef } from "./column-ref";
1717
import { PlanRef } from "./plan-ref";
18-
import * as uuidv4 from "uuid/v4";
18+
import * as uuid from "uuid";
1919
import { ReplacementParam } from "./replacement-param";
2020
import { Query, QueryBuilder } from "../crud";
2121
import { MetadataTable } from "../metadata-table";
@@ -66,7 +66,7 @@ export class Utils {
6666

6767
// Fonte: https://www.npmjs.com/package/uuid
6868
public static GUID() {
69-
return uuidv4();
69+
return uuid.v4();
7070
}
7171

7272
public static isFlag(value: any, flag: any) {

src/crud/query/query.ts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { SqlBase } from "../sql-base";
2121
import { ModelUtils } from "../../core/model-utils";
2222
import { DependencyListSimpleModel } from "../../definitions/dependency-definition";
2323
import { KeyUtils } from "../../core/key-utils";
24-
import { Observable, Observer } from "rxjs";
24+
import { map, Observable, Observer } from "rxjs";
2525
import { forkJoinSafe } from "../../safe-utils";
2626
import { ProjectionsUtils } from "../../core/projections-utils";
2727

@@ -243,6 +243,51 @@ export class Query<TType> extends SqlBase<TType> {
243243
return this.executeAndRead({ cascade, database });
244244
}
245245

246+
/**
247+
* Execute query and parse to @type {TPrimitiveType}
248+
* @param cascade use cascade fetch in `hasMany` mapper (default = true)
249+
* @returns first or default @type {TPrimitiveType}
250+
*/
251+
public toSingle<TPrimitiveType extends string|number|boolean>(
252+
{
253+
cascade = true,
254+
database,
255+
where,
256+
_default
257+
}: {
258+
cascade?: boolean,
259+
database?: DatabaseBase,
260+
where?: (whereCallback: WhereBuilder<TType>) => void,
261+
_default?: any
262+
} = {}
263+
): Observable<TPrimitiveType> {
264+
if (where) {
265+
this.where(where);
266+
}
267+
return this.limit(1)
268+
.toSingleList<TPrimitiveType>({ cascade, database })
269+
.pipe(
270+
map(result => (result && result.length) ? result[0] : _default)
271+
);
272+
}
273+
274+
/**
275+
* Execute query and parse to @type {TPrimitiveType}
276+
* @param cascade use cascade fetch in `hasMany` mapper (default = true)
277+
* @returns Array of @type {TPrimitiveType}
278+
*/
279+
public toSingleList<TPrimitiveType extends string|number|boolean>(
280+
{
281+
cascade = true,
282+
database
283+
}: {
284+
cascade?: boolean,
285+
database?: DatabaseBase
286+
} = {}
287+
): Observable<TPrimitiveType[]> {
288+
return this.mapper<TPrimitiveType>(r => r.single<TPrimitiveType>(), { cascade, database });
289+
}
290+
246291
/**
247292
* Allow each parse items cursor
248293
* @param mapper callback mapper item

src/test/single-transaction-manager.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ chai.use(chaiAsPromised);
1717
const expect = chai.expect;
1818

1919
describe("Single Transaction Manager", function () {
20-
(this as any).enableTimeouts(false);
20+
this.timeout(999999);
2121

2222
let crud: Crud;
2323
let ddl: Ddl;
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { Ddl } from "../../ddl/ddl";
2+
import { expect } from "chai";
3+
import { Cidade } from "../models/cidade";
4+
import { getMapper } from "../mappers-table-new";
5+
import { Uf } from "../models/uf";
6+
import { SQLiteDatabase } from "../database/sqlite-database";
7+
import { Regiao } from "../models/regiao";
8+
import { SubRegiao } from "../models/sub-regiao";
9+
import { Cliente } from "../models/cliente";
10+
import { lastValueFrom } from "rxjs";
11+
import { Crud } from "../../crud";
12+
13+
describe("DataSelect", () => {
14+
let crud: Crud;
15+
let ddl: Ddl;
16+
17+
beforeEach(async () => {
18+
const mapper = getMapper();
19+
20+
const database = await new SQLiteDatabase().init();
21+
crud = new Crud({ database, getMapper: mapper, enableLog: false });
22+
ddl = new Ddl({ database, getMapper: mapper, enableLog: false });
23+
24+
await lastValueFrom(ddl.create(Cliente).execute());
25+
await lastValueFrom(ddl.create(Cidade).execute());
26+
await lastValueFrom(ddl.create(Uf).execute());
27+
await lastValueFrom(ddl.create(SubRegiao).execute());
28+
await lastValueFrom(ddl.create(Regiao).execute());
29+
});
30+
31+
it("select toSingle", async () => {
32+
const cidade = { nome: "Petrolina", codeImport: 123, population: 735646, subRegiao: { codeImport: 234 }, uf: { codeImport: "AC" } } as Cidade;
33+
const insert = crud.insert(Cidade, {
34+
modelToSave: cidade
35+
});
36+
const insertedResult = await lastValueFrom(insert.execute());
37+
expect(insertedResult[0].rowsAffected).to.equal(1);
38+
39+
const resultCidadeNome = await lastValueFrom(crud.query(Cidade)
40+
.select(x => x.nome)
41+
.toSingle()
42+
);
43+
expect(resultCidadeNome).to.not.null;
44+
expect(resultCidadeNome).to.equal(cidade.nome);
45+
});
46+
47+
it("select mapper single", async () => {
48+
const cidade = { nome: "Petrolina", codeImport: 123, population: 735646, subRegiao: { codeImport: 234 }, uf: { codeImport: "AC" } } as Cidade;
49+
const insert = crud.insert(Cidade, {
50+
modelToSave: cidade
51+
});
52+
const insertedResult = await lastValueFrom(insert.execute());
53+
expect(insertedResult[0].rowsAffected).to.equal(1);
54+
55+
const resultCidadeNome = await lastValueFrom(crud.query(Cidade)
56+
.select(x => x.nome)
57+
.mapper<string>(r => r.single<string>())
58+
);
59+
expect(resultCidadeNome).to.length(1);
60+
expect(resultCidadeNome[0]).to.equal(cidade.nome);
61+
});
62+
63+
it("select toSingleList", async () => {
64+
const cidade = { nome: "Petrolina", codeImport: 123, population: 735646, subRegiao: { codeImport: 234 }, uf: { codeImport: "AC" } } as Cidade;
65+
const insert = crud.insert(Cidade, {
66+
modelToSave: cidade
67+
});
68+
const insertedResult = await lastValueFrom(insert.execute());
69+
expect(insertedResult[0].rowsAffected).to.equal(1);
70+
71+
const resultCidadeNome = await lastValueFrom(crud.query(Cidade)
72+
.select(x => x.nome)
73+
.toSingleList()
74+
);
75+
expect(resultCidadeNome).to.length(1);
76+
expect(resultCidadeNome[0]).to.equal(cidade.nome);
77+
});
78+
});

0 commit comments

Comments
 (0)