UNPKG

@abaplint/transpiler

Version:
174 lines • 8.22 kB
"use strict"; 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