All files / src/cds/expressions cds_select.ts

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

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 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 451x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
import {CDSElement, CDSComposition, CDSGroupBy, CDSSource, CDSType, CDSWhere, CDSHaving, CDSName, CDSPrefixedName, CDSString} from ".";
import {Expression, seq, str, opt, optPrio, star, altPrio, starPrio, stopBefore1} from "../../abap/2_statements/combi";
import {IStatementRunnable} from "../../abap/2_statements/statement_runnable";
import {CDSAssociation} from "./cds_association";
import {CDSJoin} from "./cds_join";
 
export class CDSSelect extends Expression {
  public getRunnable(): IStatementRunnable {
    const fields = seq(stopBefore1("FROM"), star(seq(CDSElement, ",")), CDSElement);
    const distinct = str("DISTINCT");
    const elementList = seq(CDSElement, star(seq(",", CDSElement)), opt(","));
    const elements = seq(str("{"), altPrio("*", elementList), str("}"));
 
    const typedLiteralVal = seq(CDSType, CDSString);
    const aspectValue = altPrio(typedLiteralVal, CDSString, CDSPrefixedName);
    const aspectBinding = seq(CDSPrefixedName, "=", ">", aspectValue);
    const bindAspect = seq(
      "BIND", "ASPECT", CDSName,
      "(", aspectBinding, starPrio(seq(",", aspectBinding)), ")",
      optPrio(seq("AS", CDSName)),
    );
 
    const parenSelect = seq("(", CDSSelect, ")");
    const unionBranch = altPrio(parenSelect, CDSSelect);
 
    return seq("SELECT",
               optPrio(distinct),
               opt(altPrio("*", fields)),
               "FROM",
               CDSSource,
               star(CDSJoin),
               star(altPrio(CDSComposition, CDSAssociation)),
               starPrio(bindAspect),
               opt(elements),
               optPrio(CDSWhere),
               optPrio(CDSGroupBy),
               optPrio(CDSHaving),
               optPrio(altPrio(
                 seq("UNION", optPrio("ALL"), unionBranch),
                 seq("EXCEPT", unionBranch),
                 seq("INTERSECT", unionBranch),
               )));
  }
}