All files / src/cds/expressions cds_join.ts

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

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 211x 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", "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));
  }
}