@entity-access/entity-access 1.0.219 → 1.0.221

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 (46) hide show
  1. package/dist/query/ast/ExpressionToSql.d.ts +2 -1
  2. package/dist/query/ast/ExpressionToSql.d.ts.map +1 -1
  3. package/dist/query/ast/ExpressionToSql.js +3 -0
  4. package/dist/query/ast/ExpressionToSql.js.map +1 -1
  5. package/dist/query/ast/Expressions.d.ts +5 -1
  6. package/dist/query/ast/Expressions.d.ts.map +1 -1
  7. package/dist/query/ast/Expressions.js +6 -0
  8. package/dist/query/ast/Expressions.js.map +1 -1
  9. package/dist/query/ast/Visitor.d.ts +2 -1
  10. package/dist/query/ast/Visitor.d.ts.map +1 -1
  11. package/dist/query/ast/Visitor.js +5 -0
  12. package/dist/query/ast/Visitor.js.map +1 -1
  13. package/dist/query/expander/QueryExpander.d.ts +1 -1
  14. package/dist/query/expander/QueryExpander.d.ts.map +1 -1
  15. package/dist/query/expander/QueryExpander.js +7 -5
  16. package/dist/query/expander/QueryExpander.js.map +1 -1
  17. package/dist/query/parser/ArrowToExpression.d.ts +1 -0
  18. package/dist/query/parser/ArrowToExpression.d.ts.map +1 -1
  19. package/dist/query/parser/ArrowToExpression.js +4 -1
  20. package/dist/query/parser/ArrowToExpression.js.map +1 -1
  21. package/dist/query/parser/BabelVisitor.d.ts +1 -0
  22. package/dist/query/parser/BabelVisitor.d.ts.map +1 -1
  23. package/dist/query/parser/BabelVisitor.js +2 -0
  24. package/dist/query/parser/BabelVisitor.js.map +1 -1
  25. package/dist/query/parser/Restructure.d.ts +1 -0
  26. package/dist/query/parser/Restructure.d.ts.map +1 -1
  27. package/dist/query/parser/Restructure.js +3 -0
  28. package/dist/query/parser/Restructure.js.map +1 -1
  29. package/dist/query/parser/TransformVisitor.d.ts +1 -0
  30. package/dist/query/parser/TransformVisitor.d.ts.map +1 -1
  31. package/dist/query/parser/TransformVisitor.js +3 -0
  32. package/dist/query/parser/TransformVisitor.js.map +1 -1
  33. package/dist/tests/expressions/left-joins/child-joins.d.ts.map +1 -1
  34. package/dist/tests/expressions/left-joins/child-joins.js +4 -0
  35. package/dist/tests/expressions/left-joins/child-joins.js.map +1 -1
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/src/query/ast/ExpressionToSql.ts +5 -1
  39. package/src/query/ast/Expressions.ts +6 -0
  40. package/src/query/ast/Visitor.ts +6 -1
  41. package/src/query/expander/QueryExpander.ts +9 -8
  42. package/src/query/parser/ArrowToExpression.ts +5 -1
  43. package/src/query/parser/BabelVisitor.ts +3 -0
  44. package/src/query/parser/Restructure.ts +4 -0
  45. package/src/query/parser/TransformVisitor.ts +4 -0
  46. package/src/tests/expressions/left-joins/child-joins.ts +7 -0
