@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.
- 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 +3 -0
- package/dist/query/ast/ExpressionToSql.js.map +1 -1
- package/dist/query/ast/Expressions.d.ts +5 -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/expander/QueryExpander.d.ts +1 -1
- package/dist/query/expander/QueryExpander.d.ts.map +1 -1
- package/dist/query/expander/QueryExpander.js +7 -5
- package/dist/query/expander/QueryExpander.js.map +1 -1
- package/dist/query/parser/ArrowToExpression.d.ts +1 -0
- package/dist/query/parser/ArrowToExpression.d.ts.map +1 -1
- package/dist/query/parser/ArrowToExpression.js +4 -1
- package/dist/query/parser/ArrowToExpression.js.map +1 -1
- package/dist/query/parser/BabelVisitor.d.ts +1 -0
- package/dist/query/parser/BabelVisitor.d.ts.map +1 -1
- package/dist/query/parser/BabelVisitor.js +2 -0
- package/dist/query/parser/BabelVisitor.js.map +1 -1
- package/dist/query/parser/Restructure.d.ts +1 -0
- package/dist/query/parser/Restructure.d.ts.map +1 -1
- package/dist/query/parser/Restructure.js +3 -0
- package/dist/query/parser/Restructure.js.map +1 -1
- package/dist/query/parser/TransformVisitor.d.ts +1 -0
- package/dist/query/parser/TransformVisitor.d.ts.map +1 -1
- package/dist/query/parser/TransformVisitor.js +3 -0
- package/dist/query/parser/TransformVisitor.js.map +1 -1
- package/dist/tests/expressions/left-joins/child-joins.d.ts.map +1 -1
- package/dist/tests/expressions/left-joins/child-joins.js +4 -0
- package/dist/tests/expressions/left-joins/child-joins.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/query/ast/ExpressionToSql.ts +5 -1
- package/src/query/ast/Expressions.ts +6 -0
- package/src/query/ast/Visitor.ts +6 -1
- package/src/query/expander/QueryExpander.ts +9 -8
- package/src/query/parser/ArrowToExpression.ts +5 -1
- package/src/query/parser/BabelVisitor.ts +3 -0
- package/src/query/parser/Restructure.ts +4 -0
- package/src/query/parser/TransformVisitor.ts +4 -0
- 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
|
}
|