package flare.query { /** * Expression operator for an if statement that performs conditional * execution. */ public class If extends Expression { private var _test:Expression; private var _then:Expression; private var _else:Expression; /** The conditional clause of the if statement. */ public function get test():Expression { return _test; } public function set test(e:*):void { _test = Expression.expr(e); } /** Sub-expression evaluated if the test condition is true. */ public function get then():Expression { return _then; } public function set then(e:*):void { _then = Expression.expr(e); } /** Sub-expression evaluated if the test condition is false. */ public function get els():Expression { return _else; } public function set els(e:*):void { _else = Expression.expr(e); } /** * @inheritDoc */ public override function get numChildren():int { return 3; } // -------------------------------------------------------------------- /** * Create a new IfExpression. * @param test the test expression for the if statement * @param thenExpr the expression to evaluate if the test predicate * evaluates to true * @param elseExpr the expression to evaluate if the test predicate * evaluates to false */ public function If(test:*, thenExpr:*, elseExpr:*) { this.test = test; this.then = thenExpr; this.els = elseExpr; } /** * @inheritDoc */ public override function clone():Expression { return new If(_test.clone(), _then.clone(), _else.clone()); } /** * @inheritDoc */ public override function eval(o:Object=null):* { return (_test.predicate(o) ? _then : _else).eval(o); } /** * @inheritDoc */ public override function getChildAt(idx:int):Expression { switch (idx) { case 0: return _test; case 1: return _then; case 2: return _else; default: return null; } } /** * @inheritDoc */ public override function setChildAt(idx:int, expr:Expression):Boolean { switch (idx) { case 0: _test = expr; return true; case 1: _then = expr; return true; case 2: _else = expr; return true; default: return false; } } /** * @inheritDoc */ public override function toString():String { return "IF " + _test.toString() + " THEN " + _then.toString() + " ELSE " + _else.toString(); } } // end of class If }