public IEnumerator <EventBean> ObtainEnumerator(Viewable parent)
        {
            if (_orderByProcessor == null)
            {
                return(ResultSetAggregateAllEnumerator.New(parent, this, _exprEvaluatorContext));
            }

            // Pull all parent events, generate order keys
            var eventsPerStream = new EventBean[1];
            var outgoingEvents  = new List <EventBean>();
            var orderKeys       = new List <object>();

            var evaluateParams = new EvaluateParams(eventsPerStream, true, _exprEvaluatorContext);

            foreach (var candidate in parent)
            {
                eventsPerStream[0] = candidate;

                object pass = true;
                if (_prototype.OptionalHavingNode != null)
                {
                    pass = _prototype.OptionalHavingNode.Evaluate(evaluateParams);
                }
                if ((pass == null) || (false.Equals(pass)))
                {
                    continue;
                }

                outgoingEvents.Add(_selectExprProcessor.Process(eventsPerStream, true, true, _exprEvaluatorContext));

                var orderKey = _orderByProcessor.GetSortKey(eventsPerStream, true, _exprEvaluatorContext);
                orderKeys.Add(orderKey);
            }

            // sort
            var outgoingEventsArr = outgoingEvents.ToArray();
            var orderKeysArr      = orderKeys.ToArray();
            var orderedEvents     = _orderByProcessor.Sort(outgoingEventsArr, orderKeysArr, _exprEvaluatorContext) ?? EMPTY_EVENT_BEAN_LIST;

            return(orderedEvents.GetEnumerator());
        }
Пример #2
0
        public IEnumerator <EventBean> ObtainIterator(Viewable parent)
        {
            if (_orderByProcessor == null)
            {
                return(ResultSetAggregateAllEnumerator.New(parent, this, _exprEvaluatorContext));
            }

            // Pull all parent events, generate order keys
            EventBean[]       eventsPerStream = new EventBean[1];
            IList <EventBean> outgoingEvents  = new List <EventBean>();
            IList <Object>    orderKeys       = new List <Object>();

            var evaluateParams = new EvaluateParams(eventsPerStream, true, _exprEvaluatorContext);

            foreach (EventBean candidate in parent)
            {
                eventsPerStream[0] = candidate;

                bool?pass = true;
                if (_prototype.OptionalHavingNode != null)
                {
                    pass = (bool?)_prototype.OptionalHavingNode.Evaluate(evaluateParams);
                }
                if ((pass == null) || (!pass.Value))
                {
                    continue;
                }

                outgoingEvents.Add(_selectExprProcessor.Process(eventsPerStream, true, true, _exprEvaluatorContext));

                Object orderKey = _orderByProcessor.GetSortKey(eventsPerStream, true, _exprEvaluatorContext);
                orderKeys.Add(orderKey);
            }

            // sort
            EventBean[] outgoingEventsArr = outgoingEvents.ToArray();
            Object[]    orderKeysArr      = orderKeys.ToArray();
            EventBean[] orderedEvents     = _orderByProcessor.Sort(outgoingEventsArr, orderKeysArr, _exprEvaluatorContext);

            return(((IEnumerable <EventBean>)orderedEvents).GetEnumerator());
        }