UNPKG

@sap/cds-compiler

Version:

CDS (Core Data Services) compiler and backends

72 lines (64 loc) 2.1 kB
// 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() 'use strict'; 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, };