package flare.query
{
    /**
     * Aggregate (group-by) operator for counting the number of distinct
     * values in a set of values.
     */
    public class Distinct extends AggregateExpression
    {
        private var _map:Object;
        private var _count:int;
        
        /**
         * Creates a new Distinct operator
         * @param input the sub-expression of which to compute the distinct
         *  values
         */
        public function Distinct(input:*) {
            super(input);
        }
        
        /**
         * @inheritDoc
         */
        public override function reset():void
        {
            _map = {};
            _count = 0;
        }
        
        /**
         * @inheritDoc
         */
        public override function eval(o:Object=null):*
        {
            return _count;
        }
        
        /**
         * @inheritDoc
         */
        public override function aggregate(value:Object):void
        {
            value = _expr.eval(value);
            if (_map[value] == undefined) {
                _count++;
                _map[value] = 1;
            }
        }
        
    } // end of class Distinct
}