@entity-access/entity-access 1.0.302 → 1.0.304
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/launch.json +21 -0
- package/README.md +1 -1
- package/dist/compiler/postgres/PostgreSqlMethodTransformer.js +2 -2
- package/dist/compiler/postgres/PostgreSqlMethodTransformer.js.map +1 -1
- package/dist/compiler/sql-server/SqlServerSqlMethodTransformer.js +2 -2
- package/dist/compiler/sql-server/SqlServerSqlMethodTransformer.js.map +1 -1
- package/dist/drivers/sql-server/SqlServerDriver.js +3 -1
- package/dist/drivers/sql-server/SqlServerDriver.js.map +1 -1
- package/dist/query/ast/ExpressionToSql.d.ts +2 -1
- package/dist/query/ast/ExpressionToSql.d.ts.map +1 -1
- package/dist/query/ast/ExpressionToSql.js +17 -4
- package/dist/query/ast/ExpressionToSql.js.map +1 -1
- package/dist/query/ast/Expressions.d.ts +6 -1
- package/dist/query/ast/Expressions.d.ts.map +1 -1
- package/dist/query/ast/Expressions.js +6 -0
- package/dist/query/ast/Expressions.js.map +1 -1
- package/dist/query/ast/Visitor.d.ts +2 -1
- package/dist/query/ast/Visitor.d.ts.map +1 -1
- package/dist/query/ast/Visitor.js +5 -0
- package/dist/query/ast/Visitor.js.map +1 -1
- package/dist/query/parser/ArrowToExpression.d.ts +10 -2
- package/dist/query/parser/ArrowToExpression.d.ts.map +1 -1
- package/dist/query/parser/ArrowToExpression.js +54 -2
- package/dist/query/parser/ArrowToExpression.js.map +1 -1
- package/dist/tests/db-tests/tests/select-inverse-one-to-one.js +2 -2
- package/dist/tests/db-tests/tests/select-inverse-one-to-one.js.map +1 -1
- package/dist/tests/db-tests/tests/select-items-sum.d.ts.map +1 -1
- package/dist/tests/db-tests/tests/select-items-sum.js +10 -1
- package/dist/tests/db-tests/tests/select-items-sum.js.map +1 -1
- package/dist/tests/model/ShoppingContext.d.ts +1 -0
- package/dist/tests/model/ShoppingContext.d.ts.map +1 -1
- package/dist/tests/model/ShoppingContext.js +4 -0
- package/dist/tests/model/ShoppingContext.js.map +1 -1
- package/dist/tests/security/events/UserFileEvents.js +1 -1
- package/dist/tests/security/events/UserFileEvents.js.map +1 -1
- package/dist/tests/security/tests/test-events.js +1 -1
- package/dist/tests/security/tests/test-events.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/compiler/postgres/PostgreSqlMethodTransformer.ts +2 -2
- package/src/compiler/sql-server/SqlServerSqlMethodTransformer.ts +2 -2
- package/src/drivers/sql-server/SqlServerDriver.ts +4 -1
- package/src/query/ast/ExpressionToSql.ts +34 -18
- package/src/query/ast/Expressions.ts +7 -0
- package/src/query/ast/Visitor.ts +6 -1
- package/src/query/parser/ArrowToExpression.ts +66 -2
- package/src/tests/db-tests/tests/select-inverse-one-to-one.ts +2 -2
- package/src/tests/db-tests/tests/select-items-sum.ts +14 -1
- package/src/tests/model/ShoppingContext.ts +3 -0
- package/src/tests/security/events/UserFileEvents.ts +1 -1
- package/src/tests/security/tests/test-events.ts +1 -1
- package/tests/local-unit-tests/docker-compose.yml +32 -0
|
@@ -214,6 +214,11 @@ export class CallExpression extends Expression {
|
|
|
214
214
|
arguments: Expression[];
|
|
215
215
|
}
|
|
216
216
|
|
|
217
|
+
export class BracketExpression extends Expression {
|
|
218
|
+
readonly type = "BracketExpression";
|
|
219
|
+
target: Expression;
|
|
220
|
+
}
|
|
221
|
+
|
|
217
222
|
export class ParameterExpression extends Expression {
|
|
218
223
|
readonly type = "ParameterExpression";
|
|
219
224
|
name: string;
|
|
@@ -239,6 +244,7 @@ export class MemberExpression extends Expression {
|
|
|
239
244
|
target: Expression;
|
|
240
245
|
property: Expression;
|
|
241
246
|
computed: boolean;
|
|
247
|
+
isCollectionMethod: boolean;
|
|
242
248
|
}
|
|
243
249
|
|
|
244
250
|
export class ArrowFunctionExpression extends Expression {
|
|
@@ -477,5 +483,6 @@ export type ExpressionType =
|
|
|
477
483
|
NotExits |
|
|
478
484
|
UnionAllStatement |
|
|
479
485
|
NotExpression |
|
|
486
|
+
BracketExpression |
|
|
480
487
|
TemplateElement
|
|
481
488
|
;
|
package/src/query/ast/Visitor.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NotSupportedError } from "../parser/NotSupportedError.js";
|
|
2
|
-
import { ArrayExpression, ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, ExpressionType, Identifier, InsertStatement, JoinExpression, MemberExpression, UpsertStatement, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateElement, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement, NotExpression } from "./Expressions.js";
|
|
2
|
+
import { ArrayExpression, ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, ExpressionType, Identifier, InsertStatement, JoinExpression, MemberExpression, UpsertStatement, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateElement, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement, NotExpression, BracketExpression } from "./Expressions.js";
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
export default abstract class Visitor<T = any> {
|
|
@@ -75,10 +75,15 @@ export default abstract class Visitor<T = any> {
|
|
|
75
75
|
return this.visitUpsertStatement(e);
|
|
76
76
|
case "NotExpression":
|
|
77
77
|
return this.visitNotExpression(e);
|
|
78
|
+
case "BracketExpression":
|
|
79
|
+
return this.visitBracketExpression(e);
|
|
78
80
|
}
|
|
79
81
|
const c: never = e;
|
|
80
82
|
throw new Error(`${e1.type} Not implemented`);
|
|
81
83
|
}
|
|
84
|
+
visitBracketExpression(e: BracketExpression): T {
|
|
85
|
+
throw new Error("Method not implemented.");
|
|
86
|
+
}
|
|
82
87
|
visitNotExpression(e: NotExpression): T {
|
|
83
88
|
throw new Error("Method not implemented.");
|
|
84
89
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseExpression } from "@babel/parser";
|
|
2
|
-
import { ArrowFunctionExpression, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, Expression, ExpressionAs, Identifier, MemberExpression, NewObjectExpression, NotExpression, NullExpression, NumberLiteral, ParameterExpression, StringLiteral, TemplateLiteral } from "../ast/Expressions.js";
|
|
2
|
+
import { ArrowFunctionExpression, BinaryExpression, BooleanLiteral, BracketExpression, CallExpression, CoalesceExpression, ConditionalExpression, Constant, Expression, ExpressionAs, Identifier, MemberExpression, NewObjectExpression, NotExpression, NullExpression, NumberLiteral, ParameterExpression, StringLiteral, TemplateLiteral } from "../ast/Expressions.js";
|
|
3
3
|
import { BabelVisitor } from "./BabelVisitor.js";
|
|
4
4
|
import * as bpe from "@babel/types";
|
|
5
5
|
import Restructure from "./Restructure.js";
|
|
@@ -217,10 +217,74 @@ export default class ArrowToExpression extends BabelVisitor<Expression> {
|
|
|
217
217
|
|
|
218
218
|
// change Sql.coll. with arrow functions to move it inside
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
const ce = CallExpression.create({
|
|
221
221
|
callee: callee ? this.visit(callee) : void 0,
|
|
222
222
|
arguments: args ? args.map((x) => this.visit(x)) : []
|
|
223
223
|
});
|
|
224
|
+
|
|
225
|
+
// for Sql.Coll. , change it to coalesce
|
|
226
|
+
// and move Sql.Coll. inside the first map..
|
|
227
|
+
return this.reAssignCollectionMethods(ce);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* We need to change Sql.coll.sum(p.orders.map((o) => o.total)
|
|
232
|
+
* to
|
|
233
|
+
* p.orders.sum((o) => o.total) ?? 0
|
|
234
|
+
* @param ce
|
|
235
|
+
* @returns
|
|
236
|
+
*/
|
|
237
|
+
reAssignCollectionMethods(ce: CallExpression) {
|
|
238
|
+
|
|
239
|
+
if (ce.callee.type !== "MemberExpression") {
|
|
240
|
+
return ce;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const firstArg = ce.arguments[0] as CallExpression;
|
|
244
|
+
if (firstArg?.type !== "CallExpression") {
|
|
245
|
+
return ce;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const mapCallee = firstArg.callee as MemberExpression;
|
|
249
|
+
if (mapCallee?.type !== "MemberExpression") {
|
|
250
|
+
return ce;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const me = ce.callee as MemberExpression;
|
|
254
|
+
const method = (me.property as Identifier).value;
|
|
255
|
+
|
|
256
|
+
if (me.type !== "MemberExpression") {
|
|
257
|
+
return ce;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if(me.target.type !== "MemberExpression") {
|
|
261
|
+
return ce;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const collMember = me.target as MemberExpression;
|
|
265
|
+
if((collMember.property as Identifier).value !== "coll") {
|
|
266
|
+
return ce;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if((collMember.target as Identifier)?.value !== "Sql") {
|
|
270
|
+
return ce;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const left = CallExpression.create({
|
|
274
|
+
callee: MemberExpression.create({
|
|
275
|
+
target: mapCallee.target,
|
|
276
|
+
property: Expression.identifier(method),
|
|
277
|
+
isCollectionMethod: true
|
|
278
|
+
}),
|
|
279
|
+
arguments: firstArg.arguments
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
// move it inside...
|
|
283
|
+
const rewritten = CoalesceExpression.create({
|
|
284
|
+
left: BracketExpression.create({ target: left }) ,
|
|
285
|
+
right: NumberLiteral.zero
|
|
286
|
+
});
|
|
287
|
+
return rewritten;
|
|
224
288
|
}
|
|
225
289
|
|
|
226
290
|
visitIdentifier({ name: value }: bpe.Identifier): Expression {
|
|
@@ -19,14 +19,14 @@ export default async function(this: TestConfig) {
|
|
|
19
19
|
|
|
20
20
|
// include inverse...
|
|
21
21
|
let all = await context.users.all()
|
|
22
|
-
.where({} , (p) => (x) => x.profile.photos.some((a) =>
|
|
22
|
+
.where({} , (p) => (x) => x.profile.photos.some((a) => a.photoID > 0) || x.profile.photos.some((a) => a.photoID > 0))
|
|
23
23
|
.include((x) => x.profile.photos)
|
|
24
24
|
.first();
|
|
25
25
|
|
|
26
26
|
assert.equal(null, all);
|
|
27
27
|
|
|
28
28
|
all = await context.users.all()
|
|
29
|
-
.where({} , (p) => (x) => x.files.some((a) =>
|
|
29
|
+
.where({} , (p) => (x) => x.files.some((a) => a.fileID > 0))
|
|
30
30
|
.include((x) => x.files)
|
|
31
31
|
.first();
|
|
32
32
|
|
|
@@ -12,6 +12,14 @@ export default async function(this: TestConfig) {
|
|
|
12
12
|
const context = await createContext(this.driver);
|
|
13
13
|
|
|
14
14
|
let report;
|
|
15
|
+
|
|
16
|
+
// const user = await context.users.all()
|
|
17
|
+
// .where({}, (p) => (x) => x.orders.some((oi) => oi.customerID > 0))
|
|
18
|
+
// .trace(console.log)
|
|
19
|
+
// .first();
|
|
20
|
+
|
|
21
|
+
// assert.notEqual(null, user);
|
|
22
|
+
|
|
15
23
|
// report = await context.users.all()
|
|
16
24
|
// .where({}, (p) => (x) => x.orders.some((oi) => oi.customerID > 0))
|
|
17
25
|
// .map({}, (p) => (x) => ({
|
|
@@ -23,12 +31,17 @@ export default async function(this: TestConfig) {
|
|
|
23
31
|
|
|
24
32
|
// assert.notEqual(null, report);
|
|
25
33
|
|
|
34
|
+
await context.orders.asQuery()
|
|
35
|
+
.update(void 0, (p) => (x) => ({
|
|
36
|
+
total: Sql.coll.sum(x.orderItems.map((o) => o.amount ))
|
|
37
|
+
}));
|
|
38
|
+
|
|
26
39
|
report = await context.users.all()
|
|
27
40
|
.where({}, (p) => (x) => x.orders.some((oi) => oi.customerID > 0))
|
|
28
41
|
.map({}, (p) => (x) => ({
|
|
29
42
|
total: Sql.coll.sum(x.orders
|
|
30
43
|
.filter((o) => o.status === "pending")
|
|
31
|
-
.map((o) =>
|
|
44
|
+
.map((o) => o.total))
|
|
32
45
|
})
|
|
33
46
|
)
|
|
34
47
|
.trace(console.log)
|
|
@@ -345,6 +345,9 @@ export class Order {
|
|
|
345
345
|
@Column({ dataType: "Char", length: 20, default: () => "pending"})
|
|
346
346
|
public status: string;
|
|
347
347
|
|
|
348
|
+
@Column({ dataType: "Decimal", default: () => 0})
|
|
349
|
+
public total: number;
|
|
350
|
+
|
|
348
351
|
public orderItems: OrderItem[];
|
|
349
352
|
|
|
350
353
|
public customer: User;
|
|
@@ -5,7 +5,7 @@ import { UserFile } from "../../model/UseFile.js";
|
|
|
5
5
|
export class UserFileEvents extends EntityEvents<UserFile> {
|
|
6
6
|
|
|
7
7
|
filter(query: IEntityQuery<UserFile>): IEntityQuery<UserFile> {
|
|
8
|
-
return query.where({}, (p) => (x) => x.photoUsers.some((p1) => p1.orders.some((o1) => true)));
|
|
8
|
+
return query.where({}, (p) => (x) => x.photoUsers.some((p1) => p1.orders.some((o1) => true === true)));
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
}
|
|
@@ -48,7 +48,7 @@ export default async function (this: TestConfig) {
|
|
|
48
48
|
await context.saveChanges();
|
|
49
49
|
assert.equal(true, p.afterInsertInvoked);
|
|
50
50
|
|
|
51
|
-
await context.userFiles.filtered("read").where({}, (_) => (x) => x.photoUsers.some((p1) => true))
|
|
51
|
+
await context.userFiles.filtered("read").where({}, (_) => (x) => x.photoUsers.some((p1) => true === true))
|
|
52
52
|
.include((x) => x.user.profile).toArray();
|
|
53
53
|
|
|
54
54
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
version: '3.4'
|
|
2
|
+
name: local-pg-test
|
|
3
|
+
services:
|
|
4
|
+
mssql:
|
|
5
|
+
image: mcr.microsoft.com/mssql/server:2019-latest
|
|
6
|
+
container_name: sql-server
|
|
7
|
+
environment:
|
|
8
|
+
- ACCEPT_EULA=Y
|
|
9
|
+
- MSSQL_SA_PASSWORD=$$EntityAccess2023
|
|
10
|
+
- MSSQL_PID=Express
|
|
11
|
+
ports:
|
|
12
|
+
- 1433:1433
|
|
13
|
+
postgresdb:
|
|
14
|
+
image: postgres:alpine
|
|
15
|
+
container_name: pg-test
|
|
16
|
+
restart: unless-stopped
|
|
17
|
+
environment:
|
|
18
|
+
- POSTGRES_PASSWORD=abcd123
|
|
19
|
+
ports:
|
|
20
|
+
- 5432:5432
|
|
21
|
+
pgadmin:
|
|
22
|
+
image: dpage/pgadmin4
|
|
23
|
+
container_name: pg-admin
|
|
24
|
+
restart: unless-stopped
|
|
25
|
+
environment:
|
|
26
|
+
- PGADMIN_CONFIG_SERVER_MODE=False
|
|
27
|
+
- PGADMIN_DEFAULT_EMAIL=x@x.com
|
|
28
|
+
- PGADMIN_DEFAULT_PASSWORD=x
|
|
29
|
+
- PGADMIN_DISABLE_POSTFIX=True
|
|
30
|
+
ports:
|
|
31
|
+
- 9999:80
|
|
32
|
+
|