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

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

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 471x 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 1x 1x 1x
import {plusPrio, seq, ver, tok, Expression, optPrio, altPrio} from "../combi";
import {Constant, SQLFieldName, SQLAggregation, SQLCase, SQLAsName, SimpleFieldChain2} from ".";
import {Version} from "../../../version";
import {ParenLeftW, WAt, WParenLeftW, WParenRight, WParenRightW} from "../../1_lexer/tokens";
import {IStatementRunnable} from "../statement_runnable";
import {SQLFunction} from "./sql_function";
import {SQLPath} from "./sql_path";
 
export class SQLField extends Expression {
  public getRunnable(): IStatementRunnable {
 
    const atParen = seq(tok(ParenLeftW), SimpleFieldChain2, tok(WParenRightW));
    const abap = ver(Version.v740sp05, seq(tok(WAt), altPrio(SimpleFieldChain2, atParen)), Version.OpenABAP);
 
    const as = seq("AS", SQLAsName);
 
    const parenFieldName = seq(tok(WParenLeftW), SQLFieldName, altPrio(tok(WParenRightW), tok(WParenRight)));
 
    const fieldNoAgg = altPrio(SQLCase,
                               SQLFunction,
                               SQLPath,
                               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));
 
    // arithmetic without aggregates as operands: from v740sp05
    const subNoAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenFieldNoAgg, fieldNoAgg)));
    const arithNoAgg = ver(Version.v740sp05, subNoAgg);
 
    // arithmetic with aggregates as operands: from v754
    const subWithAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenField, field)));
    const arithWithAgg = ver(Version.v754, subWithAgg);
 
    const arith = altPrio(arithWithAgg, arithNoAgg);
 
    const arithSequence = seq(field, optPrio(arith));
    const parenArithSequence = seq(tok(WParenLeftW), arithSequence, tok(WParenRightW));
 
    return seq(altPrio(parenArithSequence, arithSequence), optPrio(as));
  }
}