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);
            }
        }
Esempio n. 2
0
        public override void ApplyLeave(EventBean[] eventsPerStream, Object compositeGroupKey, ExprEvaluatorContext exprEvaluatorContext)
        {
            var evaluateParams = new EvaluateParams(eventsPerStream, false, exprEvaluatorContext);

            for (var i = 0; i < Evaluators.Length; i++)
            {
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggregationGroupedRollupEvalParam(false, _methodParameterValues.Length);
                }
                _methodParameterValues[i] = Evaluators[i].Evaluate(evaluateParams);
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggregationGroupedRollupEvalParam(_methodParameterValues[i]);
                }
            }

            var groupKeyPerLevel = (Object[])compositeGroupKey;

            for (var i = 0; i < groupKeyPerLevel.Length; i++)
            {
                var level    = _rollupLevelDesc.Levels[i];
                var groupKey = groupKeyPerLevel[i];

                AggregationMethodPairRow row;
                if (!level.IsAggregationTop)
                {
                    row = _aggregatorsPerGroup[level.AggregationOffset].Get(groupKey);
                }
                else
                {
                    row = _aggregatorTopGroup;
                }

                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggregationGroupedApplyEnterLeave(false, Aggregators.Length, _accessAggregations.Length, groupKey);
                }

                // The aggregators for this group do not exist, need to create them from the prototypes
                AggregationMethod[] groupAggregators;
                AggregationState[]  groupStates;
                if (row != null)
                {
                    groupAggregators = row.Methods;
                    groupStates      = row.States;
                }
                else
                {
                    groupAggregators = _methodResolutionService.NewAggregators(Aggregators, exprEvaluatorContext.AgentInstanceId, groupKey, GroupKeyBinding, level);
                    groupStates      = _methodResolutionService.NewAccesses(exprEvaluatorContext.AgentInstanceId, _isJoin, _accessAggregations, groupKey, GroupKeyBinding, level);
                    row = new AggregationMethodPairRow(_methodResolutionService.GetCurrentRowCount(groupAggregators, groupStates) + 1, groupAggregators, groupStates);
                    if (!level.IsAggregationTop)
                    {
                        _aggregatorsPerGroup[level.AggregationOffset].Put(groupKey, row);
                    }
                }

                // For this row, evaluate sub-expressions, enter result
                _currentAggregatorMethods = groupAggregators;
                _currentAggregatorStates  = groupStates;
                for (var j = 0; j < Evaluators.Length; j++)
                {
                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().QAggNoAccessEnterLeave(false, j, groupAggregators[j], Aggregators[j].AggregationExpression);
                    }
                    groupAggregators[j].Leave(_methodParameterValues[j]);
                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().AAggNoAccessEnterLeave(false, j, groupAggregators[j]);
                    }
                }

                for (var j = 0; j < _currentAggregatorStates.Length; j++)
                {
                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().QAggAccessEnterLeave(false, j, _currentAggregatorStates[j], _accessAggregations[j].AggregationExpression);
                    }
                    _currentAggregatorStates[j].ApplyLeave(eventsPerStream, exprEvaluatorContext);
                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().AAggAccessEnterLeave(false, j, _currentAggregatorStates[j]);
                    }
                }

                row.DecreaseRefcount();
                if (row.Refcount <= 0)
                {
                    _hasRemovedKey = true;
                    if (!level.IsAggregationTop)
                    {
                        _removedKeys[level.AggregationOffset].Add(groupKey);
                    }
                    _methodResolutionService.RemoveAggregators(exprEvaluatorContext.AgentInstanceId, groupKey, GroupKeyBinding, level);  // allow persistence to remove keys already
                }

                InternalHandleGroupUpdate(groupKey, row, level);
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggregationGroupedApplyEnterLeave(false);
                }
            }
        }
Esempio n. 3
0
        public override void ApplyLeave(EventBean[] eventsPerStream, Object groupByKey, ExprEvaluatorContext exprEvaluatorContext)
        {
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().QAggregationGroupedApplyEnterLeave(false, Aggregators.Length, _accessAggregations.Length, groupByKey);
            }
            AggregationMethodRowAged row = _aggregatorsPerGroup.Get(groupByKey);
            long currentTime             = exprEvaluatorContext.TimeProvider.Time;

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

            // For this row, evaluate sub-expressions, enter result
            var evaluateParams = new EvaluateParams(eventsPerStream, false, exprEvaluatorContext);

            _currentAggregatorMethods = groupAggregators;
            _currentAggregatorStates  = groupStates;
            for (int i = 0; i < Evaluators.Length; i++)
            {
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggNoAccessEnterLeave(false, i, _currentAggregatorMethods[i], Aggregators[i].AggregationExpression);
                }
                Object columnResult = Evaluators[i].Evaluate(evaluateParams);
                groupAggregators[i].Leave(columnResult);
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggNoAccessEnterLeave(false, i, _currentAggregatorMethods[i]);
                }
            }

            for (int i = 0; i < _currentAggregatorStates.Length; i++)
            {
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggAccessEnterLeave(false, i, _currentAggregatorStates[i], _accessAggregations[i].AggregationExpression);
                }
                _currentAggregatorStates[i].ApplyLeave(eventsPerStream, exprEvaluatorContext);
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggAccessEnterLeave(false, i, _currentAggregatorStates[i]);
                }
            }

            row.DecreaseRefcount();
            row.LastUpdateTime = currentTime;
            if (row.Refcount <= 0)
            {
                _removedKeys.Add(groupByKey);
                _methodResolutionService.RemoveAggregators(exprEvaluatorContext.AgentInstanceId, groupByKey, GroupKeyBinding, null);  // allow persistence to remove keys already
            }
            InternalHandleUpdated(groupByKey, row);
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().AAggregationGroupedApplyEnterLeave(false);
            }
        }