All files / src/cds/expressions cds_define_table_entity.ts

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

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 401x 1x 1x 1x 1x 1x 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 1x  
import {CDSAnnotation, CDSElement, CDSJoin, CDSName,
  CDSSource, CDSTableField, CDSWhere, CDSWithParameters,
  CDSAssociation, CDSComposition} from ".";
import {Expression, str, seq, star, opt, optPrio, plus, altPrio} from "../../abap/2_statements/combi";
import {IStatementRunnable} from "../../abap/2_statements/statement_runnable";
 
export class CDSDefineTableEntity extends Expression {
  public getRunnable(): IStatementRunnable {
    // Inline `{ ... }` body: one or more table-field entries. Each entry is
    // wrapped in a CDSTableField node so downstream tooling can pair each
    // field name with its own annotations.
    const inlineBody = plus(CDSTableField);
 
    const elementList = seq(CDSElement, star(seq(",", CDSElement)), opt(","));
    const elements = seq(str("{"), altPrio("*", elementList), str("}"));
 
    const selectBody = seq(
      "AS", "SELECT", "FROM",
      CDSSource,
      star(CDSJoin),
      star(altPrio(CDSComposition, CDSAssociation)),
      opt(elements),
      optPrio(CDSWhere),
    );
 
    return seq(
      star(CDSAnnotation),
      opt("DEFINE"),
      opt("ROOT"),
      "TABLE", "ENTITY", CDSName,
      opt(CDSWithParameters),
      altPrio(
        seq(str("{"), inlineBody, str("}")),
        selectBody,
      ),
      opt(";"),
    );
  }
}