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 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); } } }
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); } }