public override void ApplyLeave(EventBean[] eventsPerStream, Object groupByKey, ExprEvaluatorContext exprEvaluatorContext)
        {
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().QAggregationGroupedApplyEnterLeave(false, Aggregators.Length, 0, groupByKey);
            }
            var row = _aggregatorsPerGroup.Get(groupByKey);

            // The aggregators for this group do not exist, need to create them from the prototypes
            AggregationMethod[] groupAggregators;
            if (row != null)
            {
                groupAggregators = row.Methods;
            }
            else
            {
                groupAggregators = _methodResolutionService.NewAggregators(Aggregators, exprEvaluatorContext.AgentInstanceId, groupByKey, GroupKeyBinding, null);
                row = new AggregationMethodRow(_methodResolutionService.GetCurrentRowCount(groupAggregators, null) + 1, groupAggregators);
                _aggregatorsPerGroup[groupByKey] = row;
            }

            var evaluateParams = new EvaluateParams(eventsPerStream, false, exprEvaluatorContext);

            // For this row, evaluate sub-expressions, enter result
            _currentAggregatorRow = groupAggregators;

            var evaluators       = Evaluators;
            var evaluatorsLength = evaluators.Length;

            for (var ii = 0; ii < evaluatorsLength; ii++)
            {
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggNoAccessEnterLeave(false, ii, groupAggregators[ii], Aggregators[ii].AggregationExpression);
                }
                groupAggregators[ii].Leave(evaluators[ii].Evaluate(evaluateParams));
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggNoAccessEnterLeave(false, ii, groupAggregators[ii]);
                }
            }

            row.DecreaseRefcount();
            if (row.Refcount <= 0)
            {
                _removedKeys.Add(groupByKey);
                _methodResolutionService.RemoveAggregators(exprEvaluatorContext.AgentInstanceId, groupByKey, GroupKeyBinding, null);  // allow persistence to remove keys already
            }
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().AAggregationGroupedApplyEnterLeave(false);
            }
        }
        public override void ApplyEnter(EventBean[] eventsPerStream, Object groupByKey, ExprEvaluatorContext exprEvaluatorContext)
        {
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().QAggregationGroupedApplyEnterLeave(true, Aggregators.Length, 0, groupByKey);
            }
            HandleRemovedKeys();

            // The aggregators for this group do not exist, need to create them from the prototypes
            AggregationMethodRow row;

            AggregationMethod[] groupAggregators;
            if (!_aggregatorsPerGroup.TryGetValue(groupByKey, out row))
            {
                groupAggregators = AggSvcGroupByUtil.NewAggregators(Aggregators);
                row = new AggregationMethodRow(1, groupAggregators);
                _aggregatorsPerGroup[groupByKey] = row;
            }
            else
            {
                groupAggregators = row.Methods;
                row.IncreaseRefcount();
            }

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

            // For this row, evaluate sub-expressions, enter result
            _currentAggregatorRow = groupAggregators;

            var evaluators       = Evaluators;
            var evaluatorsLength = evaluators.Length;

            for (var ii = 0; ii < evaluatorsLength; ii++)
            {
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggNoAccessEnterLeave(true, ii, groupAggregators[ii], Aggregators[ii].AggregationExpression);
                }
                groupAggregators[ii].Enter(evaluators[ii].Evaluate(evaluateParams));
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggNoAccessEnterLeave(true, ii, groupAggregators[ii]);
                }
            }
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().AAggregationGroupedApplyEnterLeave(true);
            }
        }