All files / src/abap/2_statements/expressions sql_hierarchy_aggregate.ts

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

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 361x 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 {seq, optPrio, altPrio, Expression, ver, tok, star} from "../combi";
import {IStatementRunnable} from "../statement_runnable";
import {Release} from "../../../version";
import {ParenLeftW, WParenRightW} from "../../1_lexer/tokens";
import {DatabaseTable, SQLAggregation, SQLAsName, SQLCond} from ".";
 
export class SQLHierarchyAggregate extends Expression {
  public getRunnable(): IStatementRunnable {
    const startWhere = seq("START", "WHERE", SQLCond);
    const join = seq("JOIN", DatabaseTable, "ON", SQLCond);
    const measureItem = seq(SQLAggregation, "AS", SQLAsName);
    const measures = seq("MEASURES", measureItem, star(seq(",", measureItem)));
    const where = seq("WHERE", SQLCond);
 
    const withEntry = altPrio("SUBTOTAL", "BALANCE", seq("NOT", "MATCHED"), "TOTAL");
 
    const aggregate = seq(
      "SOURCE", DatabaseTable,
      optPrio(startWhere),
      optPrio(join),
      measures,
      optPrio(where),
      optPrio(seq("WITH", withEntry, star(seq("WITH", withEntry)))),
    );
 
    const name = altPrio("HIERARCHY_DESCENDANTS_AGGREGATE", "HIERARCHY_ANCESTORS_AGGREGATE");
 
    return ver(Release.v750, seq(
      name,
      tok(ParenLeftW),
      aggregate,
      tok(WParenRightW),
    ));
  }
}