@abaplint/transpiler
Version:
174 lines • 8.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SQLCondTranspiler = void 0;
const abaplint = require("@abaplint/core");
const traversal_1 = require("../traversal");
const chunk_1 = require("../chunk");
const simple_source3_1 = require("./simple_source3");
const field_chain_1 = require("./field_chain");
const sql_field_name_1 = require("./sql_field_name");
const transpile_types_1 = require("../transpile_types");
const source_1 = require("./source");
class SQLCondTranspiler {
transpile(node, traversal, table) {
let ret = "";
for (const c of node.getChildren()) {
if (c instanceof abaplint.Nodes.ExpressionNode
&& c.get() instanceof abaplint.Expressions.SQLCompare) {
if (ret !== "") {
ret += " ";
}
if (c.findDirectExpression(abaplint.Expressions.Dynamic)) {
const chain = c.findDirectExpression(abaplint.Expressions.Dynamic)?.findFirstExpression(abaplint.Expressions.FieldChain);
if (chain) {
const code = new field_chain_1.FieldChainTranspiler(true).transpile(chain, traversal).getCode();
ret += `" + abap.expandDynamic(${code}, (name) => {try { return eval(name);} catch {}}) + "`;
}
else {
const concat = c.concatTokens();
if (concat.toUpperCase() === "('ENABLE_SQLITE = ABAP_TRUE')") {
// yea, this is a workaround
ret += ` \\"enable_sqlite\\" = 'X'`;
}
else {
throw new Error("SQL Condition, transpiler todo, dyn cond, " + concat + ", " + traversal.getFilename());
}
}
}
else if (c.findDirectExpression(abaplint.Expressions.SQLIn)) {
ret += this.sqlIn(c, traversal, traversal.getFilename(), table);
}
else {
ret += this.basicCondition(c, traversal, traversal.getFilename(), table);
}
}
else if (c instanceof abaplint.Nodes.ExpressionNode) {
ret += " " + this.transpile(c, traversal, table).getCode();
}
else {
ret += " " + c.concatTokens();
}
}
const c = new chunk_1.Chunk();
return c.appendString(ret.trim());
}
sqlIn(c, traversal, filename, table) {
const fieldName = c.findDirectExpression(abaplint.Expressions.SQLFieldName);
const sqlin = c.findDirectExpression(abaplint.Expressions.SQLIn);
const source = c.findFirstExpression(abaplint.Expressions.SimpleSource3);
if (fieldName === undefined || sqlin === undefined || source === undefined) {
throw new Error("SQL Condition, transpiler todo, " + c.concatTokens());
}
let pre = "";
if (c.concatTokens().toUpperCase().includes(" NOT IN ")) {
pre = "NOT ";
}
if (sqlin.getChildren().length === 2) {
const s = new source_1.SourceTranspiler().transpile(source, traversal).getCode();
return `${pre}" + abap.expandIN("${fieldName.concatTokens()}", ${s}) + "`;
}
else {
const cond = [];
for (const s of sqlin.findDirectExpressions(abaplint.Expressions.SQLSource)) {
const field = new sql_field_name_1.SQLFieldNameTranspiler().transpile(fieldName, traversal).getCode();
const sourc = this.sqlSource(s, traversal, filename, table);
cond.push(field + " = " + sourc);
}
const ret = pre + "( " + cond.join(" OR ") + " )";
return ret;
}
}
basicCondition(c, traversal, filename, table) {
let ret = "";
if (c.getChildren().length !== 3) {
return this.basicConditionNew(c, traversal, filename, table);
}
let fieldName = undefined;
const fieldNameExpression = c.findDirectExpression(abaplint.Expressions.SQLFieldName);
if (fieldNameExpression) {
fieldName = new sql_field_name_1.SQLFieldNameTranspiler().transpile(fieldNameExpression, traversal).getCode();
}
const operator = c.findDirectExpression(abaplint.Expressions.SQLCompareOperator);
const source = c.findDirectExpression(abaplint.Expressions.SQLSource);
if (fieldName && source && operator === undefined && c.findDirectTokenByText("LIKE")) {
ret += fieldName + " LIKE ";
ret += this.sqlSource(source, traversal, filename, table);
return ret;
}
if (fieldName === undefined || operator === undefined || source === undefined) {
throw new Error("SQL Condition, transpiler todo2, " + c.concatTokens());
}
let op = operator.concatTokens();
if (op.toUpperCase() === "EQ") {
op = "=";
}
else if (op.toUpperCase() === "NE") {
op = "<>";
}
ret += fieldName + " " + op + " ";
ret += this.sqlSource(source, traversal, filename, table);
return ret;
}
sqlSource(source, traversal, filename, table) {
let ret = "";
const simple = source.findDirectExpression(abaplint.Expressions.SimpleSource3);
const alias = source.findDirectExpression(abaplint.Expressions.SQLAliasField);
if (simple && simple.findDirectExpression(abaplint.Expressions.Constant) === undefined) {
ret += "'\" + " + new simple_source3_1.SimpleSource3Transpiler(true).transpile(simple, traversal).getCode() + " + \"'";
}
else if (alias) {
// SQLAliasField might be a SQL reference or value from ABAP interface
const pre = alias.concatTokens().split("~")[0];
const found = traversal.findInterfaceDefinition(pre, traversal.findCurrentScopeByToken(alias.getFirstToken()));
if (found) {
let name = traversal.prefixAndName(alias.getFirstToken(), filename).replace("~", "$");
name = traversal_1.Traversal.escapeNamespace(name);
ret += "'\" + " + name + ".get() + \"'";
}
else {
let concat = source.concatTokens();
if (concat.includes("~") && concat.split("~")[0].includes("/")) {
concat = "'" + concat.replace("~", "'~");
}
ret += concat;
}
}
else {
const concat = source.concatTokens();
const conversionField = traversal.isSQLConversion(source.getFirstToken());
if (conversionField) {
const field = (table?.parseType(traversal.reg)).getComponentByName(conversionField);
ret += "'\" + " + new transpile_types_1.TranspileTypes().toType(field) + ".set(" + concat + ").get() + \"'";
}
else if (concat.startsWith("`")) {
ret += "'" + concat.substring(1, concat.length - 1) + "'";
}
else {
ret += concat;
}
}
return ret;
}
basicConditionNew(node, traversal, filename, table) {
let ret = "";
for (const child of node.getChildren()) {
if (ret !== "") {
ret += " ";
}
if (child.get() instanceof abaplint.Expressions.SQLFieldName
&& child instanceof abaplint.Nodes.ExpressionNode) {
ret += new sql_field_name_1.SQLFieldNameTranspiler().transpile(child, traversal).getCode();
}
else if (child.get() instanceof abaplint.Expressions.SQLSource
&& child instanceof abaplint.Nodes.ExpressionNode) {
ret += this.sqlSource(child, traversal, filename, table);
}
else {
ret += child.concatTokens();
}
}
return ret;
}
}
exports.SQLCondTranspiler = SQLCondTranspiler;
//# sourceMappingURL=sql_cond.js.map