All files / src/cds/expressions cds_join.ts

100% Statements 22/22
100% Branches 1/1
100% Functions 1/1
100% Lines 22/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 221x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x
import {CDSSource} from ".";
import {altPrio, Expression, optPrio, seq, star} from "../../abap/2_statements/combi";
import {IStatementRunnable} from "../../abap/2_statements/statement_runnable";
import {CDSCondition} from "./cds_condition";
 
export class CDSJoin extends Expression {
  public getRunnable(): IStatementRunnable {
    const joinTypes = optPrio(altPrio(
      "LEFT OUTER MANY TO EXACT ONE", "LEFT OUTER ONE TO EXACT ONE", "LEFT OUTER ONE TO MANY",
      "LEFT OUTER TO ONE", "LEFT OUTER TO MANY", "LEFT OUTER",
      "INNER ONE TO MANY", "INNER MANY TO ONE", "INNER ONE TO EXACT ONE", "INNER MANY TO EXACT ONE",
      "INNER TO MANY", "INNER TO ONE", "INNER TO EXACT ONE",
      "INNER", "CROSS", "RIGHT OUTER",
    ));
    const cond = seq(CDSSource, "ON", CDSCondition);
    const foo = altPrio(seq("(", cond, ")"), cond);
    // Parenthesized join sub-expression: JOIN (src innerJOIN src ON cond) ON outerCond
    const innerJoin = seq(joinTypes, "JOIN", altPrio(seq("(", cond, ")"), cond));
    const parenJoinChain = seq("(", CDSSource, star(innerJoin), ")", "ON", CDSCondition);
    return seq(joinTypes, "JOIN", altPrio(parenJoinChain, foo, CDSSource));
  }
}