@abaplint/core
Version:
abaplint - Core API
28 lines • 2.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CDSJoin = void 0;
const _1 = require(".");
const combi_1 = require("../../abap/2_statements/combi");
const cds_condition_1 = require("./cds_condition");
class CDSJoin extends combi_1.Expression {
getRunnable() {
const cardSide = (0, combi_1.altPrio)("EXACT ONE", "ONE", "MANY");
// LEFT OUTER [card TO card] — structured to cover all combinations
const leftOuterCard = (0, combi_1.seq)("LEFT OUTER", cardSide, "TO", cardSide);
const leftOuterToCard = (0, combi_1.seq)("LEFT OUTER TO", (0, combi_1.altPrio)("EXACT ONE", "ONE", "MANY"));
// INNER [card TO card]
const innerCard = (0, combi_1.seq)("INNER", cardSide, "TO", cardSide);
const innerToCard = (0, combi_1.seq)("INNER TO", (0, combi_1.altPrio)("EXACT ONE", "ONE", "MANY"));
const joinTypes = (0, combi_1.optPrio)((0, combi_1.altPrio)(leftOuterCard, leftOuterToCard, "LEFT OUTER", innerCard, innerToCard, "INNER", "CROSS", "RIGHT OUTER"));
const cond = (0, combi_1.seq)(_1.CDSSource, "ON", cds_condition_1.CDSCondition);
const foo = (0, combi_1.altPrio)((0, combi_1.seq)("(", cond, ")"), cond);
// Parenthesized join sub-expression: JOIN (src innerJOIN src ON cond) ON outerCond
const innerJoin = (0, combi_1.seq)(joinTypes, "JOIN", (0, combi_1.altPrio)((0, combi_1.seq)("(", cond, ")"), cond));
const parenJoinChain = (0, combi_1.seq)("(", _1.CDSSource, (0, combi_1.star)(innerJoin), ")", "ON", cds_condition_1.CDSCondition);
// Inline nested join: JOIN src [JOIN src ON cond]* ON outerCond
const inlineChain = (0, combi_1.seq)(_1.CDSSource, (0, combi_1.star)((0, combi_1.seq)(joinTypes, "JOIN", _1.CDSSource, "ON", cds_condition_1.CDSCondition)), "ON", cds_condition_1.CDSCondition);
return (0, combi_1.seq)(joinTypes, "JOIN", (0, combi_1.altPrio)(parenJoinChain, inlineChain, foo, _1.CDSSource));
}
}
exports.CDSJoin = CDSJoin;
//# sourceMappingURL=cds_join.js.map