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

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

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 45 46 47 48 49 50 51 52 53 54 55 561x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x  
import {plusPrio, seq, ver, tok, Expression, optPrio, altPrio, AlsoIn} from "../combi";
import {Constant, SQLFieldName, SQLAggregation, SQLCase, SQLAsName, SimpleFieldChain2, SQLTypedLiteral} from ".";
import {Release} from "../../../version";
import {ParenLeftW, WAt, WParenLeftW, WParenRight, WParenRightW} from "../../1_lexer/tokens";
import {IStatementRunnable} from "../statement_runnable";
import {SQLFunction} from "./sql_function";
import {SQLPathForColumn} from "./sql_path_for_column";
 
 
export class SQLField extends Expression {
  public getRunnable(): IStatementRunnable {
 
    const atParen = seq(tok(ParenLeftW), SimpleFieldChain2, tok(WParenRightW));
    const abap = ver(Release.v740sp05, seq(tok(WAt), altPrio(SimpleFieldChain2, atParen)), {also: AlsoIn.OpenABAP});
 
    const as = seq("AS", SQLAsName);
 
    const parenFieldName = seq(tok(WParenLeftW), SQLFieldName, altPrio(tok(WParenRightW), tok(WParenRight)));
 
    const fieldNoAgg = altPrio(SQLCase,
                               SQLFunction,
                               SQLPathForColumn,
                               SQLTypedLiteral,
                               SQLFieldName,
                               abap,
                               Constant,
                               parenFieldName);
 
    const field = altPrio(SQLAggregation, fieldNoAgg);
 
    const parenField = seq(tok(WParenLeftW), field, tok(WParenRightW));
    const parenFieldNoAgg = seq(tok(WParenLeftW), fieldNoAgg, tok(WParenRightW));
 
    const subNoAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenFieldNoAgg, fieldNoAgg)));
    const arithNoAgg = ver(Release.v740sp05, subNoAgg, {also: AlsoIn.OpenABAP});
 
    const subWithAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenField, field)));
    const arithWithAgg = ver(Release.v754, subWithAgg, {also: AlsoIn.OpenABAP});
 
    const arith = altPrio(arithWithAgg, arithNoAgg);
 
    const arithSequence = seq(optPrio("-"), field, optPrio(arith));
    const parenArithSequence = seq(tok(WParenLeftW), optPrio("-"), arithSequence, tok(WParenRightW));
 
    const subExtWithAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenArithSequence, parenField, field)));
    const subExtNoAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenArithSequence, parenFieldNoAgg, fieldNoAgg)));
    const arithExt = altPrio(ver(Release.v754, subExtWithAgg, {also: AlsoIn.OpenABAP}),
                             ver(Release.v740sp05, subExtNoAgg, {also: AlsoIn.OpenABAP}));
 
    return seq(altPrio(
      seq(parenArithSequence, optPrio(arithExt)),
      arithSequence,
    ), optPrio(as));
  }
}