@@ -19,7 +19,7 @@ export class QueryExpander {
19
19
 
20
20
  private include: SelectStatement[] = [];
21
21
 
22
- private included = new Map<string, [SelectStatement, EntityType]>();
22
+ private included = new Map<string, [string, SelectStatement, EntityType]>();
23
23
 
24
24
  constructor(
25
25
  private context: EntityContext,
@@ -29,7 +29,7 @@ export class QueryExpander {
29
29
 
30
30
  }
31
31
 
32
- expandNode(key: string, parent: SelectStatement, model: EntityType, node: ExpressionType): [SelectStatement, EntityType] {
32
+ expandNode(key: string, parent: SelectStatement, model: EntityType, node: ExpressionType): [string, SelectStatement, EntityType] {
33
33
 
34
34
  parent = cloner.clone(parent);
35
35
 
@@ -52,14 +52,14 @@ export class QueryExpander {
52
52
  if (property.value !== "forEach") {
53
53
  throw new NotSupportedError(property.value);
54
54
  }
55
- const [expandedSelect, expandedType] = this.expandNode(key, parent, model, callee.target as ExpressionType);
56
-
55
+ const [k, expandedSelect, expandedType] = this.expandNode(key, parent, model, callee.target as ExpressionType);
56
+ key = k;
57
57
  const arrow = node.arguments[0];
58
58
  if (!arrow || arrow.type !== "ArrowFunctionExpression") {
59
59
  throw new NotSupportedError(arrow?.type ?? "Empty Expression");
60
60
  }
61
61
  this.expandNode(key, expandedSelect, expandedType, (arrow as ArrowFunctionExpression).body as ExpressionType);
62
- return [expandedSelect, expandedType];
62
+ return [key, expandedSelect, expandedType];
63
63
  }
64
64
 
65
65
  if (node.type !== "MemberExpression") {
@@ -73,7 +73,8 @@ export class QueryExpander {
73
73
 
74
74
  const target = node.target as ExpressionType;
75
75
  if (target.type === "MemberExpression") {
76
- const [mepSelect, mepType] = this.expandNode( key, parent, model, target);
76
+ const [k, mepSelect, mepType] = this.expandNode( key, parent, model, target);
77
+ key = k;
77
78
  parent = mepSelect;
78
79
  model = mepType;
79
80
  }
@@ -153,7 +154,7 @@ export class QueryExpander {
153
154
  // const text = DebugStringVisitor.expressionToString(select);
154
155
  // console.log(text);
155
156
  this.include.push(select);
156
- relationSet = [select, relation.relatedEntity];
157
+ relationSet = [key, select, relation.relatedEntity];
157
158
  this.included.set(key, relationSet);
158
159
  return relationSet;
159
160
  }
@@ -211,7 +212,7 @@ export class QueryExpander {
211
212
 
212
213
  this.include.push(select);
213
214
 
214
- relationSet = [select, relation.relatedEntity];
215
+ relationSet = [key, select, relation.relatedEntity];
215
216
  this.included.set(key, relationSet);
216
217
  return relationSet;
217
218
  }
@@ -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, NullExpression, NumberLiteral, ParameterExpression, StringLiteral, TemplateLiteral } from "../ast/Expressions.js";
2
+ import { ArrowFunctionExpression, BinaryExpression, BooleanLiteral, 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";
@@ -104,6 +104,10 @@ export default class ArrowToExpression extends BabelVisitor<Expression> {
104
104
  return NumberLiteral.create({ value });
105
105
  }
106
106
 
107
+ visitUnaryExpression(node: bpe.UnaryExpression): Expression {
108
+ return NotExpression.create({ expression: this.visit(node.argument)});
109
+ }
110
+
107
111
  visitTemplateLiteral(node: bpe.TemplateLiteral) {
108
112
  // const value = node.expressions.map((x) => this.visit(x));
109
113
 
@@ -41,6 +41,8 @@ export abstract class BabelVisitor<T> {
41
41
  return this.visitTemplateElement(node);
42
42
  case "ArrayExpression":
43
43
  return this.visitArrayExpression(node);
44
+ case "UnaryExpression":
45
+ return this.visitUnaryExpression(node);
44
46
  case "RegExpLiteral":
45
47
  default:
46
48
  throw new Error(`Translation from ${node.type} not supported`);
@@ -53,6 +55,7 @@ export abstract class BabelVisitor<T> {
53
55
  visitObjectProperty(node: bpe.ObjectProperty): T {
54
56
  throw new Error("Method not implemented.");
55
57
  }
58
+ abstract visitUnaryExpression(node: bpe.UnaryExpression): T;
56
59
  abstract visitObjectExpression(node: bpe.ObjectExpression): T;
57
60
  abstract visitMemberExpression(node: bpe.MemberExpression): T;
58
61
  abstract visitLogicalExpression(node: bpe.LogicalExpression): T;
@@ -7,6 +7,10 @@ export default class Restructure extends TransformVisitor {
7
7
 
8
8
  private map: Map<string, bpe.Node> = new Map();
9
9
 
10
+ visitUnaryExpression(node: bpe.UnaryExpression): bpe.Node {
11
+ return node;
12
+ }
13
+
10
14
  visitTemplateElement(node: bpe.TemplateElement): bpe.Node {
11
15
  return node;
12
16
  }
@@ -68,6 +68,10 @@ export default class TransformVisitor extends BabelVisitor<bpe.Node> {
68
68
  return bpe.binaryExpression(node.operator, this.transform(node.left), this.transform(node.right));
69
69
  }
70
70
 
71
+ visitUnaryExpression(node: bpe.UnaryExpression): bpe.Node {
72
+ return bpe.unaryExpression(node.operator, node.argument, node.prefix);
73
+ }
74
+
71
75
  visitObjectProperty(node: bpe.ObjectProperty): bpe.Node {
72
76
 
73
77
  let key = node.key;
@@ -64,6 +64,8 @@ FROM order_items AS o1
64
64
  LEFT JOIN products AS p ON o1.product_id = p.product_id
65
65
  WHERE (o1.product_id = $1) OR (p.owner_id = $2)`;
66
66
 
67
+ const notExp = 'SELECT\n p1.product_id,\n\t\tp1.name,\n\t\tp1.owner_id,\n\t\tp1.status\n FROM products AS p1\n\tWHERE EXISTS (SELECT\n 1\n FROM order_items AS o\n\tWHERE (p1.product_id = o.product_id) AND (o.product_id = $1)) AND NOT (EXISTS (SELECT\n 1\n FROM order_items AS o1\n\t\t INNER JOIN orders AS o2 ON o1.order_id = o2.order_id\n\tWHERE (p1.product_id = o1.product_id) AND (o2.order_date > $2)))';
68
+
67
69
  export default function() {
68
70
 
69
71
  const context = new ShoppingContext(new PostgreSqlDriver({}));
@@ -88,4 +90,9 @@ export default function() {
88
90
  const q = context.orderItems.where({ o: 1, owner: 1}, (p) => (x) => x.productID === p.o || x.product.ownerID === p.owner);
89
91
  r = q.toQuery();
90
92
  assertSqlMatch(join2, r.text);
93
+
94
+ query = old.where({ date: new Date()}, (p) => (x) => !x.orderItems.some((o) => o.order.orderDate > p.date));
95
+ r = query.toQuery();
96
+ assertSqlMatch(notExp, r.text);
97
+
91
98
  }