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

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

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 531x 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 1x 1x 1x 1x 1x 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);
 
    const subWithAgg = plusPrio(seq(altPrio("+", "-", "*", "/", "&&"), altPrio(parenField, field)));
    const arithWithAgg = ver(Release.v754, subWithAgg);
 
    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), ver(Release.v740sp05, subExtNoAgg));
 
    return seq(altPrio(
      seq(parenArithSequence, optPrio(arithExt)),
      arithSequence,
    ), optPrio(as));
  }
}