All files / src/cds/expressions cds_select.ts

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

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 341x 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, CDSWhere, CDSHaving} from ".";
import {Expression, seq, str, opt, optPrio, star, altPrio} 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(star(seq(CDSElement, ",")), CDSElement);
    const distinct = str("DISTINCT");
 
    // elem (,elem)* [,] — handles separator commas and optional trailing comma
    const elementList = seq(CDSElement, star(seq(",", CDSElement)), opt(","));
 
    const elements = seq(str("{"), altPrio("*", elementList), str("}"));
 
    return seq("SELECT",
               optPrio(distinct),
               opt(altPrio("*", fields)),
               "FROM",
               CDSSource,
               star(CDSJoin),
               star(altPrio(CDSComposition, CDSAssociation)),
               opt(elements),
               optPrio(CDSWhere),
               optPrio(CDSGroupBy),
               optPrio(CDSHaving),
               optPrio(altPrio(
                 seq("UNION", optPrio("ALL"), CDSSelect),
                 seq("EXCEPT", CDSSelect),
                 seq("INTERSECT", CDSSelect),
               )));
  }
}