@abaplint/transpiler 2.1.68 → 2.1.70
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/build/src/expressions/index.d.ts +2 -1
- package/build/src/expressions/index.js +2 -1
- package/build/src/expressions/sql_cond.d.ts +9 -0
- package/build/src/expressions/sql_cond.js +78 -0
- package/build/src/statements/delete_database.js +5 -0
- package/build/src/statements/select.d.ts +0 -3
- package/build/src/statements/select.js +9 -69
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ export * from "./compare";
|
|
|
8
8
|
export * from "./component_chain_simple";
|
|
9
9
|
export * from "./component_chain";
|
|
10
10
|
export * from "./component_compare";
|
|
11
|
+
export * from "./component_cond_sub";
|
|
11
12
|
export * from "./component_cond";
|
|
12
13
|
export * from "./cond_sub";
|
|
13
14
|
export * from "./cond";
|
|
@@ -15,7 +16,6 @@ export * from "./constant";
|
|
|
15
16
|
export * from "./database_table";
|
|
16
17
|
export * from "./field_chain";
|
|
17
18
|
export * from "./field_length";
|
|
18
|
-
export * from "./component_cond_sub";
|
|
19
19
|
export * from "./field_offset";
|
|
20
20
|
export * from "./field_symbol";
|
|
21
21
|
export * from "./function_exporting";
|
|
@@ -37,6 +37,7 @@ export * from "./simple_source3";
|
|
|
37
37
|
export * from "./simple_source4";
|
|
38
38
|
export * from "./source_field_symbol";
|
|
39
39
|
export * from "./source";
|
|
40
|
+
export * from "./sql_cond";
|
|
40
41
|
export * from "./sql_source_simple";
|
|
41
42
|
export * from "./sql_source";
|
|
42
43
|
export * from "./string_template_source";
|
|
@@ -24,6 +24,7 @@ __exportStar(require("./compare"), exports);
|
|
|
24
24
|
__exportStar(require("./component_chain_simple"), exports);
|
|
25
25
|
__exportStar(require("./component_chain"), exports);
|
|
26
26
|
__exportStar(require("./component_compare"), exports);
|
|
27
|
+
__exportStar(require("./component_cond_sub"), exports);
|
|
27
28
|
__exportStar(require("./component_cond"), exports);
|
|
28
29
|
__exportStar(require("./cond_sub"), exports);
|
|
29
30
|
__exportStar(require("./cond"), exports);
|
|
@@ -31,7 +32,6 @@ __exportStar(require("./constant"), exports);
|
|
|
31
32
|
__exportStar(require("./database_table"), exports);
|
|
32
33
|
__exportStar(require("./field_chain"), exports);
|
|
33
34
|
__exportStar(require("./field_length"), exports);
|
|
34
|
-
__exportStar(require("./component_cond_sub"), exports);
|
|
35
35
|
__exportStar(require("./field_offset"), exports);
|
|
36
36
|
__exportStar(require("./field_symbol"), exports);
|
|
37
37
|
__exportStar(require("./function_exporting"), exports);
|
|
@@ -53,6 +53,7 @@ __exportStar(require("./simple_source3"), exports);
|
|
|
53
53
|
__exportStar(require("./simple_source4"), exports);
|
|
54
54
|
__exportStar(require("./source_field_symbol"), exports);
|
|
55
55
|
__exportStar(require("./source"), exports);
|
|
56
|
+
__exportStar(require("./sql_cond"), exports);
|
|
56
57
|
__exportStar(require("./sql_source_simple"), exports);
|
|
57
58
|
__exportStar(require("./sql_source"), exports);
|
|
58
59
|
__exportStar(require("./string_template_source"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Nodes } from "@abaplint/core";
|
|
2
|
+
import { IExpressionTranspiler } from "./_expression_transpiler";
|
|
3
|
+
import { Traversal } from "../traversal";
|
|
4
|
+
import { Chunk } from "../chunk";
|
|
5
|
+
export declare class SQLCondTranspiler implements IExpressionTranspiler {
|
|
6
|
+
transpile(node: Nodes.ExpressionNode, traversal: Traversal): Chunk;
|
|
7
|
+
private sqlIn;
|
|
8
|
+
private basicCondition;
|
|
9
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SQLCondTranspiler = void 0;
|
|
4
|
+
const abaplint = require("@abaplint/core");
|
|
5
|
+
const chunk_1 = require("../chunk");
|
|
6
|
+
const simple_source3_1 = require("./simple_source3");
|
|
7
|
+
const field_chain_1 = require("./field_chain");
|
|
8
|
+
class SQLCondTranspiler {
|
|
9
|
+
transpile(node, traversal) {
|
|
10
|
+
var _a;
|
|
11
|
+
let ret = "";
|
|
12
|
+
for (const c of node.getChildren()) {
|
|
13
|
+
if (c instanceof abaplint.Nodes.ExpressionNode
|
|
14
|
+
&& c.get() instanceof abaplint.Expressions.SQLCompare) {
|
|
15
|
+
if (ret !== "") {
|
|
16
|
+
ret += " ";
|
|
17
|
+
}
|
|
18
|
+
if (c.findDirectExpression(abaplint.Expressions.Dynamic)) {
|
|
19
|
+
const chain = (_a = c.findDirectExpression(abaplint.Expressions.Dynamic)) === null || _a === void 0 ? void 0 : _a.findFirstExpression(abaplint.Expressions.FieldChain);
|
|
20
|
+
if (chain) {
|
|
21
|
+
const code = new field_chain_1.FieldChainTranspiler(true).transpile(chain, traversal).getCode();
|
|
22
|
+
ret += `" + ${code} + "`;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
throw new Error("SQL Condition, transpiler todo, dyn cond, " + c.concatTokens());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else if (c.findDirectExpression(abaplint.Expressions.SQLIn)) {
|
|
29
|
+
ret += this.sqlIn(c, traversal);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
ret += this.basicCondition(c, traversal);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (c instanceof abaplint.Nodes.ExpressionNode) {
|
|
36
|
+
ret += " " + this.transpile(c, traversal).getCode();
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
ret += " " + c.concatTokens();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const c = new chunk_1.Chunk();
|
|
43
|
+
return c.appendString(ret.trim());
|
|
44
|
+
}
|
|
45
|
+
sqlIn(c, _traversal) {
|
|
46
|
+
const fieldName = c.findDirectExpression(abaplint.Expressions.SQLFieldName);
|
|
47
|
+
const slqin = c.findDirectExpression(abaplint.Expressions.SQLIn);
|
|
48
|
+
const source = c.findFirstExpression(abaplint.Expressions.SimpleSource3);
|
|
49
|
+
if (fieldName === undefined || slqin === undefined || source === undefined) {
|
|
50
|
+
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens());
|
|
51
|
+
}
|
|
52
|
+
const ret = `" + abap.expandIN("${fieldName.concatTokens()}", ${source.concatTokens()}) + "`;
|
|
53
|
+
return ret;
|
|
54
|
+
}
|
|
55
|
+
basicCondition(c, traversal) {
|
|
56
|
+
let ret = "";
|
|
57
|
+
if (c.getChildren().length !== 3) {
|
|
58
|
+
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens() + ", " + c.getChildren().length);
|
|
59
|
+
}
|
|
60
|
+
const fieldName = c.findDirectExpression(abaplint.Expressions.SQLFieldName);
|
|
61
|
+
const operator = c.findDirectExpression(abaplint.Expressions.SQLCompareOperator);
|
|
62
|
+
const source = c.findDirectExpression(abaplint.Expressions.SQLSource);
|
|
63
|
+
if (fieldName === undefined || operator === undefined || source === undefined) {
|
|
64
|
+
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens());
|
|
65
|
+
}
|
|
66
|
+
ret += fieldName.concatTokens() + " " + operator.concatTokens() + " ";
|
|
67
|
+
const simple = source.findDirectExpression(abaplint.Expressions.SimpleSource3);
|
|
68
|
+
if (simple && simple.findDirectExpression(abaplint.Expressions.Constant) === undefined) {
|
|
69
|
+
ret += "'\" + " + new simple_source3_1.SimpleSource3Transpiler(true).transpile(simple, traversal).getCode() + " + \"'";
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
ret += source.concatTokens();
|
|
73
|
+
}
|
|
74
|
+
return ret;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.SQLCondTranspiler = SQLCondTranspiler;
|
|
78
|
+
//# sourceMappingURL=sql_cond.js.map
|
|
@@ -12,6 +12,11 @@ class DeleteDatabaseTranspiler {
|
|
|
12
12
|
const ttab = traversal.traverse(tab);
|
|
13
13
|
options.push(`"table": ` + ttab.getCode());
|
|
14
14
|
}
|
|
15
|
+
const w = node.findExpressionAfterToken("WHERE");
|
|
16
|
+
if (w && w.get() instanceof abaplint.Expressions.SQLCond) {
|
|
17
|
+
const ttab = traversal.traverse(w);
|
|
18
|
+
options.push(`"where": "` + ttab.getCode() + `"`);
|
|
19
|
+
}
|
|
15
20
|
return new chunk_1.Chunk(`await abap.statements.deleteDatabase(${table.getCode()}, {${options.join(", ")}});`);
|
|
16
21
|
}
|
|
17
22
|
}
|
|
@@ -5,8 +5,5 @@ import { Chunk } from "../chunk";
|
|
|
5
5
|
export declare class SelectTranspiler implements IStatementTranspiler {
|
|
6
6
|
transpile(node: abaplint.Nodes.StatementNode, traversal: Traversal, targetOverride?: string): Chunk;
|
|
7
7
|
private findKeys;
|
|
8
|
-
private concatCond;
|
|
9
|
-
private sqlIn;
|
|
10
|
-
private basicCondition;
|
|
11
8
|
private isWhereExpression;
|
|
12
9
|
}
|
|
@@ -27,18 +27,24 @@ class SelectTranspiler {
|
|
|
27
27
|
}
|
|
28
28
|
select += " ";
|
|
29
29
|
select += ((_a = node.findFirstExpression(abaplint.Expressions.SQLFrom)) === null || _a === void 0 ? void 0 : _a.concatTokens()) + " ";
|
|
30
|
-
let where;
|
|
30
|
+
let where = undefined;
|
|
31
31
|
for (const sqlCond of node.findAllExpressions(abaplint.Expressions.SQLCond)) {
|
|
32
32
|
if (this.isWhereExpression(node, sqlCond)) {
|
|
33
33
|
where = sqlCond;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
if (where) {
|
|
37
|
-
select += "WHERE " +
|
|
37
|
+
select += "WHERE " + traversal.traverse(where).getCode() + " ";
|
|
38
38
|
}
|
|
39
39
|
const upTo = node.findFirstExpression(abaplint.Expressions.SQLUpTo);
|
|
40
40
|
if (upTo) {
|
|
41
|
-
|
|
41
|
+
const s = upTo.findFirstExpression(abaplint.Expressions.SimpleSource3);
|
|
42
|
+
if (s) {
|
|
43
|
+
select += `UP TO " + ${new expressions_1.SourceTranspiler(true).transpile(s, traversal).getCode()} + " ROWS `;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
select += upTo.concatTokens() + " ";
|
|
47
|
+
}
|
|
42
48
|
}
|
|
43
49
|
const orderBy = node.findFirstExpression(abaplint.Expressions.SQLOrderBy);
|
|
44
50
|
if (orderBy) {
|
|
@@ -95,72 +101,6 @@ class SelectTranspiler {
|
|
|
95
101
|
}
|
|
96
102
|
return keys;
|
|
97
103
|
}
|
|
98
|
-
concatCond(cond, traversal) {
|
|
99
|
-
var _a;
|
|
100
|
-
let ret = "";
|
|
101
|
-
for (const c of cond.getChildren()) {
|
|
102
|
-
if (c instanceof abaplint.Nodes.ExpressionNode
|
|
103
|
-
&& c.get() instanceof abaplint.Expressions.SQLCompare) {
|
|
104
|
-
if (ret !== "") {
|
|
105
|
-
ret += " ";
|
|
106
|
-
}
|
|
107
|
-
if (c.findDirectExpression(abaplint.Expressions.Dynamic)) {
|
|
108
|
-
const chain = (_a = c.findDirectExpression(abaplint.Expressions.Dynamic)) === null || _a === void 0 ? void 0 : _a.findFirstExpression(abaplint.Expressions.FieldChain);
|
|
109
|
-
if (chain) {
|
|
110
|
-
const code = new expressions_1.FieldChainTranspiler(true).transpile(chain, traversal).getCode();
|
|
111
|
-
ret += `" + ${code} + "`;
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
throw new Error("SQL Condition, transpiler todo, dyn cond, " + c.concatTokens());
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else if (c.findDirectExpression(abaplint.Expressions.SQLIn)) {
|
|
118
|
-
ret += this.sqlIn(c, traversal);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
ret += this.basicCondition(c, traversal);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else if (c instanceof abaplint.Nodes.ExpressionNode) {
|
|
125
|
-
ret += " " + this.concatCond(c, traversal);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
ret += " " + c.concatTokens();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return ret.trim();
|
|
132
|
-
}
|
|
133
|
-
sqlIn(c, _traversal) {
|
|
134
|
-
const fieldName = c.findDirectExpression(abaplint.Expressions.SQLFieldName);
|
|
135
|
-
const slqin = c.findDirectExpression(abaplint.Expressions.SQLIn);
|
|
136
|
-
const source = c.findFirstExpression(abaplint.Expressions.SimpleSource3);
|
|
137
|
-
if (fieldName === undefined || slqin === undefined || source === undefined) {
|
|
138
|
-
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens());
|
|
139
|
-
}
|
|
140
|
-
const ret = `" + abap.expandIN("${fieldName.concatTokens()}", ${source.concatTokens()}) + "`;
|
|
141
|
-
return ret;
|
|
142
|
-
}
|
|
143
|
-
basicCondition(c, traversal) {
|
|
144
|
-
let ret = "";
|
|
145
|
-
if (c.getChildren().length !== 3) {
|
|
146
|
-
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens() + ", " + c.getChildren().length);
|
|
147
|
-
}
|
|
148
|
-
const fieldName = c.findDirectExpression(abaplint.Expressions.SQLFieldName);
|
|
149
|
-
const operator = c.findDirectExpression(abaplint.Expressions.SQLCompareOperator);
|
|
150
|
-
const source = c.findDirectExpression(abaplint.Expressions.SQLSource);
|
|
151
|
-
if (fieldName === undefined || operator === undefined || source === undefined) {
|
|
152
|
-
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens());
|
|
153
|
-
}
|
|
154
|
-
ret += fieldName.concatTokens() + " " + operator.concatTokens() + " ";
|
|
155
|
-
const simple = source.findDirectExpression(abaplint.Expressions.SimpleSource3);
|
|
156
|
-
if (simple && simple.findDirectExpression(abaplint.Expressions.Constant) === undefined) {
|
|
157
|
-
ret += "'\" + " + new expressions_1.SimpleSource3Transpiler(true).transpile(simple, traversal).getCode() + " + \"'";
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
ret += source.concatTokens();
|
|
161
|
-
}
|
|
162
|
-
return ret;
|
|
163
|
-
}
|
|
164
104
|
isWhereExpression(node, expression) {
|
|
165
105
|
// check if previous token before sqlCond is "WHERE". It could also be "ON" in case of join condition
|
|
166
106
|
let prevToken;
|