Ejemplo n.º 1
0
        public override void SetCurrentAccess(Object groupByKey, int agentInstanceId, AggregationGroupByRollupLevel rollupLevel)
        {
            AggregationMethodRowAged row = _aggregatorsPerGroup.Get(groupByKey);

            if (row != null)
            {
                _currentAggregatorMethods = row.Methods;
                _currentAggregatorStates  = row.States;
            }
            else
            {
                _currentAggregatorMethods = null;
            }

            if (_currentAggregatorMethods == null)
            {
                _currentAggregatorMethods = _methodResolutionService.NewAggregators(Aggregators, agentInstanceId, groupByKey, GroupKeyBinding, null);
                _currentAggregatorStates  = _methodResolutionService.NewAccesses(agentInstanceId, _isJoin, _accessAggregations, groupByKey, GroupKeyBinding, null);
            }

            _currentGroupKey = groupByKey;
        }
Ejemplo n.º 2
0
        public override void ApplyEnter(EventBean[] eventsPerStream, Object groupByKey, ExprEvaluatorContext exprEvaluatorContext)
        {
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().QAggregationGroupedApplyEnterLeave(true, Aggregators.Length, _accessAggregations.Length, groupByKey);
            }
            long currentTime = exprEvaluatorContext.TimeProvider.Time;

            if ((_nextSweepTime == null) || (_nextSweepTime <= currentTime))
            {
                _currentMaxAge           = GetMaxAge(_currentMaxAge);
                _currentReclaimFrequency = GetReclaimFrequency(_currentReclaimFrequency);
                if ((ExecutionPathDebugLog.IsEnabled) && (Log.IsDebugEnabled))
                {
                    Log.Debug("Reclaiming groups older then " + _currentMaxAge + " msec and every " + _currentReclaimFrequency + "msec in frequency");
                }
                _nextSweepTime = currentTime + _currentReclaimFrequency;
                Sweep(currentTime, _currentMaxAge);
            }

            HandleRemovedKeys(); // we collect removed keys lazily on the next enter to reduce the chance of empty-group queries creating empty aggregators temporarily

            AggregationMethodRowAged row = _aggregatorsPerGroup.Get(groupByKey);

            // The aggregators for this group do not exist, need to create them from the prototypes
            AggregationMethod[] groupAggregators;
            AggregationState[]  groupStates;
            if (row == null)
            {
                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);
            }
            else
            {
                groupAggregators = row.Methods;
                groupStates      = row.States;
                row.IncreaseRefcount();
                row.LastUpdateTime = currentTime;
            }

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

            // For this row, evaluate sub-expressions, enter result
            _currentAggregatorMethods = groupAggregators;
            _currentAggregatorStates  = groupStates;
            for (int i = 0; i < Evaluators.Length; i++)
            {
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().QAggNoAccessEnterLeave(true, i, _currentAggregatorMethods[i], Aggregators[i].AggregationExpression);
                }
                Object columnResult = Evaluators[i].Evaluate(evaluateParams);
                groupAggregators[i].Enter(columnResult);
                if (InstrumentationHelper.ENABLED)
                {
                    InstrumentationHelper.Get().AAggNoAccessEnterLeave(true, i, _currentAggregatorMethods[i]);
                }
            }

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

            InternalHandleUpdated(groupByKey, row);
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().AAggregationGroupedApplyEnterLeave(true);
            }
        }
Ejemplo n.º 3
0
 public void InternalHandleUpdated(Object groupByKey, AggregationMethodRowAged row)
 {
     // no action required
 }
Ejemplo n.º 4
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);
            }
        }
Ejemplo n.º 5
0
        public override void ApplyLeave(
            EventBean[] eventsPerStream,
            Object groupByKey,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().QAggregationGroupedApplyEnterLeave(false, base.Aggregators.Length, _accessAggregations.Length, groupByKey);
            }
            var row         = _aggregatorsPerGroup.Get(groupByKey);
            var 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 = AggSvcGroupByUtil.NewAggregators(base.Aggregators);
                groupStates      = AggSvcGroupByUtil.NewAccesses(
                    exprEvaluatorContext.AgentInstanceId, _isJoin, _accessAggregations, groupByKey, null);
                row = new AggregationMethodRowAged(1, currentTime, groupAggregators, groupStates);
                _aggregatorsPerGroup.Put(groupByKey, row);
            }

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

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

            for (var 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);
            }
            InternalHandleUpdated(groupByKey, row);
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().AAggregationGroupedApplyEnterLeave(false);
            }
        }