@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.
Files changed (52) hide show
  1. package/.vscode/launch.json +21 -0
  2. package/README.md +1 -1
  3. package/dist/compiler/postgres/PostgreSqlMethodTransformer.js +2 -2
  4. package/dist/compiler/postgres/PostgreSqlMethodTransformer.js.map +1 -1
  5. package/dist/compiler/sql-server/SqlServerSqlMethodTransformer.js +2 -2
  6. package/dist/compiler/sql-server/SqlServerSqlMethodTransformer.js.map +1 -1
  7. package/dist/drivers/sql-server/SqlServerDriver.js +3 -1
  8. package/dist/drivers/sql-server/SqlServerDriver.js.map +1 -1
  9. package/dist/query/ast/ExpressionToSql.d.ts +2 -1
  10. package/dist/query/ast/ExpressionToSql.d.ts.map +1 -1
  11. package/dist/query/ast/ExpressionToSql.js +17 -4
  12. package/dist/query/ast/ExpressionToSql.js.map +1 -1
  13. package/dist/query/ast/Expressions.d.ts +6 -1
  14. package/dist/query/ast/Expressions.d.ts.map +1 -1
  15. package/dist/query/ast/Expressions.js +6 -0
  16. package/dist/query/ast/Expressions.js.map +1 -1
  17. package/dist/query/ast/Visitor.d.ts +2 -1
  18. package/dist/query/ast/Visitor.d.ts.map +1 -1
  19. package/dist/query/ast/Visitor.js +5 -0
  20. package/dist/query/ast/Visitor.js.map +1 -1
  21. package/dist/query/parser/ArrowToExpression.d.ts +10 -2
  22. package/dist/query/parser/ArrowToExpression.d.ts.map +1 -1
  23. package/dist/query/parser/ArrowToExpression.js +54 -2
  24. package/dist/query/parser/ArrowToExpression.js.map +1 -1
  25. package/dist/tests/db-tests/tests/select-inverse-one-to-one.js +2 -2
  26. package/dist/tests/db-tests/tests/select-inverse-one-to-one.js.map +1 -1
  27. package/dist/tests/db-tests/tests/select-items-sum.d.ts.map +1 -1
  28. package/dist/tests/db-tests/tests/select-items-sum.js +10 -1
  29. package/dist/tests/db-tests/tests/select-items-sum.js.map +1 -1
  30. package/dist/tests/model/ShoppingContext.d.ts +1 -0
  31. package/dist/tests/model/ShoppingContext.d.ts.map +1 -1
  32. package/dist/tests/model/ShoppingContext.js +4 -0
  33. package/dist/tests/model/ShoppingContext.js.map +1 -1
  34. package/dist/tests/security/events/UserFileEvents.js +1 -1
  35. package/dist/tests/security/events/UserFileEvents.js.map +1 -1
  36. package/dist/tests/security/tests/test-events.js +1 -1
  37. package/dist/tests/security/tests/test-events.js.map +1 -1
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +2 -1
  40. package/src/compiler/postgres/PostgreSqlMethodTransformer.ts +2 -2
  41. package/src/compiler/sql-server/SqlServerSqlMethodTransformer.ts +2 -2
  42. package/src/drivers/sql-server/SqlServerDriver.ts +4 -1
  43. package/src/query/ast/ExpressionToSql.ts +34 -18
  44. package/src/query/ast/Expressions.ts +7 -0
  45. package/src/query/ast/Visitor.ts +6 -1
  46. package/src/query/parser/ArrowToExpression.ts +66 -2
  47. package/src/tests/db-tests/tests/select-inverse-one-to-one.ts +2 -2
  48. package/src/tests/db-tests/tests/select-items-sum.ts +14 -1
  49. package/src/tests/model/ShoppingContext.ts +3 -0
  50. package/src/tests/security/events/UserFileEvents.ts +1 -1
  51. package/src/tests/security/tests/test-events.ts +1 -1
  52. 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
  ;
@@ -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
- return CallExpression.create({
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) => true) || x.profile.photos.some((a) => true))
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) => true))
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) => Sql.coll.sum(o.orderItems.map((oi) => oi.amount))))
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
+