package flare.query
{
    /**
     * Base class representing an aggregate query operator.
     */
    public class AggregateExpression extends Expression
    {
        /** The sub-expression to aggregate. */
        protected var _expr:Expression;
        
        /** The sub-expression to aggregate. */
        public function get input():Expression { return _expr; }
        public function set input(e:*):void {
            _expr = Expression.expr(e);
        }
        
        /**
         * @inheritDoc
         */
        public override function get numChildren():int {
            return 1;
        }
        
        /**
         * Creates a new AggregateExpression.
         * @param input the sub-expression to aggregate.
         */
        public function AggregateExpression(input:*) {
            this.input = input;
        }
        
        /**
         * @inheritDoc
         */
        public override function getChildAt(idx:int):Expression
        {
            return idx==0 ? _expr : null;
        }
        
        /**
         * @inheritDoc
         */
        public override function setChildAt(idx:int, expr:Expression):Boolean
        {
            if (idx == 0) {
                _expr = expr;
                return true;
            }
            return false;
        }
        
        // --------------------------------------------------------------------
        
        /**
         * Resets the aggregation computation.
         */ 
        public function reset():void
        {
            // subclasses override this
        }
        
        /**
         * Increments the aggregation computation to include the input value.
         * @param value a value to include within the aggregation.
         */
        public function aggregate(value:Object):void
        {
            // subclasses override this
        }
        
    } // end of class AggregateExpression
}