@sap/cds-compiler
Version:
CDS (Core Data Services) compiler and backends
72 lines (64 loc) • 2.1 kB
JavaScript
// Create a hierarchical expression tree from an `xpr` array
//
// Replace `xpr` arrays and conditions by precedence-aware tree representations.
// The transformation is deep and destructive.
//
// Queries in expressions are _not_ traversed.
//
// Function/assoc arguments and filter conditions are
// - traversed with expressionAsTree() and conditionAsTree(),
// - not traversed with exprAsTree() and condAsTree()
;
const xprParser = require( '../parsers/XprTree' );
function conditionAsTree( args ) {
args.forEach( expressionAsTree );
return xprParser.xprAsTree( args, args, true );
}
function condAsTree( args ) {
args.forEach( exprAsTree );
return xprParser.xprAsTree( args, args, true );
}
function expressionAsTree( expr ) {
if (!expr || typeof expr !== 'object')
return expr;
if (Array.isArray( expr )) { // hierarchical input
// expr.forEach( expressionAsTree ); // do it again?
return expr;
}
if (expr.list) // expression, ref
expr.list.forEach( expressionAsTree );
if (expr.args) { // expression, ref
if (Array.isArray( expr.args ) )
expr.args.forEach(expressionAsTree);
else
Object.values(expr.args).forEach(expressionAsTree);
}
if (expr.ref) // expression
expr.ref.forEach( expressionAsTree );
// conditions: change properties
if (expr.xpr) // expression
expr.xpr = conditionAsTree( expr.xpr );
if (expr.where) // ref or query
expr.where = conditionAsTree( expr.where );
return expr;
}
function exprAsTree( expr ) {
if (!expr || typeof expr !== 'object')
return expr;
if (Array.isArray( expr )) { // hierarchical input
// expr.forEach( exprAsTree ); // do it again?
return expr;
}
if (expr.list) // expression, ref
expr.list.forEach( exprAsTree );
// conditions: change properties
if (expr.xpr) // expression
expr.xpr = condAsTree( expr.xpr );
return expr;
}
module.exports = {
conditionAsTree,
condAsTree,
expressionAsTree,
exprAsTree,
};